From 2483fc902a1a8d9e2b138a069916f33487da30ae Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 4 Aug 2026 18:30:01 -0600 Subject: [PATCH] fix(tools): jr_isolate_all was SILENTLY DELETING asm-label-alias definitions during a repartition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ROOT CAUSE (byte-witnessed, P30 S38 — the fifth tool with this same blindness). A function banked under the §37/§73 DEFINITION-SIDE ASM-LABEL ALIAS form is spelled with a private C identifier and bound to its real symbol by a GNU asm label: void aF8018A860(s32, s16 *, u8 *, u8 *) __asm__("func_80183AF8"); <- decl, stays in preamble void aF8018A860(s32, s16 *, u8 *, u8 *) { ... } <- THIS emits func_80183AF8 overlay_src_split.addr_of() resolves `func_` arithmetically and everything else through `syms`. `aF8018A860` matches NEITHER, so it returned None — and partition() keeps only items with a resolved address, so the definition was dropped from EVERY region. The file was then rewritten without it and nothing said so. One carve of ov_SC02_028 deleted the definitions emitting BOTH func_80183AF8 and func_80184268; the overlay stopped linking with `undefined reference`, and six wave-6 drafts were written off against that as a plumbing/compiler wall. TWO FIXES: - CAUSE: overlay_src_split now builds an asm-label alias map from the source and resolves a definition through its EMITTED SYMBOL rather than its C name (verified: aF8018A860 -> 0x80183AF8, aF8018AFD0 -> 0x80184268 — exactly the two symbols the link was missing). - SILENCE: partition() and jr_isolate_all._partition() now REFUSE to rewrite a file when any construct's address does not resolve (R32), instead of discarding it. That guard alone would have surfaced this the first time it happened. RESULT: 3 of the 6 alias-class wave-6 drafts bank immediately, for ZERO agent tokens — func_801884D8 (137 ins) · func_80180B04 (251) · func_801380E0 (438). R22 clean-fleet 140/140. The other 3 (the three LARGEST: 557/513/710 ins) have a second, size-correlated cause — open. NOTE FOR THE FLYWHEEL: family_remap._alias_decl_for ALREADY handled this exact form, and its docstring records the identical lesson ("that blindness was the WHOLE of the h_seq sweep's 137 'no matched unit' skips. The tool, not the compiler (R35)"). The fix was never propagated. The alias form needs ONE shared oracle, the way §134 comment-masking ended up on cdecl._mask — five tools have now independently rediscovered it. --- .run/w6_alias_repro.py | 88 + config/overlays.mk | 6 +- config/splat.ov_SC02_028.yaml | 3 + config/splat.ov_SC06_020.yaml | 3 + config/splat.ov_SC07_006.yaml | 2 + src/ov_SC02_028/ov_SC02_028_jr_8017D898.c | 1997 -------- src/ov_SC02_028/ov_SC02_028_jr_801884D8.c | 4998 +++++++++++++++++++++ src/ov_SC06_020/ov_SC06_020_jr_8017C24C.c | 1606 ------- src/ov_SC06_020/ov_SC06_020_jr_80180B04.c | 4508 +++++++++++++++++++ src/ov_SC07_006/ov_SC07_006_jr_80135D20.c | 729 --- src/ov_SC07_006/ov_SC07_006_jr_801380E0.c | 1662 +++++++ tools/jr_isolate_all.py | 11 + tools/overlay_src_split.py | 44 +- 13 files changed, 11318 insertions(+), 4339 deletions(-) create mode 100644 .run/w6_alias_repro.py create mode 100644 src/ov_SC02_028/ov_SC02_028_jr_801884D8.c create mode 100644 src/ov_SC06_020/ov_SC06_020_jr_80180B04.c create mode 100644 src/ov_SC07_006/ov_SC07_006_jr_801380E0.c diff --git a/.run/w6_alias_repro.py b/.run/w6_alias_repro.py new file mode 100644 index 0000000000..33fa6910a0 --- /dev/null +++ b/.run/w6_alias_repro.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Reproduce the wave-6 ALIAS-CLASS link failure and INSPECT the post-carve tree, then revert. + +harvest_verify does carve -> build -> revert, so the interesting state (where the asm-label alias +definition ended up relative to its callers) is destroyed before anyone can look at it. This does +the same carve, dumps the evidence, builds to capture the real linker error, and reverts. + +READ THE EVIDENCE, DO NOT GUESS: the hypothesis under test is that `jr_isolate_all` repartitions the +TU and separates the call site of `func_` from the DEFINITION that emits it — which in this +overlay is a §37/§124 definition-side asm-label alias: + void aF8018A860(...) __asm__("func_80183AF8"); /* decl binds the symbol */ + void aF8018A860(...) { ... } /* THIS is what emits func_80183AF8 */ +A tool that moves code by ADDRESS cannot see that the symbol emitted at 0x80183AF8 is spelled +`aF8018A860` in the source. + +Usage: w6_alias_repro.py +""" +import sys, os, re, glob, subprocess, shutil + +OV, FN, CALLEE = sys.argv[1], sys.argv[2], sys.argv[3] +PY = '.venv/bin/python' +sys.path.insert(0, 'tools') +import corpus + + +def sh(cmd, **kw): + return subprocess.run(cmd, capture_output=True, text=True, **kw) + + +def snapshot(tag): + print(f"\n----- {tag} -----") + files = sorted(glob.glob(f'src/{OV}/*.c')) + print(f" TUs in src/{OV}/: {len(files)}") + for f in files: + t = open(f).read() + defs = len(re.findall(r'__asm__\s*\(\s*"' + re.escape(CALLEE) + r'"\s*\)', t)) + refs = len(re.findall(r'\b' + re.escape(CALLEE) + r'\b', t)) + stub = len(re.findall(r'INCLUDE_ASM\([^)]*\b' + re.escape(CALLEE) + r'\b', t)) + if defs or refs or stub: + print(f" {os.path.basename(f):<46} asm-label-binds={defs} textual-refs={refs} INCLUDE_ASM={stub}") + + +st = corpus.stubs(OV) +addr = int(FN.split('_')[1], 16) +rec = st.get(addr) +if not rec: + sys.exit(f"{FN} is not a live stub in {OV}") +tu, stub_line = rec.path, f'INCLUDE_ASM("{rec.asm_dir}", {rec.symbol});' +draft = open(f'.run/w6/{OV}/{FN}.c').read() + +orig = open(tu).read() +assert orig.count(stub_line) == 1, "stub line not unique" +snapshot("BEFORE the carve (HEAD)") + +print(f"\n[1] splicing the draft over the stub in {tu}") +open(tu, 'w').write(orig.replace(stub_line, draft, 1)) + +print(f"[2] jtbl_carve {OV} --func {FN}") +r = sh([PY, 'tools/jtbl_carve.py', OV, '--func', FN]) +out = (r.stdout or '') + (r.stderr or '') +print(f" rc={r.returncode} {out.strip().splitlines()[-1][:130] if out.strip() else ''}") + +if r.returncode: + print(f"[3] carve refused -> jr_isolate_all --only {FN} (the §61b ladder: isolate WITH the body spliced)") + r2 = sh([PY, 'tools/jr_isolate_all.py', OV, '--only', FN]) + print(f" isolate rc={r2.returncode}") + r3 = sh(['make', '--no-print-directory', 'extract', f'BINARY={OV}']) + print(f" extract rc={r3.returncode}") + r = sh([PY, 'tools/jtbl_carve.py', OV, '--func', FN]) + print(f" carve retry rc={r.returncode}") + sh(['make', '--no-print-directory', 'extract', f'BINARY={OV}']) + +snapshot("AFTER the carve/isolation — WHERE DID THE ALIAS DEFINITION GO?") + +print(f"\n[4] make build BINARY={OV} — the real linker error") +rb = sh(['make', 'build', f'BINARY={OV}']) +allout = (rb.stdout or '') + (rb.stderr or '') +hits = [l for l in allout.splitlines() + if 'undefined reference' in l or 'multiple definition' in l or re.search(r'\.[ch]:\d+.*error', l)] +print(f" build rc={rb.returncode}, {len(hits)} hard diagnostic line(s):") +for l in hits[:10]: + print(" ", l.strip()[:190]) + +print("\n[5] reverting") +sh(['git', 'checkout', '--', f'src/{OV}', 'config']) +sh(['git', 'clean', '-fdq', f'src/{OV}']) +sh(['make', '--no-print-directory', 'extract', f'BINARY={OV}']) +print(" reverted + re-extracted (R22 corollary: a reverted config needs a re-extract)") diff --git a/config/overlays.mk b/config/overlays.mk index 29c91e6c47..160d7d70bd 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -1114,7 +1114,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.o,ov_SC02_028_jr_8012ACE0.o,tail2.data.o,ov_SC02_028_jr_80135888.o,tail3.data.o,ov_SC02_028_jr_80135A4C.o,tail4.data.o,ov_SC02_028_jr_80135D20.o,tail5.data.o,ov_SC02_028_jr_801380E0.o,ov_SC02_028_o0c.o,tail6.data.o,ov_SC02_028_jr_8013F350.o,tail7.data.o,ov_SC02_028_jr_8013FFD8.o,tail8.data.o,ov_SC02_028_jr_80140608.o,tail9.data.o,ov_SC02_028_jr_8015444C.o,ov_SC02_028_jr_80154C24.o,ov_SC02_028_jr_801588CC.o,ov_SC02_028_jr_80159C84.o,tail10.data.o,ov_SC02_028_jr_8015A3C8.o,tail11.data.o,ov_SC02_028_jr_8015AE2C.o,tail12.data.o,ov_SC02_028_jr_8015C32C.o,tail13.data.o,ov_SC02_028_jr_8016AB6C.o,tail14.data.o,ov_SC02_028_jr_80171B4C.o,ov_SC02_028_jr_801734BC.o,tail15.data.o,ov_SC02_028_jr_801789AC.o,ov_SC02_028_jr_80178D40.o,tail16.data.o,ov_SC02_028_jr_8017A4AC.o,tail17.data.o,ov_SC02_028_jr_8017AE2C.o,ov_SC02_028_jr_8017D898.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_028_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_028.o,ov_SC02_028_jr_8012ACE0.o,tail2.data.o,ov_SC02_028_jr_80135888.o,tail3.data.o,ov_SC02_028_jr_80135A4C.o,tail4.data.o,ov_SC02_028_jr_80135D20.o,tail5.data.o,ov_SC02_028_jr_801380E0.o,ov_SC02_028_o0c.o,tail6.data.o,ov_SC02_028_jr_8013F350.o,tail7.data.o,ov_SC02_028_jr_8013FFD8.o,tail8.data.o,ov_SC02_028_jr_80140608.o,tail9.data.o,ov_SC02_028_jr_8015444C.o,ov_SC02_028_jr_80154C24.o,ov_SC02_028_jr_801588CC.o,ov_SC02_028_jr_80159C84.o,tail10.data.o,ov_SC02_028_jr_8015A3C8.o,tail11.data.o,ov_SC02_028_jr_8015AE2C.o,tail12.data.o,ov_SC02_028_jr_8015C32C.o,tail13.data.o,ov_SC02_028_jr_8016AB6C.o,tail14.data.o,ov_SC02_028_jr_80171B4C.o,ov_SC02_028_jr_801734BC.o,tail15.data.o,ov_SC02_028_jr_801789AC.o,ov_SC02_028_jr_80178D40.o,tail16.data.o,ov_SC02_028_jr_8017A4AC.o,tail17.data.o,ov_SC02_028_jr_8017AE2C.o,ov_SC02_028_jr_8017D898.o,tail18.data.o,ov_SC02_028_jr_801884D8.o,tail19.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC02_028/ov_SC02_028.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC02_028/ov_SC02_028_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0 build/src/ov_SC02_028/ov_SC02_028_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -4288,7 +4288,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.o,ov_SC06_020_jr_8012ACE0.o,tail2.data.o,ov_SC06_020_jr_80135888.o,tail3.data.o,ov_SC06_020_jr_80135A4C.o,tail4.data.o,ov_SC06_020_jr_80135D20.o,tail5.data.o,ov_SC06_020_jr_801380E0.o,ov_SC06_020_o0c.o,tail6.data.o,ov_SC06_020_jr_8013F350.o,tail7.data.o,ov_SC06_020_jr_8013FFD8.o,tail8.data.o,ov_SC06_020_jr_80140608.o,tail9.data.o,ov_SC06_020_jr_8015444C.o,ov_SC06_020_jr_80154C24.o,ov_SC06_020_jr_801588CC.o,ov_SC06_020_jr_80159C84.o,tail10.data.o,ov_SC06_020_jr_8015A3C8.o,tail11.data.o,ov_SC06_020_jr_8015AE2C.o,tail12.data.o,ov_SC06_020_jr_8015C32C.o,tail13.data.o,ov_SC06_020_jr_8016AB6C.o,tail14.data.o,ov_SC06_020_jr_80171B4C.o,ov_SC06_020_jr_801734BC.o,tail15.data.o,ov_SC06_020_jr_801789AC.o,ov_SC06_020_jr_80178D40.o,tail16.data.o,ov_SC06_020_jr_8017A4AC.o,tail17.data.o,ov_SC06_020_jr_8017AE2C.o,ov_SC06_020_jr_8017C24C.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_020_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_020.o,ov_SC06_020_jr_8012ACE0.o,tail2.data.o,ov_SC06_020_jr_80135888.o,tail3.data.o,ov_SC06_020_jr_80135A4C.o,tail4.data.o,ov_SC06_020_jr_80135D20.o,tail5.data.o,ov_SC06_020_jr_801380E0.o,ov_SC06_020_o0c.o,tail6.data.o,ov_SC06_020_jr_8013F350.o,tail7.data.o,ov_SC06_020_jr_8013FFD8.o,tail8.data.o,ov_SC06_020_jr_80140608.o,tail9.data.o,ov_SC06_020_jr_8015444C.o,ov_SC06_020_jr_80154C24.o,ov_SC06_020_jr_801588CC.o,ov_SC06_020_jr_80159C84.o,tail10.data.o,ov_SC06_020_jr_8015A3C8.o,tail11.data.o,ov_SC06_020_jr_8015AE2C.o,tail12.data.o,ov_SC06_020_jr_8015C32C.o,tail13.data.o,ov_SC06_020_jr_8016AB6C.o,tail14.data.o,ov_SC06_020_jr_80171B4C.o,ov_SC06_020_jr_801734BC.o,tail15.data.o,ov_SC06_020_jr_801789AC.o,ov_SC06_020_jr_80178D40.o,tail16.data.o,ov_SC06_020_jr_8017A4AC.o,tail17.data.o,ov_SC06_020_jr_8017AE2C.o,ov_SC06_020_jr_8017C24C.o,tail18.data.o,ov_SC06_020_jr_80180B04.o,tail19.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC06_020/ov_SC06_020.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC06_020/ov_SC06_020_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0 build/src/ov_SC06_020/ov_SC06_020_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -4747,7 +4747,7 @@ ov_SC07_006_ELF := $(ov_SC07_006_OUT).elf ov_SC07_006_MAPFILE := $(ov_SC07_006_OUT).map ov_SC07_006_LD_SCRIPT := $(ov_SC07_006_OUT).ld ov_SC07_006_SPLAT_YAML := config/splat.ov_SC07_006.yaml -ov_SC07_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_006.o,ov_SC07_006_jr_80131340.o,tail2.data.o,ov_SC07_006_jr_80135888.o,tail3.data.o,ov_SC07_006_jr_80135A4C.o,tail4.data.o,ov_SC07_006_jr_80135D20.o,tail5.data.o,ov_SC07_006_o0c.o,tail6.data.o,ov_SC07_006_jr_8013F350.o,tail7.data.o,ov_SC07_006_jr_8014032C.o,tail8.data.o,ov_SC07_006_jr_80140608.o,tail9.data.o,ov_SC07_006_jr_8015444C.o,ov_SC07_006_jr_80154C24.o,ov_SC07_006_jr_801588CC.o,ov_SC07_006_jr_80159C84.o,tail10.data.o,ov_SC07_006_jr_8015A3C8.o,tail11.data.o,ov_SC07_006_jr_8015B950.o,tail12.data.o,ov_SC07_006_jr_8015C32C.o,tail13.data.o,ov_SC07_006_jr_8016AE5C.o,tail14.data.o,ov_SC07_006_jr_80171B4C.o,tail15.data.o,ov_SC07_006_jr_801789AC.o,ov_SC07_006_jr_80179B74.o,tail16.data.o,ov_SC07_006_jr_8017AE2C.o,ov_SC07_006_jr_8017BEBC.o,tail17.data.o,ov_SC07_006_jr_80183814.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_006.o,ov_SC07_006_jr_80131340.o,tail2.data.o,ov_SC07_006_jr_80135888.o,tail3.data.o,ov_SC07_006_jr_80135A4C.o,tail4.data.o,ov_SC07_006_jr_80135D20.o,tail5.data.o,ov_SC07_006_jr_801380E0.o,ov_SC07_006_o0c.o,tail6.data.o,ov_SC07_006_jr_8013F350.o,tail7.data.o,ov_SC07_006_jr_8014032C.o,tail8.data.o,ov_SC07_006_jr_80140608.o,tail9.data.o,ov_SC07_006_jr_8015444C.o,ov_SC07_006_jr_80154C24.o,ov_SC07_006_jr_801588CC.o,ov_SC07_006_jr_80159C84.o,tail10.data.o,ov_SC07_006_jr_8015A3C8.o,tail11.data.o,ov_SC07_006_jr_8015B950.o,tail12.data.o,ov_SC07_006_jr_8015C32C.o,tail13.data.o,ov_SC07_006_jr_8016AE5C.o,tail14.data.o,ov_SC07_006_jr_80171B4C.o,tail15.data.o,ov_SC07_006_jr_801789AC.o,ov_SC07_006_jr_80179B74.o,tail16.data.o,ov_SC07_006_jr_8017AE2C.o,ov_SC07_006_jr_8017BEBC.o,tail17.data.o,ov_SC07_006_jr_80183814.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC07_006/ov_SC07_006.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0xdc build/src/ov_SC07_006/ov_SC07_006_jr_80131340.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC07_006/ov_SC07_006_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 diff --git a/config/splat.ov_SC02_028.yaml b/config/splat.ov_SC02_028.yaml index 03e3799cee..2f5ad67e64 100644 --- a/config/splat.ov_SC02_028.yaml +++ b/config/splat.ov_SC02_028.yaml @@ -121,6 +121,7 @@ segments: - [0x52354, c, ov_SC02_028_jr_8017A4AC] - [0x52cd4, c, ov_SC02_028_jr_8017AE2C] - [0x55740, c, ov_SC02_028_jr_8017D898] + - [0x60380, c, ov_SC02_028_jr_801884D8] - [0x632a0, data, tail] - [0xa87e0, .rodata, ov_SC02_028] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa88bc, .rodata, ov_SC02_028_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) @@ -164,6 +165,8 @@ segments: - [0xa9900, .rodata, ov_SC02_028_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa9914, .rodata, ov_SC02_028_jr_8017D898] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa9934, data, tail18] + - [0xa9968, .rodata, ov_SC02_028_jr_801884D8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa9980, data, tail19] - [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_SC06_020.yaml b/config/splat.ov_SC06_020.yaml index fec7339347..ae9e5c7187 100644 --- a/config/splat.ov_SC06_020.yaml +++ b/config/splat.ov_SC06_020.yaml @@ -121,6 +121,7 @@ segments: - [0x52354, c, ov_SC06_020_jr_8017A4AC] - [0x52cd4, c, ov_SC06_020_jr_8017AE2C] - [0x540f4, c, ov_SC06_020_jr_8017C24C] + - [0x589ac, c, ov_SC06_020_jr_80180B04] - [0x5ceb8, data, tail] - [0x9001c, .rodata, ov_SC06_020] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x900f8, .rodata, ov_SC06_020_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) @@ -164,6 +165,8 @@ segments: - [0x9113c, .rodata, ov_SC06_020_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x91150, .rodata, ov_SC06_020_jr_8017C24C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x91184, data, tail18] + - [0x91268, .rodata, ov_SC06_020_jr_80180B04] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9127c, data, tail19] - [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_SC07_006.yaml b/config/splat.ov_SC07_006.yaml index 526f5fda9d..9fb1bbb838 100644 --- a/config/splat.ov_SC07_006.yaml +++ b/config/splat.ov_SC07_006.yaml @@ -98,6 +98,7 @@ segments: - [0xd730, c, ov_SC07_006_jr_80135888] - [0xd8f4, c, ov_SC07_006_jr_80135A4C] - [0xdbc8, c, ov_SC07_006_jr_80135D20] + - [0xff88, c, ov_SC07_006_jr_801380E0] - [0x13410, c, ov_SC07_006_o0c] - [0x14834, c, ov_SC07_006_jr_8013C98C] - [0x171f8, c, ov_SC07_006_jr_8013F350] @@ -127,6 +128,7 @@ segments: - [0xcbc20, data, tail4] - [0xcbc24, .rodata, ov_SC07_006_jr_80135D20] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xcbc68, data, tail5] + - [0xcbc74, .rodata, ov_SC07_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xcbcd8, .rodata, ov_SC07_006_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xcbe5c, data, tail6] - [0xcc2e4, .rodata, ov_SC07_006_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c index a60d50e5b6..502584cb49 100644 --- a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c +++ b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c @@ -6633,2000 +6633,3 @@ void func_80188354(void *a0) { } } } - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_801884D8); - - -/* func_801886FC — ov_SC02_026 / ov_SC02_026_jr_8017C180.c MATCH (237 ins) - * - * §136c SIBLING-FIRST provenance (nothing here was derived from the .s that could be copied): - * - the func_8004787C / func_80047948 / func_80133784 trig+collide block is copied VERBATIM - * from the already-banked SAME-TU sibling func_80183B04 (TU:4468), including the - * `s32 r; r = 0x30;` non-const multiplier (T1) and the `V8_801886FC {u16 x,y,z,w}` locals. - * - the RotTransPers + positional-sound block follows the byte-proven RTP_SND() macro in - * src/ov_SC06_030/ov_SC06_030_jr_8017C8D0.c:3480 — in particular the $a0-PINNED SCOPES on - * &D_800AF648, which rematerialise the lui/addiu before EACH call instead of letting CSE - * hoist the address into a callee-saved pseudo. - * - the `*(u16*)(*(s32*)(a0+0x20)+0x12) = *(u16*)(...) + d;` accumulate form is copied from - * the SAME-TU sibling func_80180C80 (TU:3936). - * - * THE FOUR LEVERS THAT CLOSED IT (each one MOVED the count; recorded for the cookbook): - * - * 1. §136 L1 — `r = 0x30` MUST BE ITS OWN LOCAL, and the two func_8012B608 results must be - * per-arm block-scoped locals (`s32 d`). Sharing one `s32 r` across all three sites makes - * it a GLOBAL allocno; as a BLOCK-LOCAL one it is handed $s0 by local-alloc (which runs - * BEFORE global-alloc), which then forces the actor — it conflicts with r — onto $s1 and - * lets `anim` (which does not conflict) take $s0. One shared local ⇒ $s0/$s1 swapped - * across the ENTIRE function (98 mismatches). - * - * 2. BLKmode STACK SLOTS ARE ROUNDED TO 8. `u16 sxy[2]` (4 bytes) occupies EIGHT bytes and - * pushed z/flag from sp+0x4C/0x50 to sp+0x50/0x54. A scalar `s32 sxy` read through - * `*(u16 *)&sxy` keeps the 4-byte slot. (Same reason the RTP_SND sibling packs its - * sxy/z/flag into ONE struct.) `s32 mv[4]` + `V8_801886FC pad[2]` are the 0x10..0x2F filler that - * makes vars = 0x48 ⇒ frame 0x68. - * - * 3. §21 ZERO-BYTE RE-TIE on `vol`. Both magic-multiplies write the same match_scratch, so - * sched1 (the PRE-reload pass — verified with -fno-schedule-insns/-insns2) is free to swap - * them and always hoisted the PAN multiply first, inverting the whole tail schedule and - * losing the mfhi→mult hazard nop. Source statement order does NOT move it (9 spellings - * swept, all identical); only the re-tie does. Worth +2 ins and 33 mismatches. - * - * 4. REUSE ONE VARIABLE FOR X AND PAN. gcc-2.7.2 has no live-range splitting, so one C local - * == one hard register: writing `sx = (sx + 0xA0) / 0x14;` (instead of a fresh `pan`) is - * what keeps the pan field in $a2 — a separate `pan` local is a fresh allocno and takes the - * dying $v1 instead. Register PINS on `pan` made it WORSE (6 → 10): a local `register` - * var is the hard reg for its whole range and evicts the block's temps. Only `av` needed - * a pin ($a1). - * Sub-lever: `pan = pan << 8;` must be an IN-PLACE statement (`sll $a2,$a2,8`), not - * `(pan << 8)` in the expression — reorg can only steal the shift into the bne delay slot - * when it is dead on the fall-through, i.e. when dest == src. That is the last +1 ins. - * Sub-lever: the OR must be spelled `vol | (0x3000 | sx)`. fold's `associate:` rewrites - * `(VAR|CON)|ARG1` to `(CON|ARG1)|VAR`, which is what puts `ori ...,0x3000` on VOL and the - * plain `or` on the pan field — and this nesting is the only one of six spellings that - * also gets the commutative `or`'s operand order right. - * - * DECLARATION SURFACE (RE-AUDITED against the WHOLE TU — above AND below the splice point). - * The first audit only looked ABOVE the INCLUDE_ASM at TU:4680 and wrongly concluded that - * func_8012BE98 / func_8012B744 / func_8012BD3C / RotTransPers / D_800AF648 "appear nowhere". - * They are all declared by the banked sibling func_8018389C at TU:4846-4857, i.e. BELOW the - * splice, and cc1 reports only the FIRST conflict — so the byte-correct body was refused with - * "conflicting types for func_8012BE98 / func_8012B744". - * Every symbol below now carries the TU's ONE existing spelling VERBATIM; where the type - * disagreed with what this body wants, the disagreement is pushed to a cast at the USE site - * (lever A), which is zero-byte — re-verified MATCH (237 ins) after the change. - * - * copied VERBATIM from their existing TU spellings — - * func_8012A828 (TU:3527 et al), func_8012B608 (4163/4240/4848), - * func_8012B1B4 (4164/4241/4697/4849), func_8012CBA4 (4343/4699/4850), - * func_8004787C (2206/4700), func_80047948 (2205/4701), func_80133784 (599/4702), - * func_8002D4C8 (59/4855), func_8004914C / func_800491AC (2646/2647/4852/4853), - * RotTransPers (4854/5017), D_800AF648 (4857/5025), D_801BBE74 (5378), - * func_8012BD3C (4851), - * func_8012BE98 (4846, `extern void func_8012BE98(s32 a0, u16 *a1)`) <- CONFORMED, - * func_8012B744 (4847, `extern s32 func_8012B744(void *a0, void *a1)`) <- CONFORMED. - * USE-SITE casts that absorb the two conformed types (same idiom as the sibling at TU:4876) — - * ((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)anim) -- void-declared, returns s32 - * func_8012B744((void *)(a0 + 4), (void *)anim) -- s32 args -> void * params - * NOT declared anywhere in the TU (so this form is free) — D_801BB7E4 only. - * D_801BB7E4 is a real dlabel in asm/ov_SC02_026/data/tail.data.s:60402. - * func_801886FC itself has NO prototype anywhere in the TU or in any included header (only - * the INCLUDE_ASM at 4680), so no §37/§124 asm-label alias is needed on the defined symbol. - * The TU includes ../shared/engine_core.h but expands ZERO DEFINE_func_*()/DEFINE_data_*() - * macros (verified by grep), so that header contributes no file-scope declaration here. - * The conformed func_8012B744 type is also the fleet-dominant one (engine_core.h:3723) and - * RotTransPers' is the one engine_core.h:108 uses, so both stay compatible if a macro is - * ever spliced in. - */ - -extern void func_8012A828(s32 a0, s32 a1); -extern void func_8012BE98(s32 a0, u16 *a1); -extern s32 func_8012B744(void *a0, void *a1); -extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80133784(s32 a0, void *a1, s32 a2); -extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); -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_801886FC(s32 a0) { - - extern u8 D_800AF648; - extern u8 D_801BBE74[]; - extern u8 D_801BB7E4[]; - typedef struct { - u16 x, y, z, w; - } V8_801886FC; - s32 mv[4]; /* sp+0x10 : the 4-word block handed to func_8012B1B4 */ - V8_801886FC pad[2]; /* sp+0x20 : gcc's own area (vars must be 0x48 for a 0x68 frame) */ - V8_801886FC sp30; /* sp+0x30 : func_80133784 arg1 */ - V8_801886FC sp38; /* sp+0x38 : func_80133784 arg2 */ - s16 v[4]; /* sp+0x40 : RotTransPers arg0 */ - s32 sxy; /* sp+0x48 : DVECTOR — see lever 2, a u16[2] here costs 8 bytes */ - s32 z; /* sp+0x4C */ - s32 flag; /* sp+0x50 */ - s32 anim; - s32 r; - s32 t; - - if (*(u16 *)(a0 + 0x72) & 0x4000) { - func_8012A828(a0, (s32)D_801BBE74); - *(s16 *)(a0 + 0xFE) = 0; - } - - anim = a0 + 0x88; - *(u16 *)(a0 + 0xFC) = *(u16 *)(a0 + 0xFC) + 1; - if (((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)anim) >= 0x1000) { - s32 d = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), - func_8012B744((void *)(a0 + 4), (void *)anim), 0x20); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + d; - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; - } - - mv[0] = 0; - mv[1] = 0; - mv[2] = -(*(s16 *)(a0 + 0xFC) << 17) / 0x18; - func_8012B1B4(a0, (s32)mv); - - if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { - s32 d; - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - d = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), - func_8012B744((void *)(a0 + 4), (void *)anim), 0x20); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + d; - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; - } - - t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - r = 0x30; - sp30.x = *(u16 *)(a0 + 0x6) - ((t * r) >> 12); - sp30.y = *(u16 *)(a0 + 0xA) - 0x20; - t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - sp30.z = *(u16 *)(a0 + 0xE) - ((t * r) >> 12); - sp38.x = sp30.x; - sp38.y = sp30.y + 0x60; - sp38.z = sp30.z; - - if ((func_80133784(1, &sp30, (s32)&sp38) & 0x6000) == 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - - if (*(s16 *)(a0 + 0xFE) == 0 && func_8012BD3C(a0, 0x200, 0x40000) == 1) { - func_8012A828(a0, (s32)D_801BB7E4); - *(s16 *)(a0 + 0x2) = 2; - v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); - v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); - v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); - /* $a0-pinned scopes: rematerialise &D_800AF648 (lui/addiu) before EACH call */ - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } - RotTransPers((s32)v, (s32)&sxy, &z, &flag); - if (flag >= 0 && (u32)((*(u16 *)&sxy + 0x9F) & 0xFFFF) < 0x13F - && (u32)((*((u16 *)&sxy + 1) + 0x77) & 0xFFFF) < 0xEF) { - s32 sx; /* screen X, then REUSED as the pan field */ - register s32 av __asm__("$5"); /* |X| — the one pin that helped */ - s32 vol; - sx = (s16)*(u16 *)&sxy; - av = sx; - if (sx < 0) { - av = -sx; - } - vol = ((0xA0 - av) * 0x7F) / 0xA0; - /* lever 3: sched1 otherwise hoists the PAN multiply ahead of this one */ - __asm__("" : "=r"(vol) : "0"(vol)); - sx = (sx + 0xA0) / 0x14; - if (sx == 0x10) { - sx = 0xF; - } - sx = sx << 8; /* in place, so reorg can steal it */ - func_8002D4C8(0xA9B, (vol | (0x3000 | sx)) & 0xFFFF); - } - } - - if (*(s16 *)(a0 + 0xFC) == 0x18) { - *(s16 *)(a0 + 0xFC) = 0; - } -} - - - -/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c): - * func_8012B1B4 TU:3931/4008/4455/4529 - * func_8012B8E4 TU:4456/4528 (not declared above the splice; same form) - * func_8012CBA4 TU:4110/4457 (void return -> cast at the use site) - * func_8004787C TU:2206/3652/4190/4458 - * func_80047948 TU:2205/3651/4459 - * func_80133784 TU:599/855/4460 - * func_8012BCCC TU:3928/4005/4461 - * func_8012BDBC TU:4462/5984 - * func_8012A828 TU:3527/3810/…/4463 (23 decls, all this form) - * rand TU:957/4154/4189/4214/4622 - * D_801BC97C TU:4800/5275/5298 as `extern u8 D_801BC97C[]` - * D_801BC774 / D_801BC0F4 appear nowhere else in the TU; same canonical form. */ -extern void func_8012B1B4(s32 a0, s32 a1); -extern s32 func_8012B8E4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80133784(s32 a0, void *a1, s32 a2); -extern s32 func_8012BCCC(s32 a0); -extern s32 func_8012BDBC(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, s32 a1); -extern s32 rand(void); - -void func_80188AB0(s32 a0) { - - extern u8 D_801BC774[]; - extern u8 D_801BC0F4[]; - extern u8 D_801BC97C[]; - typedef struct { - u16 x, y, z, w; - } V8_80188AB0; - s32 sp10[4]; - V8_80188AB0 pad[2]; - V8_80188AB0 sp30; - V8_80188AB0 sp38; - s32 t; - s32 r; - s32 v; - - *(s16 *)(a0 + 0xFC) = *(u16 *)(a0 + 0xFC) + 1; - sp10[0] = 0; - sp10[1] = 0; - sp10[2] = (*(s16 *)(a0 + 0xFC) * -0x20000) / 0x24; - func_8012B1B4(a0, (s32)sp10); - - *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; - - if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - - v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - r = 0x30; - sp30.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12); - sp30.y = *(u16 *)(a0 + 0xA) - 0x20; - v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - sp30.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12); - sp38.x = sp30.x; - sp38.y = sp30.y + 0x60; - sp38.z = sp30.z; - - if ((func_80133784(1, &sp30, (s32)&sp38) & 0x6000) == 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - - t = func_8012BCCC(a0); - if (t < 0x1001) { - if (func_8012BDBC(a0, 0x200) == 1) { - s32 s; - if ((rand() & 3) == 0) { - func_8012A828(a0, (s32)D_801BC774); - s = 0x5; - } else { - func_8012A828(a0, (s32)D_801BC0F4); - s = 0xF; - } - *(s16 *)(a0 + 0x2) = s; - } - } - if (t > 0x40000) { - func_8012A828(a0, (s32)D_801BC97C); - *(s16 *)(a0 + 0x2) = 1; - *(s16 *)(a0 + 0xFC) = 0; - *(s16 *)(a0 + 0xFE) = 1; - } - if (*(s16 *)(a0 + 0xFC) == 0x24) { - *(s16 *)(a0 + 0xFC) = 0; - } -} - - - -/* func_80188CF0 — ov_SC02_026 jr_8017C180 family exemplar (15 members). - * - * §136c sibling-first: the RTP + positional-sound tail is the byte-proven - * RTP_SND block from src/ov_SC06_030/ov_SC06_030_jr_8017C8D0.c:3480 - * (func_8017E120) — `u16 sxy[2]`, the `(u32)((sxy[i] + K) & 0xFFFF) < N` - * range tests, the explicit `(s16)sxy[0]` sign-extension (sll/sra off the - * already-loaded lhu), and the $a0-pinned scopes that REMATERIALISE - * &D_800AF648 per call instead of letting CSE hoist it into a callee-saved - * register (which would shove the actor out of $s0). - * - * The head (func_8012B608 accumulate + &0xFFF) copies the form banked at - * TU:3941 (func_80180C80) / TU:4478 (func_80183B04). Head + RTP were right on - * the first compile (115/154); the panner tail took SIX levers, each measured: - * - * 1. FRAME PADDING (idiom 6). Locals start at sp+0x10 (the o32 outgoing-arg - * area) but the RTP block is at sp+0x20, so 16 bytes of padding precede it. - * It must be an AGGREGATE — a scalar becomes a pseudo and vanishes; only - * assign_stack_local aggregates size the frame. vars 0x28 => frame 0x48. - * - * 2. THE abs TESTS `x`, NOT `ax`. Target is - * bgez $a2,L / addu $a1,$a2,$zero (DELAY SLOT) / negu $a1,$a2 / L: - * i.e. `ax = x; if (x < 0) ax = -x;`. The textbook `if (ax < 0) ax = -ax;` - * makes the branch DEPEND on the copy, so reorg cannot sink `move ax,x` - * into the delay slot: it emits the copy first and fills the slot with the - * divide magic's `lui` (12 off). `__builtin_abs` is the WRONG lever here — - * it is one abssi2 insn, the block never splits, and the whole divide pair - * re-schedules (22 off). - * - * 3. $a1-PIN ON THE abs RESULT (§40 / ov_SC03_006_jr_8012ACE0.c:816). - * Unpinned, local-alloc's combine_regs ties the abs dest to its dying input - * and every downstream register shifts (12 off). Pin ONLY the abs result: - * pinning `x` or the pan quotient re-seats the divide chain (17 / 8 off). - * - * 4. ZERO-BYTE RE-TIE ON `vol` (§21 / S4). Both divides share one HI/LO, so - * the scheduler must choose which `mult` issues first, and priority is - * height-to-block-end: the pan quotient feeds the `bne`, so it wins and the - * vol chain sinks (41 off, -2 ins). A NON-volatile - * `__asm__("" : "=r"(vol) : "0"(vol));` gives `vol` a free in-block - * consumer, flipping the chains back to the target's - * `mult / mfhi $t1 / addiu / nop / mult` (that `nop` is the mfhi->mult - * hazard and IS in the target). A *volatile* asm over-serialises (35 off). - * - * 5. THE PAN QUOTIENT IS THE SAME VARIABLE AS `x` (§136 L1 — the Ghidra seed - * had this right, it reuses iVar5). Target's `subu $a2,$v1,$v0` puts the - * quotient back in x's register; a separate `pan` local is a fresh global - * allocno and takes $v1 (earlier in REG_ALLOC_ORDER) — 6 off, and no pin - * fixes it. - * - * 6. 0x3000 IN A LOCAL, NOT A LITERAL. fold reassociates - * `(vol | 0x3000) | pan` into `vol | (pan | 0x3000)`, landing the `ori` on - * the shifted pan — in EVERY literal spelling swept (2-5 off). Hoisting it - * into `flg` leaves no constant for fold to move, and keeping the OR inside - * the call ARGUMENT preserves the target's `addiu $a0,0xA9B` -> `ori` -> - * `or` order (a standalone `vol |= 0x3000;` statement fixes the tree but - * swaps those two, 2 off). - * - * Declarations: func_8012B608 / func_8012B1B4 / func_8012CBA4 / - * func_8004914C / func_800491AC / func_8002D4C8 / D_801AF72C are copied - * VERBATIM from the TU (lines 3930, 3931, 4110, 2646, 2647, 59, 4464). - * func_8012BE98 / func_8012B744 / func_8012BD3C / RotTransPers / D_800AF648 - * appear NOWHERE in the TU, so the fleet-dominant forms are used and the - * return value of the `void`-declared func_8012BE98 is taken through a cast - * at the call site (idiom 9). - */ - -extern void func_8012BE98(s32 a0, u16 *a1); -extern s32 func_8012B744(void *a0, void *a1); -extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); -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_80188CF0(s32 a0) { - - extern u8 D_800AF648; - extern u8 D_801AF72C[]; - /* locals start at sp+0x10 (the 16-byte outgoing-arg area). The first - 16 bytes are unreferenced in this function but are part of the - frame — vars must be 0x28, i.e. frame 0x48. */ - struct { - s32 pad0[4]; /* sp+0x10 */ - s16 v[3]; /* sp+0x20 */ - s16 pad1; /* sp+0x26 */ - u16 sxy[2]; /* sp+0x28 */ - s32 z; /* sp+0x2C */ - s32 flag; /* sp+0x30 */ - } L; - void *p88; - - p88 = (void *)(a0 + 0x88); - - if (((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)p88) >= 0x1000) { - s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), - func_8012B744((void *)(a0 + 4), p88), 0x20); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; - } - - func_8012B1B4(a0, (s32)D_801AF72C); - - if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { - s32 r2; - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - r2 = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), - func_8012B744((void *)(a0 + 4), p88), 0x20); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r2; - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; - } - - if (func_8012BD3C(a0, 0x200, 0x40000) == 1) { - *(s16 *)(a0 + 0x2) = 7; - L.v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); - L.v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); - L.v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } - RotTransPers((s32)L.v, (s32)L.sxy, &L.z, &L.flag); - if (L.flag >= 0 && (u32)((L.sxy[0] + 0x9F) & 0xFFFF) < 0x13F - && (u32)((L.sxy[1] + 0x77) & 0xFFFF) < 0xEF) { - s32 x = (s16)L.sxy[0]; - register s32 ax __asm__("$5"); - s32 vol; - ax = x; - if (x < 0) { - ax = -x; - } - vol = ((0xA0 - ax) * 0x7F) / 0xA0; - __asm__("" : "=r"(vol) : "0"(vol)); - x = (x + 0xA0) / 0x14; - if (x == 0x10) { - x = 0xF; - } - x = x << 8; - { - s32 flg = 0x3000; - func_8002D4C8(0xA9B, ((vol | flg) | x) & 0xFFFF); - } - } - } -} - - - -extern void func_8012B1B4(s32 a0, s32 a1); -extern s32 func_8012B8E4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80133784(s32 a0, void *a1, s32 a2); -extern s32 func_8012BCCC(s32 a0); -extern s32 func_8012BDBC(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, s32 a1); - -void func_80188F58(s32 a0) { - - extern u8 D_801AF72C[]; - extern u8 D_801BC434[]; - typedef struct { - u16 x, y, z, w; - } V8_80188F58; - V8_80188F58 pad[2]; - V8_80188F58 sp20; - V8_80188F58 sp28; - s32 t; - s32 r; - s32 v; - - func_8012B1B4(a0, (s32)D_801AF72C); - *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; - - if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - - v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - r = 0x30; - sp20.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12); - sp20.y = *(u16 *)(a0 + 0xA) - 0x20; - v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); - sp20.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12); - sp28.x = sp20.x; - sp28.y = sp20.y + 0x60; - sp28.z = sp20.z; - - if ((func_80133784(1, &sp20, (s32)&sp28) & 0x6000) == 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - - t = func_8012BCCC(a0); - if (t < 0x2401) { - if (func_8012BDBC(a0, 0x200) == 1) { - *(s16 *)(a0 + 0x2) = 0x11; - func_8012A828(a0, (s32)D_801BC434); - } - } - if (t > 0x40000) { - *(s16 *)(a0 + 0x2) = 6; - } -} - - - -/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c) where they - * already exist, so the splice introduces no conflicting types: - * func_8002D4C8 TU:59/3245/3279/4619/4909/… `void (s32,s32)` - * func_8012BCCC TU:3928/4005/4461 `s32 (s32)` - * func_8012A828 TU:3527/3810/…/4463 `void (s32,s32)` (23 decls, all this form) - * func_8012B8E4 TU:4456/4528 `s32 (s32,s32)` - * func_8012B1B4 TU:3931/4008/4455/4529 `void (s32,s32)` - * func_8012CBCC TU:3907/3932/4530 `void (s32)` - * func_8004914C TU:2646 `void (void *)` - * func_800491AC TU:2647 `void (void *)` - * D_80126B62 TU:1793/4533 `u16` -> cast to s16* at the use site - * D_801AF464 TU:4722 (block scope) `s32` -> `(s32)&D_801AF464 | …` (line 4753) - * RotTransPers / D_800AF648 are not declared in this TU; the forms below are the - * fleet-canonical ones (ov_SC02_026_jr_80140608.c:416/2312, o0c.c:365/371). - * D_801BCF84 / D_801AF738 appear nowhere else in the TU (real dlabels in - * asm/ov_SC02_026/data/tail.data.s:61984 / :47419); same canonical `extern s32` form - * as the neighbouring D_801BD190 (TU:4385). */ -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); -extern s32 func_8012BCCC(s32 a0); -extern void func_8012A828(s32 a0, s32 a1); -extern s32 func_8012B8E4(s32 a0, s32 a1); -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBCC(s32 a0); - - -void func_80189100(s32 a0) { - - extern u8 D_800AF648; - extern s32 D_801BCF84; - extern s32 D_801AF464; - extern s32 D_801AF738; - extern u16 D_80126B62; - /* sp+0x10 local block. Frame is 0x38 = 0x10 outgoing args + 0x20 vars + - * 8 saved regs ($s0,$ra), so the vars block is 12 bytes larger than the - * fields this function actually touches -> trailing `unused[3]`. */ - struct { - s16 v[3]; /* sp+0x10 */ - s16 pad0; /* sp+0x16 */ - u16 sxy[2]; /* sp+0x18 */ - s32 z; /* sp+0x1C */ - s32 flag; /* sp+0x20 */ - s32 unused[1]; /* sp+0x24 */ - } L; - s16 x; - s32 y; - - if (*(s32 *)(a0 + 0x94) == 0xD) { - L.v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); - L.v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); - L.v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); - /* $a0-pinned scopes force the &D_800AF648 constant to be rematerialised - * per call (cookbook §88a); otherwise CSE parks it in a callee-saved reg - * and mis-seats every register in the function. */ - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } - { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } - RotTransPers((s32)L.v, (s32)L.sxy, &L.z, &L.flag); - if (L.flag >= 0 && (u32)((L.sxy[0] + 0x9F) & 0xFFFF) < 0x13F - && (u32)((L.sxy[1] + 0x77) & 0xFFFF) < 0xEF) { - s32 vol = (s16)L.sxy[0]; - if (vol < 0) { - vol = -vol; - } - vol = ((0xA0 - vol) * 127) / 160; - func_8002D4C8(0x702, (vol | 0x1000) & 0xFFFF); - } - } - - if (func_8012BCCC(a0) <= 0x24000) { - s16 c; - c = *(u16 *)(a0 + 0x102) + 1; - *(s16 *)(a0 + 0x102) = c; - if (c >= 0x78) { - if ((*(u16 *)(a0 + 0x100) & 0x2000) == 0) { - func_8012A828(a0, (s32)&D_801BCF84); - *(s16 *)(a0 + 0x2) = 10; - *(s16 *)(a0 + 0x102) = 0; - *(s32 *)(a0 + 0x58) = (s32)&D_801AF464 | 0x40000000 | 0x20000000; - } - } - } - - *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; - - x = *(s16 *)(a0 + 0xA); - y = *(s16 *)&D_80126B62; - if (x <= y - 0x100) { - *(s16 *)(a0 + 0xA) = x + 0x8; - } else if (x >= y - 0x80) { - *(s16 *)(a0 + 0xA) = x - 0x8; - } - - func_8012B1B4(a0, (s32)&D_801AF738); - func_8012CBCC(a0); -} - - - -/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c) where they - * already exist, so the splice introduces no conflicting types: - * func_8012B1B4 TU:3892/3969/4452/4498/4623 - * func_8012CBCC TU:3868/3893/3970/4665/4824 - * D_80126B5C TU:362 (u8 -> cast to s32* at the use site, the load is `lw`) - * D_80126B62 TU:1793 (u16 -> cast to s16* at the use site, the load is `lh`) - * func_8012B8E4 and D_80126B64 are not yet declared in this TU; the forms below are - * the ones used everywhere else in src/ (s32 return / extern s32). */ -extern s32 func_8012B8E4(s32 a0, s32 a1); -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBCC(s32 a0); - - -void func_8018934C(s32 a0) { - - extern u8 D_80126B5C; - extern u16 D_80126B62; - extern s32 D_80126B64; - /* sp10[0..3] is the 4-word block handed to func_8012B1B4 ($a1 = sp+0x10). - * The frame's extra 8 bytes at sp+0x20 are gcc's OWN spill area (cookbook - * §83c) -- declaring them as a 6th/5th array element makes the frame 0x40. */ - s32 sp10[4]; - s16 t; - s32 y; - - if (*(s32 *)(a0 + 0x94) == 0xA) { - *(s16 *)(a0 + 0x98) = 0; - } - - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x4); - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; - - sp10[0] = 0; - sp10[1] = 0; - - sp10[2] = *(s32 *)(a0 + 0x4) - *(s32 *)&D_80126B5C; - if (sp10[2] > 0) { - sp10[2] = -sp10[2]; - } - sp10[3] = *(s32 *)(a0 + 0xC) - D_80126B64; - if (sp10[3] > 0) { - sp10[3] = -sp10[3]; - } - sp10[2] = (sp10[2] + sp10[3]) >> 4; - func_8012B1B4(a0, (s32)sp10); - - t = *(s16 *)(a0 + 0xA); - y = *(s16 *)&D_80126B62; - if (t <= y - 0xA) { - *(s16 *)(a0 + 0xA) = t + 0x8; - } else if (t >= y) { - *(s16 *)(a0 + 0xA) = t - 0x8; - } else if (*(s32 *)(a0 + 0x94) == 0xA) { - *(s16 *)(a0 + 0x2) = 0xB; - *(s16 *)(a0 + 0x98) = 1; - } - - func_8012CBCC(a0); -} - - - - -void func_80189498(u8 *s0) { - - extern void (*D_801AF750[])(void *); - extern u8 D_801202A0[]; - u16 v0; - s32 a0; - u8 *v1; - - // Call indirect function based on index at s0[2] - v0 = *(u16 *)(s0 + 0x2); - ((void (*)(u8 *))D_801AF750[v0])(s0); - - // Check if s0[0] is zero - v0 = *(u16 *)(s0); - if (v0 == 0) return; - - // Check if s0[0x100] & 0x1000 is zero - v0 = *(u16 *)(s0 + 0x100); - if ((v0 & 0x1000) == 0) return; - - // Search for entry in D_801202A0 table - v1 = D_801202A0; - for (a0 = 0; a0 < 0x60; a0++) { - if (*(u16 *)(v1) == 0x15E) { - s16 v1_val = *(s16 *)(v1 + 0x6); - s16 s0_val = *(s16 *)(s0 + 0x6); - if (s0_val < v1_val + 0xF0) { - *(s16 *)(s0 + 0x6) = v1_val + 0xF0; - } - return; - } - v1 += 0x10C; - } -} - - - - - -extern s32 func_8012B77C(s32 out, s32 from, s32 to); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8012C218(void *a0); -extern s32 func_80143C74(s32 a0, s32 a1); -extern s32 rand(void); - -void func_80189550(s32 param_1) -{ - - extern s32 D_801151D4; - s32 sp10[4]; - s32 sp20; - s32 v0; - s32 v1; - - v0 = *(s32 *)(param_1 + 0x1C); - v1 = D_801151D4; - *(s32 *)(param_1 + 0x1C) = v0 - 1; - *(s16 *)((s32)sp10 + 0x2) = *(s32 *)(v1 + 0x5C); - *(s16 *)((s32)sp10 + 0x6) = *(s32 *)(v1 + 0x60); - *(s16 *)((s32)sp10 + 0xA) = *(s32 *)(v1 + 0x64); - func_8012B77C((s32)&sp20, param_1 + 4, (s32)sp10); - - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = (sp20 + 0x400) & 0xFFF; - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x18) += 0x55; - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x1A) += 0x55; - - v1 = *(s32 *)(param_1 + 0x1C); - if (v1 == 0xF) { - func_8002D4C8(0xCBA, 0); - v1 = *(s32 *)(param_1 + 0x1C); - } - if (v1 < 0x10) { - if (v1 == 0) { - func_8012C218((void *)param_1); - } else { - param_1 = func_80143C74(param_1, 0); - if (param_1 != 0) { - *(s16 *)(param_1 + 0x16) = -4; - v0 = rand(); - *(s16 *)(param_1 + 0x12) = (v0 & 7) - 4; - v0 = rand(); - *(s16 *)(param_1 + 0x1A) = (v0 & 7) - 4; - v0 = rand(); - { s32 t = *(u16 *)(param_1 + 0x6) - 0x10; *(s16 *)(param_1 + 0x6) = t + (v0 & 0x1F); } - v0 = rand(); - { s32 t = *(u16 *)(param_1 + 0xE) - 0x10; *(s16 *)(param_1 + 0xE) = t + (v0 & 0x1F); } - } - } - } -} - - - -extern s32 func_8012D624(void *a0, s32 a1, s32 a2); -extern void func_8012C218(void *a0); -extern void func_8012B370(void *a0); - -void func_801896A4(void *a0) { - - extern void (*D_801AF7E0[])(void *); - u16 temp; - s32 a1; - - D_801AF7E0[*(u16 *)((s32)a0 + 0x2)](a0); - - if (*(u16 *)((s32)a0 + 0x0) != 0) { - *(u16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) - 0x40; - temp = *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x18); - a1 = (s32)(temp << 16) >> 24; - if (func_8012D624(a0, a1, 0x14) == 1) { - func_8012C218(a0); - } else { - *(u16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) + 0x40; - func_8012B370(a0); - } - } -} - - - - -extern s32 func_8012D624(void *a0, s32 a1, s32 a2); -extern void func_8012C218(void *a0); - -void func_80189750(void *a0) { - - extern void (*D_801AF940[])(void); - extern u16 D_80126B96; - u16 *q; - - D_801AF940[*(u16 *)((s32)a0 + 0x2)](); - if (*(u16 *)((s32)a0 + 0x0) != 0) { - *(s16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) - 0x40; - if (func_8012D624(a0, 0x10, 0x16) == 1) { - q = &D_80126B96; - *q |= 0x200; - func_8012C218(a0); - } else { - *(s16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) + 0x40; - } - } -} - - - - -void func_80189800(void *a0) { - extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); - extern void func_8012A828(s32 a0, s32 a1); - extern void func_80131E00(void *a0, s32 a1); - extern s32 D_801BCD04; - extern s32 D_801AF5CC; - extern s32 D_801AF464; - - u16 buf[8]; - register u16 v0 __asm__("$2"); - register u16 v1 __asm__("$3"); - register u16 a2 __asm__("$6"); - - v0 = *(u16 *)((s32)a0 + 0x6); - *(u16 *)(&buf[0]) = v0; - *(u16 *)(&buf[4]) = v0; - - v1 = *(u16 *)((s32)a0 + 0xA); - v0 = v1 - 8; - *(u16 *)(&buf[1]) = v1; - *(u16 *)(&buf[5]) = v1; - - a2 = *(u16 *)((s32)a0 + 0xE); - v1 = v1 + 8; - *(u16 *)(&buf[1]) = v0; - *(u16 *)(&buf[5]) = v1; - *(u16 *)(&buf[2]) = a2; - *(u16 *)(&buf[6]) = a2; - - if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x1F) != 0) { - func_80131E00(a0, 6); - } else { - func_8012A828((s32)a0, (s32)&D_801BCD04); - *(u16 *)((s32)a0 + 0x2) = 1; - *(u16 *)((s32)a0 + 0x5C) = (u16)0xAA10; - *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF5CC; - *(s16 *)((s32)a0 + 0xFC) = 0; - *(s32 *)((s32)a0 + 0x58) = (s32)&D_801AF464 | 0x40000000 | 0x20000000; - *(s16 *)((s32)a0 + 0x88) = *(u16 *)((s32)a0 + 0x6); - *(s16 *)((s32)a0 + 0x8A) = *(u16 *)((s32)a0 + 0xA); - *(s16 *)((s32)a0 + 0x8C) = *(u16 *)((s32)a0 + 0xE); - } -} - - - - -/* func_801898E8 — "ground-collision probe, then either bounce-off or pick a state script" - * (jr_8017C180 family; byte-verified MATCH, 71 ins). - * - * Declaration provenance (whole-TU grep in one pass, cookbook §135-8 / D2 — every symbol below - * checked BOTH above and below the splice point at ov_SC02_026_jr_8017C180.c:4748): - * func_8012CEB0(s32,s32,s32) — TU decls at 4365 (file scope) / 4704 / 4851, identical form - * func_8012A828(s32,s32) — 23 TU decls, all this form (or the unnamed-param twin) - * func_80131E00(void*,s32) — TU fn-scope decls at 4706 / 4853, identical form - * D_801BC97C — declared BELOW the splice point at 5158 as `extern u8 D_801BC97C[]`; - * that exact type is reused here so the two cannot conflict - * D_801BB0B4 / D_801BB2BC / D_801BBE74 — real dlabels in asm/ov_SC02_026/data/tail.data.s, - * declared nowhere else in this TU (D_801BBE74's `void (*[])(void)` - * decl lives in a DIFFERENT TU, ov_SC03_125, so it is not a conflict) - * - * Codegen notes: - * - The buf[8] halfword-pair setup + the three $2/$3/$6 pins are the byte-verified twin of - * func_801843AC in THIS TU (line 4703). The doubled buf[1]/buf[5] stores are real: the ±8 - * adjust is a SECOND store to the same slot, and §135-4 (the list scheduler preserves the - * relative order of disambiguable stores) is what emits sh/sh then sh/sh off one lhu of a0+0xA. - * - 0x5C takes `ori $v0,$zero,0xAA10`, so the destination must be UNSIGNED (§135-3): through a - * s16 the constant folds negative and gcc emits `addiu` instead. - * - The 0x100 |= 0x8000 arm needs the plain `x = x | 0x8000` read-modify-write; gcc allocates the - * address pseudo to $a0 (the pending call arg) on its own, which is why the lhu/sh are - * $a0-based while everything else is $s0-based. - * - THE RESIDUAL THAT DECIDED THIS FUNCTION: the D_801BC97C/D_801BBE74 selector must be TWO - * SEPARATE CALLS, not a `tbl = cond ? A : B;` select feeding one call. With a select, both - * arms are single sets of the same pseudo, and gcc-2.7.2's jump.c rewrites - * `if (c) t=A; else t=B;` into `t=B; if (c) t=A;` — the D_801BBE74 lui/addiu hoists ABOVE the - * beqz and the whole tail shifts (-3 ins, LENGTH-DRIFT, 20 mismatches). Two calls are not - * simple sets, so the transform cannot fire; cross_jump then merges only the common - * [move $a0,$s0; jal] tail, which is exactly the target's j-over-arm shape. - */ - -extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); -extern void func_8012A828(s32 a0, s32 a1); -extern void func_80131E00(void *a0, s32 a1); - -void func_801898E8(void *a0) { - - extern u8 D_801BB0B4[]; - extern u8 D_801BB2BC[]; - extern u8 D_801BBE74[]; - extern u8 D_801BC97C[]; - u16 buf[8]; - register u16 v0 __asm__("$2"); - register u16 v1 __asm__("$3"); - register u16 a2 __asm__("$6"); - - v0 = *(u16 *)((s32)a0 + 0x6); - buf[0] = v0; - buf[4] = v0; - - v1 = *(u16 *)((s32)a0 + 0xA); - v0 = v1 - 8; - buf[1] = v1; - buf[5] = v1; - - a2 = *(u16 *)((s32)a0 + 0xE); - v1 = v1 + 8; - buf[1] = v0; - buf[5] = v1; - buf[2] = a2; - buf[6] = a2; - - if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x1F) != 0) { - *(u16 *)((s32)a0 + 0x100) = *(u16 *)((s32)a0 + 0x100) | 0x8000; - func_80131E00(a0, 6); - } else { - if (*(s32 *)((s32)a0 + 0x90) == (s32)&D_801BB2BC) { - func_8012A828((s32)a0, (s32)&D_801BB0B4); - *(u16 *)((s32)a0 + 0x2) = 0x14; - *(u16 *)((s32)a0 + 0x34) = 1; - *(s16 *)((s32)a0 + 0xFE) = 0; - *(s32 *)((s32)a0 + 0xCC) = (s32)&D_801BBE74; - } else { - if (*(s16 *)((s32)a0 + 0xFE) != 0) { - func_8012A828((s32)a0, (s32)&D_801BC97C); - } else { - func_8012A828((s32)a0, (s32)&D_801BBE74); - } - *(u16 *)((s32)a0 + 0x2) = 1; - } - *(s16 *)((s32)a0 + 0xFC) = 0; - *(u16 *)((s32)a0 + 0x5C) = (u16)0xAA10; - } -} - - -extern void func_8002A04C(s32 a0); -extern void func_8012B2CC(s32 a0); -extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); -extern s32 func_80153BD8(s32 a0); -extern s32 func_80153BF0(s32 a0); - -extern void func_8012C098(void *param_1); - -void func_80189A04(s32 a0) { - s32 ent; - - if (*(u16 *)a0 != 0) { - if (*(s16 *)(a0 + 0x70) == 4) { - ent = func_8012C658(0x12C, 4, a0); - if (ent != 0) { - *(u16 *)(ent + 0x6) = *(u16 *)(a0 + 0x88); - *(u16 *)(ent + 0x88) = *(u16 *)(a0 + 0x88); - *(u16 *)(ent + 0xE) = *(u16 *)(a0 + 0x8C); - *(u16 *)(ent + 0x8C) = *(u16 *)(a0 + 0x8C); - *(u16 *)(ent + 0xA) = *(u16 *)(a0 + 0x8A) - 0x400; - *(u16 *)(ent + 0x8A) = *(u16 *)(a0 + 0x8A); - func_8012B2CC(ent); - } - } - if (func_80153BD8(a0)) { - func_80153BF0(a0); - } - if (*(s32 *)(a0 + 0x78) != 0) { - func_8002A04C(a0); - } - func_8012C098((void *)a0); - } -} - - - -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_80133784(s32 a0, void *a1, s32 a2); - -void func_80189AE4(s32 a0) { - - extern u8 D_801AF448[]; - typedef struct { u16 x, y, z, w; } V8_80189AE4; - V8_80189AE4 sp10; - V8_80189AE4 sp18; - - if (*(s32 *)(a0 + 0x94) >= 8) { - *(s16 *)(a0 + 0xFE) = 1; - func_8012B1B4(a0, (s32)D_801AF448); - if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { - sp10.x = *(u16 *)(a0 + 0x3A); - sp10.y = *(u16 *)(a0 + 0x3E); - sp10.z = *(u16 *)(a0 + 0x42); - sp18 = sp10; - sp18.y += 8; - if (func_80133784(1, &sp10, (s32)&sp18) != 0) { - *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); - *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); - *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); - } - } - } -} - - - - -extern void func_80131B14(void); -extern void func_8012B23C(void *a0); -extern s32 func_80131A34(s32 a0, s32 a1); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80189BBC(s32 a0) { - register s32 s0 __asm__("$16") = a0; - u16 v0 = *(u16 *)(s0 + 0x100); - u16 v1 = *(u16 *)(s0 + 0x60); - - v0 |= 0x8000; - v1 <<= 2; - - *(u16 *)(s0 + 0x100) = v0; - *(u16 *)(s0 + 0x60) = v1; - func_80131B14(); - - *(u8 *)(s0 + 0xC2) = 0; - *(u16 *)(s0 + 0x98) = 0; - func_8012B23C((void *)s0); - - func_80131A34(s0, 0x8); - func_8002D4C8(0xA74, 0); -} - - -extern s32 func_80153BD8(s32 arg); - extern s32 func_80153BF0(s32 a0); - void func_80189C24(u8 *a0) { - *(s16 *)(a0 + 0xfe) = 0; - if (func_80153BD8((s32)a0)) { - ((void (*)(void *))func_80153BF0)(a0); - } - } - - - - -/* Modeled on the byte-matched sibling func_801843AC in the same TU - * (src/ov_SC02_026/ov_SC02_026_jr_8017C180.c:4677-4719): identical two-box - * build + func_8012CEB0 collision probe, differing only in the mask (0x19 vs - * 0x1F) and the else-arm payload. All declarations are block-scope and copied - * verbatim from the TU so the splice introduces no conflicting types. */ - -void func_80189C60(void *a0) { - extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); - extern void func_8012A828(s32 a0, s32 a1); - extern void func_80131E00(void *a0, s32 a1); - extern char D_801BCDEC[]; - - u16 buf[8]; - register u16 v0 __asm__("$2"); - register u16 v1 __asm__("$3"); - register u16 a2 __asm__("$6"); - - v0 = *(u16 *)((s32)a0 + 0x6); - *(u16 *)(&buf[0]) = v0; - *(u16 *)(&buf[4]) = v0; - - v1 = *(u16 *)((s32)a0 + 0xA); - v0 = v1 - 8; - *(u16 *)(&buf[1]) = v1; - *(u16 *)(&buf[5]) = v1; - - a2 = *(u16 *)((s32)a0 + 0xE); - v1 = v1 + 8; - *(u16 *)(&buf[1]) = v0; - *(u16 *)(&buf[5]) = v1; - *(u16 *)(&buf[2]) = a2; - *(u16 *)(&buf[6]) = a2; - - if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x19) != 0) { - func_80131E00(a0, 6); - } else { - func_8012A828((s32)a0, (s32)&D_801BCDEC); - *(u16 *)((s32)a0 + 0x2) = 6; - *(u16 *)((s32)a0 + 0x5C) = (u16)0xA810; - } -} - - - -/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c:4453-4456), - * so the splice introduces no conflicting types. Type disagreements are pushed - * to casts at the use sites (cookbook §37 lever A) — codegen-neutral. */ -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012CBA4(s32 a0); -extern s32 func_80133784(s32 a0, void *a1, s32 a2); - -void func_80189D04(s32 *s0) { - - extern u8 D_801AF448[]; - typedef struct { - u16 a, b, c, d; - } Data_t_80189D04; - - Data_t_80189D04 buf_src, buf_dst; - s32 v0; - - func_8012B1B4((s32)s0, (s32)D_801AF448); - - v0 = ((s32 (*)(s32))func_8012CBA4)((s32)s0); - if (v0 & 0x6000) { - return; - } - - // Load halfwords from s0 - buf_src.a = *(u16 *)((u8 *)s0 + 0x3A); - buf_src.b = *(u16 *)((u8 *)s0 + 0x3E); - buf_src.c = *(u16 *)((u8 *)s0 + 0x42); - - // Struct assignment generates lwl/lwr + swl/swr - buf_dst = buf_src; - - // Modify the b field of buf_dst (at offset 2) - buf_dst.b += 8; - - v0 = func_80133784(1, &buf_src, (s32)&buf_dst); - if (v0 == 0) { - return; - } - - // Copy three words - *(s32 *)((u8 *)s0 + 0x04) = *(s32 *)((u8 *)s0 + 0x38); - *(s32 *)((u8 *)s0 + 0x08) = *(s32 *)((u8 *)s0 + 0x3C); - *(s32 *)((u8 *)s0 + 0x0C) = *(s32 *)((u8 *)s0 + 0x40); -} - - - - -extern void func_8012B14C(s32 a0, s32 a1); - -void func_80189DC4(s32 a0) -{ - - extern u8 D_801AF458[]; - *(s32 *)(a0 + 0xC4) = *(s32 *)(a0 + 0xC4) & -5; - func_8012B14C(a0, (s32)D_801AF458); -} - - -extern s32 func_80153BD8(s32 a0); -extern s32 func_80153BF0(s32 a0); - -void func_80189DF8(s32 a0) -{ - s32 v0; - - if (*(u8 *)((s32)a0 + 0x5E) == 0x23) { - *(u16 *)((s32)a0 + 0x100) |= 0x4000; - } - v0 = func_80153BD8(a0); - if (v0 != 0) { - func_80153BF0(a0); - } -} - - -extern s32 func_80153BD8(s32 arg); - extern s32 func_80153BF0(s32 a0); - void func_80189E54(s32 param_1) { - if (func_80153BD8(param_1)) { - ((void (*)(s32))func_80153BF0)(param_1); - } - } - - - - -extern void func_8012A828(s32 a0, s32 a1); - -void func_80189E8C(s32 a0) -{ - - extern u8 D_801BB954[]; - if ((*(u16 *)(a0 + 0x72) & 0x4000) != 0) { - func_8012A828(a0, (s32)D_801BB954); - *(s16 *)(a0 + 0x2) = 3; - *(s16 *)(a0 + 0xFC) = 0; - *(s16 *)(a0 + 0xFE) = 1; - } -} - - - - -extern s32 func_80153BD8(s32 a0); -extern s32 func_80153BF0(s32 a0); -extern void func_8012A828(s32 a0, s32 a1); -extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_80153C74(s16 a0, s16 a1); - - -void func_80189EE8(s32 a0) { - - extern u8 D_801BB954[]; - extern s32 aD801AF930 __asm__("D_801AF70C"); - extern s32 aD801AF938 __asm__("D_801AF714"); - s32 val; - - if (func_80153BD8(a0) == 0) { - ((void (*)(s32))func_80153BF0)(a0); - func_8012A828(a0, (s32)D_801BB954); - *(s16 *)(a0 + 0x2) = 0x13; - *(s16 *)(a0 + 0x34) = 3; - *(s16 *)(a0 + 0xFC) = 0; - *(s32 *)(a0 + 0x1C) = 0x1E; - } - - if ((*(s32 *)(a0 + 0x94) == 0xA) || (*(s32 *)(a0 + 0x94) == 0x1A)) { - if (func_8012DEB8(a0, (s32)&aD801AF930, (s32)&aD801AF938) == 1) { - func_8002D4C8(0xCB2, 0); - val = *(u16 *)(a0 + 0x70) - 2; - if ((u32)val < 2) { - func_80153C74(3, 0x18); - } else { - func_80153C74(1, 0x14); - } - } - } -} - - - -extern void func_8002D4C8(s32 a0, s32 a1); -extern s32 func_8012C588(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, s32 a1); - -void func_80189FC0(void *a0) { - - extern u8 D_801BB954[]; - s16 val70; - u16 val72; - - if (*(s32 *)(a0 + 0x94) == 0x17) { - val70 = *(s16 *)(a0 + 0x70); - if (val70 == 0x2) { - func_8012C588(0x1A7, (s32)a0); - } else { - func_8002D4C8(0xCB3, 0); - func_8012C588(0x19F, (s32)a0); - } - } - - val72 = *(u16 *)(a0 + 0x72); - if ((val72 & 0x4000) != 0) { - func_8012A828((s32)a0, (s32)D_801BB954); - *(s16 *)(a0 + 0x2) = 0x3; - *(s16 *)(a0 + 0xFC) = 0; - *(s16 *)(a0 + 0xFE) = 0; - } -} - - - - -extern s32 func_80153BD8(s32 a0); -extern s32 func_80153BF0(s32 a0); -extern void func_8012A828(s32 a0, s32 a1); -extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_80153C74(s16 a0, s16 a1); - - -void func_8018A054(s32 a0) { - - extern s32 aD801BC890 __asm__("D_801BC66C"); - extern s32 aD801AF930 __asm__("D_801AF70C"); - extern s32 aD801AF938 __asm__("D_801AF714"); - u16 val; - - if (func_80153BD8(a0) == 0) { - ((void (*)(s32))func_80153BF0)(a0); - func_8012A828(a0, (s32)&aD801BC890); - *(s16 *)(a0 + 0x34) = 7; - *(s16 *)(a0 + 0x2) = 0x13; - *(s32 *)(a0 + 0x1C) = 0x1E; - } - - if (*(s32 *)(a0 + 0x94) == 0x17) { - if (func_8012DEB8(a0, (s32)&aD801AF930, (s32)&aD801AF938) == 1) { - func_8002D4C8(0xCB2, 0); - val = *(u16 *)(a0 + 0x70); - if ((u16)(val - 2) < 2u) { - func_80153C74(3, 0x18); - } else { - func_80153C74(1, 0x14); - } - } - } -} - - - - -extern void func_8012B1B4(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, s32 a1); -extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_8002D4C8(s32 a0, s32 a1); - - -void func_8018A120(s32 a0) { - - extern u8 D_801AF744[]; - extern u8 D_801AF71C[]; - extern u8 D_801AF724[]; - extern u8 D_801BB73C[]; - extern u16 D_80126B96; - extern s16 D_80126B98; - s32 result; - u16 val70; - u16 *q; - - if ((*(u16 *)(a0 + 0x72) & 0x4000) != 0) { - *(s16 *)(a0 + 0x2) = 0xC; - func_8012B1B4(a0, (s32)D_801AF744); - *(s16 *)(a0 + 0x16) = -0x8; - func_8012A828(a0, (s32)D_801BB73C); - *(s16 *)(a0 + 0x98) = 0x1; - } - - if (*(s32 *)(a0 + 0x94) == 0xF) { - result = func_8012D5E4(a0, (s32)D_801AF71C, (s32)D_801AF724, 0x14); - if (result == 1) { - func_8002D4C8(0xCB2, 0); - - val70 = *(u16 *)(a0 + 0x70); - if (((u32)val70 - 2) < 2) { - q = &D_80126B96; - D_80126B98 = 0x18; - *q = *q | 0x2000; - } - } - } -} - - - - -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8012CBCC(s32 a0); -extern void func_8012A828(s32 a0, s32 a1); - -void func_8018A1F8(s32 a0) { - - extern s32 aD_801BB960 __asm__("D_801BB73C"); - extern s32 aD_801AF698 __asm__("D_801AF474"); - u16 temp; - - if (*(s32 *)(a0 + 0x94) == 0xD) { - func_8002D4C8(0x702, 0x107F); - } - - func_8012CBCC(a0); - - temp = *(u16 *)(a0 + 0x102) + 1; - *(u16 *)(a0 + 0x102) = temp; - - if ((s16)temp == 0x1E) { - *(u16 *)(a0 + 0x2) = 0x9; - func_8012A828(a0, (s32)&aD_801BB960); - *(u16 *)(a0 + 0x102) = 0; - *(s32 *)(a0 + 0x14) = 0; - *(s32 *)(a0 + 0x58) = ((s32)&aD_801AF698 | 0x40000000) | 0x20000000; - } -} - - - - -extern void func_8012CBCC(s32 a0); - -void func_8018A294(s32 a0) { - s16 v = *(s16 *)(a0 + 0xFC); - - if (v != 0) { - *(s16 *)(a0 + 0xFC) = v - 1; - } else if (((s32 (*)(s32))func_8012CBCC)(a0) & 0x6000) { - *(s16 *)(a0 + 0x2) = 1; - } -} - - -void func_8018A2EC(void) { -} - - -void func_8018A2F4(s32 entity) { - extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); - extern void func_8012A828(s32 a0, s32 a1); - - extern u16 D_80126B96; - extern s16 D_80126B98; - extern s32 D_80127078; - extern u8 D_801AF70C[]; - extern u8 D_801AF714[]; - extern u8 D_801BC1FC[]; - extern u8 D_801BC97C[]; - - s32 result; - - result = func_8012DEB8(entity, (s32)&D_801AF70C, (s32)&D_801AF714); - - if (result == 1) { - D_80126B96 = 0x400F; - D_80126B98 = 0; - D_80127078 = entity; - *(u16 *)(entity + 0x2) = 0x10; - func_8012A828(entity, (s32)&D_801BC1FC); - } else { - func_8012A828(entity, (s32)&D_801BC97C); - *(u16 *)(entity + 0x2) = 3; - *(u16 *)(entity + 0xFC) = 0; - *(u16 *)(entity + 0xFE) = 1; - } -} - - - - -extern s32 func_80153BD8(s32 a0); -extern void func_8012A828(s32 a0, s32 a1); - -void func_8018A394(s32 a0) { - - extern u8 D_801BC97C[]; - s32 result; - - result = func_80153BD8(a0); - if (result == 0) { - func_8012A828(a0, (s32)&D_801BC97C); - *(s16 *)(a0 + 0x2) = 3; - *(s16 *)(a0 + 0xFC) = 0; - } else { - *(s16 *)(a0 + 0x2) = 4; - } -} - - - -void func_8018A3E8(s32 a0) { - extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); - extern void func_8012A828(s32 a0, s32 a1); - - extern u16 D_80126B96; - extern s16 D_80126B98; - extern s32 D_80127078; - extern u8 D_801AF70C[]; - extern u8 D_801AF714[]; - extern u8 D_801BC53C[]; - extern char D_801BCDEC[]; - - s32 result; - - result = func_8012DEB8(a0, (s32)&D_801AF70C, (s32)&D_801AF714); - - if (result == 1) { - D_80126B96 = 0x400F; - D_80126B98 = 0; - D_80127078 = a0; - *(u16 *)(a0 + 0x2) = 0x12; - func_8012A828(a0, (s32)&D_801BC53C); - } else { - func_8012A828(a0, (s32)&D_801BCDEC); - *(u16 *)(a0 + 0x2) = 0x6; - } -} - - - - -extern s32 func_80153BD8(s32); -extern void func_8012A828(s32, s32); - -void func_8018A47C(s32 a0) -{ - - extern s32 aD801BC890 __asm__("D_801BC66C"); - s32 v0; - - v0 = func_80153BD8(a0); - if (v0 != 0) { - v0 = 0x8; - } else { - func_8012A828(a0, (s32)&aD801BC890); - v0 = 0x6; - } - *(s16 *)(a0 + 0x2) = v0; -} - - - -extern s32 func_8012BEE8(s32 a0); - -void func_8018A4C4(int param_1) -{ - int iVar1; - - iVar1 = *(int *)(param_1 + 0x1c) - 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (*(int *)(param_1 + 0x1c) == 0) { - *(short *)(param_1 + 2) = *(unsigned short *)(param_1 + 0x34); - } -} - - - - -extern void func_8012A828(s32 a0, s32 a1); - -void func_8018A4EC(s32 a0) -{ - if (((*(u16 *)(a0 + 0x72) & 0x4000) != 0) || (*(s16 *)(a0 + 0x98) == 0)) { - *(s16 *)(a0 + 0x2) = *(u16 *)(a0 + 0x34); - func_8012A828(a0, *(s32 *)(a0 + 0xCC)); - } -} - - - -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, s32 a1); -extern void func_8012B23C(void *a0); -extern void func_8012B2CC(s32 a0); -extern void func_8012B14C(s32 a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); - - -void func_8018A538(s32 param_1) -{ - - extern u8 D_801AF7A4[]; - extern u8 D_801AF7BC[]; - extern u8 D_801AF7D4[]; - s32 v0; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - func_8001CA1C(v0, (s32)D_801AF7A4); - func_8012A828(param_1, (s32)D_801AF7BC); - *(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(*(s32 *)(param_1 + 0x64) + 0x20) + 0x12); - func_8012B23C((void *)param_1); - func_8012B2CC(param_1); - func_8012B14C(param_1, (s32)D_801AF7D4); - *(s16 *)(param_1 + 2) = 1; - *(s16 *)(param_1 + 0xA) = *(u16 *)(param_1 + 0xA) - 0x90; - *(s16 *)(param_1 + 6) = - *(u16 *)(param_1 + 6) - - (func_8004787C(*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12)) >> 8); - *(s16 *)(param_1 + 0xE) = - *(u16 *)(param_1 + 0xE) - - (func_80047948(*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12)) >> 8); - } -} - - - -extern void func_8012CBCC(s32 a0); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8018A624(s32 a0) -{ - s32 v1; - - if ((((s32 (*)(s32))func_8012CBCC)(a0) & 0x2000) != 0) { - *(s16*)(a0 + 0x2) = 2; - *(s32*)(a0 + 0x1C) = 0x3C; - *(s16*)(a0 + 0x98) = 1; - - v1 = *(s32*)(a0 + 0x20); - *(u16*)(v1 + 0x2C) |= 0x10; - - *(s32*)(*(s32*)(a0 + 0x20) + 0x4) |= 0x8000000; - - *(s16*)(*(s32*)(a0 + 0x20) + 0x12) = 0; - func_8002D4C8(0xCB4, 0); - } -} - - - -/* Decls conformed VERBATIM to the TU's own file-scope decl block - * (src/ov_SC02_026/ov_SC02_026_jr_8017C180.c:5052-5060, the block that feeds the - * banked sibling func_801850E4). Two of them disagreed with this draft: - * func_8012C1B8 -> TU says `void` return, draft wanted s32 (the reported conflict) - * func_8012B23C -> TU says `void *` param, draft wanted s32 (hidden behind it) - * Both disagreements are pushed to casts at the USE site (§37 lever A) — zero bytes - * change; the same cast idiom is already used by func_801850E4 above. */ -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, s32 a1); -extern s32 rand(void); -extern void func_8012B23C(void *a0); -extern void func_8012B2CC(s32 a0); -extern void func_8012B14C(s32 a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); - -void func_8018A6A8(s32 a0) -{ - - extern s32 D_801AF7EC; - extern s32 D_801AF8AC; - extern s32 D_801AF934; - s32 v0; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(a0 + 0x20) = v0; - - if (v0 == 0) { - func_8012CAE4((void *)a0); - } else { - func_8001CA1C(v0, (s32)&D_801AF7EC); - func_8012A828(a0, (s32)&D_801AF8AC); - v0 = rand(); - *(u32 *)(a0 + 0x94) = v0 & 0xF; - - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(*(s32 *)(a0 + 0x64) + 0x20) + 0x12); - - func_8012B23C((void *)a0); - func_8012B2CC(a0); - func_8012B14C(a0, (s32)&D_801AF934); - - *(u16 *)(a0 + 0x2) = 1; - - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x2C) |= 0x10; - - *(s16 *)(a0 + 0xA) -= 0x90; - - v0 = func_8004787C(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12)); - *(s16 *)(a0 + 0x6) -= (s16)(v0 >> 8); - - v0 = func_80047948(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12)); - *(s16 *)(a0 + 0xE) -= (s16)(v0 >> 8); - } -} - - -extern void func_8012CBCC(s32 a0); - void func_8018A7B4(s32 arg0) { - if ((((s32 (*)(void))func_8012CBCC)() & 0x2000) != 0) { - *(s16*)(arg0 + 0x2) = 0x2; - } - } - - -extern void func_8012C218(void *a0); - - -void func_8018A7EC(void *a0) { - *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18) = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18) + 0x200; - *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) + -0x200; - if (*(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) < 0x401) { - func_8012C218(a0); - } -} - - - -extern void (*D_801CC9AC[])(void); - -void func_8018A858(void *a0) { - D_801CC9AC[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018A894); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018A90C); - - - -extern s32 func_8012E778(int param_1, int param_2); -extern s32 func_8012C51C(int a0, int a1); - -void func_8018A9BC(int param_1, int param_2) -{ - - extern u16 D_800AF7BC; - extern u16 D_800AF7BE; - extern u8 D_801D34C8[]; - s32 i; - - i = 0; - if (func_8012E778(param_1, ((s32)(D_800AF7BE >> 1) << 16) | (D_800AF7BC >> 1)) != 0) { - do { - if (D_801D34C8[i] == 0) { - D_801D34C8[i] = 1; - *(s32 *)(param_2 + 0x10) = i | 0x80000000; - *(u16 *)(param_2 + 8) = *(u16 *)(param_1 + 0x70); - func_8012C51C(param_2, param_1); - return; - } - i++; - } while (i < 5); - } -} - - - -extern s32 func_8012C194(void); -extern void func_8001CD50(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_8018AE00(s32 a0); - -void func_8018AA74(void *a0) -{ - - extern u32 D_801D3388; - s32 iVar2; - u32 *puVar3; - - *(s16 *)((s32)a0 + 0xFC) = 0x7000; - *(s16 *)((s32)a0 + 0x100) = 0; - *(s16 *)((s32)a0 + 0xFE) = 0; - *(s16 *)((s32)a0 + 0x104) = 0; - *(s16 *)((s32)a0 + 0x106) = 0; - puVar3 = (u32 *)((u8 *)&D_801D3388 + (*(s16 *)((s32)a0 + 0xDC) * 0x40)); - iVar2 = func_8012C194(); - *(s32 *)((s32)a0 + 0x20) = iVar2; - if (iVar2 != 0) { - func_8001CD50(iVar2, (s32)puVar3); - *(s16 *)(iVar2 + 0x10) = 0x400; - *(u32 *)(iVar2 + 4) = *(u32 *)(iVar2 + 4) | 0x60000000; - func_800233CC(puVar3, 0x40); - puVar3[0] = 0x808080; - puVar3[1] = 0x808080; - func_8018AE00((s32)a0); - *(s16 *)((s32)a0 + 2) = 3; - } -} - - - -/* func_8018AB34 — per-frame entity tick: decay the sound-handle envelope at - * +0x20, ramp the s16 pair at +0xFE/+0x106 up to a 0x6000 ceiling, then ramp - * the pair at +0xFC/+0x104 down; when the +0xFC accumulator goes negative the - * entity releases its D_801D34C8 slot and hands off to func_8012C218, - * otherwise it continues in func_8018AC00. - * - * §71 sibling-first: func_8018A090 (same TU, 0xC0 bytes earlier) is the - * initialiser for exactly these fields (+0xFC/+0xFE/+0x100/+0x104/+0x106, the - * +0x20 handle and the +0xDC slot index) and pins the widths/casts used here. - * D_801D34C8[] is the 5-entry slot table func_80189FD8 (same TU) claims from. - * - * Levers (all three were needed; each is byte-verified by removal): - * 1. §3-T4 branch polarity — the 0x6000 guard is written `>= 0x6000` with the - * CLAMP as the then-arm, which is what puts `slti/bnez` + the `j` over the - * ramp arm in the target order. Writing it `< 0x6000` gives `beqz` and the - * arms swapped. - * 2. Zero-byte `__asm__ __volatile__("" : : : "memory")` at the head of the - * ramp arm (§34 toolkit). Without it cse.c relates the guard's - * `lh 0xFE` to the ramp's `lhu 0xFE` — same MEM, sign- vs zero-extend — - * and rewrites the second as `move`+`andi 0xffff`. That also lands both - * arms' final store in $v0, which lets the post-reload jump pass CROSS-JUMP - * the two `sh 0xFE` tails (§5a) and eats the `j .L8018A1C4`. The clobber - * invalidates the MEM in the hash table so the real second load survives, - * the arms end in different registers, and the cross-jump cannot fire. - * 3. The +0x104 store is SUNK to immediately after the subtract, before the - * +0xFC accumulate. Both tail quantities are otherwise born in the same - * block, and local-alloc's QTY_CMP_PRI (n_refs*log2(n_refs)/live_length) - * then ranks the accumulator ABOVE the delta, handing it $v0 and swapping - * the whole block's register pair. Storing the delta early kills its live - * range at insn 3, which flips the priority back so the delta takes $v0. - * Purely a scheduling/priority dial — the emitted order is unchanged - * because reorg pulls `sh 0x104` back into the `bgez` delay slot. - * Also note the two tail blocks are BLOCK-SCOPED: sharing one function-scope - * pair across the 0xFE and 0xFC ramps makes them global allocnos (§76), which - * costs $a1 for the deltas and an extra 8 bytes of frame (0x20 vs 0x18). - */ - -extern void func_8012C218(void *a0); -extern void func_8018AC00(void *a0); - -void func_8018AB34(void *a0) -{ - - extern u8 D_801D34C8[]; - s32 p; - s32 v; - - p = *(s32 *)((s32)a0 + 0x20); - if (p != 0) { - v = *(u16 *)(p + 0x1A) - 0x100; - *(s16 *)(p + 0x1A) = v; - *(s16 *)(p + 0x18) = v; - if (*(s16 *)(p + 0x1A) < 0) { - *(s16 *)(p + 0x1A) = 0; - *(s16 *)(p + 0x18) = 0; - } - } - if (*(s16 *)((s32)a0 + 0xFE) >= 0x6000) { - *(s16 *)((s32)a0 + 0xFE) = 0x6000; - } else { - s32 dv, sv; - __asm__ __volatile__("" : : : "memory"); - dv = *(u16 *)((s32)a0 + 0x106) + 0x400; - sv = *(u16 *)((s32)a0 + 0xFE) + dv; - *(s16 *)((s32)a0 + 0x106) = dv; - *(s16 *)((s32)a0 + 0xFE) = sv; - } - { - s32 d = *(u16 *)((s32)a0 + 0x104) - 0x80; - s16 s; - - *(s16 *)((s32)a0 + 0x104) = d; - s = *(u16 *)((s32)a0 + 0xFC) + d; - *(s16 *)((s32)a0 + 0xFC) = s; - if (s < 0) { - D_801D34C8[*(s16 *)((s32)a0 + 0xDC)] = 0; - func_8012C218(a0); - } else { - func_8018AC00(a0); - } - } -} - - - - -void func_8018AC00(void *a0) { - typedef struct { u8 b[8]; } Blk8_8018AC00; - extern s32 func_80017DC4(void *a0, void *a1); - extern s16 func_8012A758(void); - extern void RotMatrixY(s32 a0, void *a1); - extern void func_80015978(s32 a0, s32 *a1); - extern void func_80017E68(void *a0, void *a1); - extern s32 func_80017758(void *a0, void *a1); - extern Blk8_8018AC00 D_801CC9D0, D_801CC9D8, D_801CC9E0, D_801CC9E8; - extern Blk8_8018AC00 D_801CC9F0, D_801CC9F8, D_801CCA00, D_801CCA08; - - u8 buf[0x60]; - u8 *p; - u8 *q; - u8 *vp; - s16 ang; - - *(s32 *)(buf + 0x30) = 0x50000000; - *(s32 *)(buf + 0x20) = 0x80; - *(s32 *)(buf + 0x24) = 0x80; - *(s32 *)(buf + 0x28) = 0; - *(s32 *)(buf + 0x2c) = 0; - - *(Blk8_8018AC00 *)(buf + 0x00) = D_801CC9D0; - *(Blk8_8018AC00 *)(buf + 0x08) = D_801CC9D8; - *(Blk8_8018AC00 *)(buf + 0x10) = D_801CC9E0; - *(Blk8_8018AC00 *)(buf + 0x18) = D_801CC9E8; - - p = buf + 0x38; - func_80017DC4((u8 *)a0 + 0xfc, p); - ang = func_8012A758(); - RotMatrixY(ang, p); - - q = buf + 0x58; - func_80015978((s32)((u8 *)a0 + 4), (s32 *)q); - func_80017E68(q, p); - - vp = buf + 0x00; - func_80017758(vp, p); - - *(s32 *)(buf + 0x30) = 0x60000000; - *(s32 *)(buf + 0x20) = 0x808080; - *(s32 *)(buf + 0x24) = 0x808080; - - *(Blk8_8018AC00 *)(buf + 0x00) = D_801CC9F0; - *(Blk8_8018AC00 *)(buf + 0x08) = D_801CC9F8; - *(Blk8_8018AC00 *)(buf + 0x10) = D_801CCA00; - *(Blk8_8018AC00 *)(buf + 0x18) = D_801CCA08; - - func_80017758(vp, p); -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018AE00); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018AE88); - - -extern void (*D_801D03D8[])(void); - -void func_8018AF0C(void *a0) { - D_801D03D8[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018AF48); - -typedef struct { s32 w[4]; } Blk16_8018B13C; - -extern s32 func_8004787C(s32 a0); -extern void func_80028620(s32, void *); -extern Blk16_8018B13C D_800A5EA8; -extern Blk16_8018B13C D_801D0320; -extern s32 D_800A5EB0; - -void func_8018B13C(s32 a0) { - Blk16_8018B13C *s1 = &D_800A5EA8; - - *s1 = D_801D0320; - D_800A5EB0 = func_8004787C(*(s16 *)(a0 + 0xFE)) * 10 / 4096 - 5; - *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; - func_80028620(2, s1); -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8018B1EC); - -typedef struct { s32 w[4]; } Blk16_8018B29C; - -extern s32 func_8004787C(s32 a0); -extern void func_80028620(s32, void *); -extern Blk16_8018B29C D_800A5E88; -extern Blk16_8018B29C D_801D0370; -extern s32 D_800A5E90; - -void func_8018B29C(s32 a0) { - Blk16_8018B29C *s1 = &D_800A5E88; - - *s1 = D_801D0370; - D_800A5E90 = func_8004787C(*(s16 *)(a0 + 0xFE)) * 20 / 4096 - 10; - *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; - func_80028620(0, s1); -} - - -void func_8018B34C(void) { -} - - - -extern s32 func_8004787C(s32 a0); -extern void func_80028620(s32, void *); -extern Blk16_8018B29C D_800A5E88; -extern Blk16_8018B29C D_801D03A8; -extern s32 D_800A5E90; - -void func_8018B354(s32 a0) { - Blk16_8018B29C *s1 = &D_800A5E88; - - *s1 = D_801D03A8; - D_800A5E90 = func_8004787C(*(s16 *)(a0 + 0xFE)) / 512 + 8; - *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; - func_80028620(0, s1); -} - - - - - diff --git a/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c b/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c new file mode 100644 index 0000000000..20d8aa3aba --- /dev/null +++ b/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c @@ -0,0 +1,4998 @@ +#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 { + SVECTOR_8016E7C8 v[4]; /* 0x00 */ + s32 f0, f1, f2, f3, f4, f5; /* 0x20..0x37 */ + u8 f6; /* 0x38 */ + u8 pad[7]; /* -> 0x40 */ +} Prim_8016E7C8; +typedef void (*Handler)(struct Entry_8016E95C *); +typedef struct { + s16 v[4]; +} Blk8_80126940_8017D6D0_8017F558; +typedef struct { + s16 v[4]; +} Blk8_80126940_8017D6D0_8017F794; +typedef struct { + s16 v[4]; +} Blk8_80126940_8017D6D0_8017F844; +typedef struct { + u32 addr : 24; + u32 len : 8; +} PTag_801833F0; +typedef struct { + PTag_801833F0 tag; + u8 r0, g0, b0, code; + u16 x0, y0; + u8 u0, v0; + u16 clut; + u16 x1, y1; + u8 u1, v1; + u16 tpage; + u16 x2, y2; + u8 u2, v2; + u16 pad2; + u16 x3, y3; + u8 u3, v3; + u16 pad3; +} Ft4_801833F0; +typedef struct { + PTag_801833F0 tag; + u32 code0; +} Drm_801833F0; +typedef struct { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; +} Rec_8018A6A4_8018393C; +typedef struct { + u16 f0; /* 0x00 */ + s16 f2; /* 0x02 */ + s16 f4; /* 0x04 */ + s16 f6; /* 0x06 */ + s16 f8; /* 0x08 */ + u16 fA; /* 0x0A */ + s16 fC; /* 0x0C */ + u16 fE; /* 0x0E */ +} Rec_8018B23C_801844D4; +typedef struct { s32 w[8]; } Mat32_8018B23C_801844D4; /* the 0x20-byte matrix */ +typedef struct { s32 a; s32 b[4]; } Ot_8018B23C_801844D4; /* == engine_types.h OtBlk */ +typedef struct { u16 f; } Bidx_8018B23C_801844D4; /* the D_800B9A02 buffer index */ +typedef struct { u32 addr:24; u32 len:8; } PTag_8018B23C_801844D4; /* libgpu P_TAG */ +extern void func_801458E0(void); +extern s32 D_800AE6AC; +extern s32 D_800AE6B0; +extern s16 D_800B9A0A; +extern u8 D_80078E50; +extern void func_800D185C(u8 *a0); +extern void func_801458E8(void); +extern s32 func_80029504(void); +extern void func_80145B24(void); +extern u8 D_8018D97C; +extern u8 D_8018D8EC; +extern u8 D_8018D8C8; +extern u8 D_8018D8A4; +extern u8 D_8018D958; +extern u8 D_8018D934; +extern u8 D_8018D910; +extern u8 D_8018D880; +extern void func_80145934(void); +extern u8 D_8018DA0C; +extern u8 D_8018D9E8; +extern u8 D_8018D9C4; +extern u8 D_8018D9A0; +extern void func_80145A2C(void); +extern s32 func_800291DC(s32); +extern void func_800291C8(s32, s32); +extern void func_80162120(void); +extern void func_80029124(s32, s32); +extern s32 func_80165A50(s32); +extern void func_80029514(s32); +extern u8 D_800AF630[]; +extern u8 D_80078EC0; +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80145BF8(void); +extern s32 func_800291B4(s32 arg); +extern void func_800291A0(s32, s32); +extern void func_80145C54(void); +extern s32 func_80145CEC(); +extern s32 func_80029178(s32 arg); +extern void func_80146014(s32 a0); +extern unsigned char D_8018CE04[]; +extern unsigned char D_8018CE34[]; +extern unsigned char D_8018CE84[]; +extern unsigned char D_8018CEB4[]; +extern unsigned char D_8018CEE4[]; +extern void func_80145EE8(s32 param_1); +extern void MoveImage(void *a0, s32 a1, s32 a2); +extern void func_80146074(void); +extern s32 func_80146128(void); +extern void func_80146360(void); +extern void func_801463A0(); +extern void func_8014607C(void); +extern s32 *D_80126B78; +extern u8 D_80078EC1; +extern s32 D_80078EC8; +extern s32 D_80126B9C; +extern s32 D_8011F730; +extern u16 D_801152B8; +extern u16 D_8012693A; +extern u8 D_80126BE0[]; +extern u8 D_801150F0[]; +extern void *memcpy(void *dst, const void *src, u32 n); +extern void func_80146FC4(s32 a0); +extern void func_80150A70(s32 a0); +extern void func_80147098(s32 *a0); +extern void func_8014A638(s32 arg0); +extern s32 func_80155458(s32 a0); +extern s32 func_80029104(void); +extern void func_80029344(void); +extern void func_8014ADE0(s32 a0); +extern void func_8014B350(s32 a0); +extern void func_8014B7A4(s16 *param_1); +extern s32 func_80161D58(s32 a0); +extern void func_80161A90(s32 a0); +extern void func_8014B504(u16 *a0); +extern void func_80149BEC(s32 a0); +extern void func_8014B5D0(s32 *a0); +extern void func_8014C99C(u8 *a0); +extern void func_8014B190(s32 s0); +extern void func_80148648(s32 a0, s32 a1); +extern s32 func_80149228(s32 a0); +extern void func_8014A59C(s32 a0); +extern void func_8016F14C(void *a0); +extern void func_80154418(void *a0); +extern void func_80154BE4(s32 a0); +extern void func_80165694(s32 arg0); +extern void func_801654A8(s32 a0); +extern void func_8014A680(s32 a0); +extern void func_8014A6A8(s32 a0); +extern void func_8014A71C(s32 a0); +extern void func_80172588(s32 *a0); +extern void func_801473DC(s32 *a0); +extern void func_80015978(s32 a0, s32 *a1); +extern void (*D_8018CF34[])(void *); +extern u8 D_80126BA4; +extern s32 D_80127098; +extern s32 D_80127094; +extern s32 D_80127090; +extern void func_80146534(void); +extern void func_8001D074(s32 a0, s32 a1); +extern void func_80146554(void); +extern void func_80146578(void); +extern void func_8001CFDC(s32, s32); +extern void func_8014659C(void); +extern void func_8001D074(s32, s32); +extern void func_801465C0(void); +extern void func_801465E4(void); +extern void func_801466F0(s32 a0, s32 a1, s32 a2, s32 a3, s32 sp5, s32 sp6, s32 sp7, s32 sp8); +extern s32 D_8011F9D0; +extern s32 func_80146608(s32 a0, s32 a1, s32 a2, s32 a3, s16 arg9, s32 arg10, s32 arg11, s32 arg12, s32 arg13); +extern void func_801466B4(u16 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 D_8011F750; +extern s32 D_8011F754; +extern u8 * func_801468C8(s32 arg0, u8 arg1); +extern s32 D_8011D030; +extern s32 func_80146994(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80146924(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern s32 func_80146994(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_801469C8(int a0, void *a1, int a2, int a3, u16 arg5, int arg6, int arg7, int arg8); +extern s32 func_80146B9C(void *a0); +extern void func_80146AB4(s16 a0, s32 a1, s16 a2, s16 a3, u16 a4, s32 a5, s32 a6); +extern u16 D_8011DA28; +extern s32 func_80146B9C(void * arg0); +extern void func_80146C98(s32 *a0, s16 a1); +extern void func_80146CA0(void *a0); +extern void func_80146CB4(void *a0); +extern void func_80146CC8(s32 a0); +extern void func_80146D30(s32 a0); +extern void func_80146D80(s32 *a0); +extern void func_80146DE8(s32 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80146D90(s32 a0); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80146DF8(s32 *a0, s32 a1, s32 a2, s32 a3, s32 t0); +extern void func_80146E90(s32 *a0, s32 a1); +extern s32 func_80146E98(s32 a0); +extern void func_80015954(s32 a0, s32 a1); +extern void func_80149374(s32 a0, s32 a1); +extern void func_80146F58(s32 a0, s32 a1); +extern void func_80146EC0(s32 a0, s32 a1, s32 a2, s32 a3); +extern s16 func_8012A68C(void); +extern s16 func_8012A758(void); +extern void func_8004978C(s16 *a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern u8 D_80126DB0[]; +extern u16 D_80126DB6; +extern void func_8014704C(s32 *a0); +extern s32 func_80147054(void *a0); +extern void func_80147060(u8 * a0); +extern void func_8014706C(void *arg0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80147084(s32 *a0); +extern void func_8014708C(void *arg0); +extern s32 func_801470A0(void *a0); +extern void func_801470AC(s32 *a0); +extern void func_801470B4(s32 arg0); +extern void func_801470C0(s32 a0); +extern void func_80147118(s32 a0); +extern s16 D_80126BB8; +extern s16 D_80126BBA; +extern s16 D_80126BBC; +extern void func_80147264(s32 a0); +extern void func_80147290(void); +extern void func_801472B4(void *a0); +extern s32 func_801472C8(struct S *a0); +extern void *D_8012707C; +extern void func_801472DC(void); +extern void func_801472F0(void *a0); +extern void func_80147364(u16, s32); +extern void func_80147300(u16 arg0); +extern void func_80147324(s32 arg0); +extern void func_801473EC(s32 *a0); +extern void func_80147460(s32 a0); +extern void func_80147514(); +extern void func_80147628(s32 a0); +extern void func_80147478(s32 a0); +extern void func_801474D8(s32 *a0); +extern void func_801474EC(s32 *a0); +extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2); +extern s32 func_800129CC(s32 a0, s32 a1); +extern void func_80147514(s32 arg0); +extern void func_80013F3C(s32 a0); +extern void func_80012558(s32 a0, s32 a1); +extern void func_800126C4(s32 a0, s32 a1); +extern void func_800123F0(s32 a0, s32 a1); +extern void func_80147718(s32 a0); +extern void func_80147788(void *a0, s32 a1); +extern void func_801477A8(void *a0, s32 a1); +extern void func_801477C8(void *a0, s32 a1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80147814(s32 a0, s32 a1); +extern void func_80147928(int a0, int a1); +extern void func_8014799C(int a0, int a1); +extern void func_80147A10(int a0, int a1); +extern void func_80147860(int a0, int a1, int a2, int a3); +extern void func_80147948(s32 a0, s32 a1, s32 a2); +extern void func_801479BC(s32 a0, s32 a1, s32 a2); +extern void func_80147A30(s32 a0, s32 a1, s32 a2); +extern void func_801478B8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147948(int a0, int a1, int a2); +extern void func_801479BC(int a0, int a1, int a2); +extern void func_80147A30(int a0, int a1, int a2); +extern void func_80147AD4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147A84(s32 arg0); +extern void func_80147C30(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147AAC(s32 arg0); +extern void func_80147CC8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80147B5C(s32 a0, void *a1); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern void func_80147B18(s32 a0); +extern void func_80147B5C(s32 arg0, void *arg1); +extern void func_80147C30(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147DC0(s32 a0, s32 a1); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void * a4); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_80147E44(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147F78(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147F50(s32 arg0); +extern void func_80148038(s32 a0, s32 a1); +extern s32 ratan2(s32 a0, s32 a1); +extern s32 csqrt(s32 a0); +extern s32 func_80012A60(s32 a0, s32 a1); +extern void func_80148094(int param_1, short *param_2, int *param_3); +extern void func_801485B8(s32 a0, s32 a1, s32 a2); +extern void func_801484B0(s32 a0, s32 a1); +extern s32 func_80154358(void *a0); +extern void func_801484E8(s32 a0, s32 a1); +extern void func_80148534(s32 a0, s32 a1); +extern void func_8014856C(s32 a0, s32 a1); +extern void func_801485B8(s32 arg0, s32 arg1, s32 arg2); +extern void func_80148634(void *a0); +extern u8 D_800B9A64; +extern s32 func_80014DC0(); +extern s32 func_80014D68(); +extern s32 func_80014D94(); +extern s32 func_80014CF8(); +extern void func_800120DC(); +extern s32 func_800CF8B4(); +extern u16 func_801487F4(s32 *a0); +extern u16 func_80148800(s32 *a0); +extern u8 func_8014880C(s32 *a0); +extern u16 func_80148818(s32 *a0); +extern s32 func_80047D3C(s32 a0); +extern s32 func_80148824(void *arg0); +extern s32 func_801488A8(u8 *a0); +extern s32 func_8014891C(s32 a0); +extern s32 func_80148980(u8 *a0); +extern s32 func_801489E8(s32 a0); +extern s32 func_80148A48(s32 a0); +extern int func_80148AFC(void *a0); +extern void func_80148AAC(u8 *a0); +extern s32 func_80148C18(void); +extern s32 func_80148C20(s32 a0, s16 a1); +extern s32 func_80148C34(s32 a0, s32 a1); +extern s32 func_80148C4C(s32 a0, s32 a1); +extern s32 func_80148C64(s32 a0, s32 a1); +extern s32 func_80148C7C(void); +extern s32 func_80148C84(s32 a0, s32 a1); +extern s32 func_80148C9C(s32 a0, s32 a1); +extern s32 func_80148CB4(s32 a0, s32 a1); +extern s32 func_80148CCC(s32 a0, s32 a1); +extern s32 func_80148CE4(void); +extern s32 func_80148CEC(void); +extern s32 func_80148CF4(s32 a0, s32 a1); +extern s32 func_80148D0C(s32 a0, s32 a1); +extern s32 func_80148D24(void *a0, int a1); +extern s32 func_80148D3C(void); +extern s32 func_80148F60(void); +extern s32 func_80148F68(s32 a0); +extern s32 func_80148F74(s32 a0); +extern s32 func_80148F80(s32 a0); +extern s32 func_80148F8C(s32 a0); +extern s32 func_80148F98(void); +extern s32 func_80148FA0(s32 a0); +extern s32 func_80148FAC(s32 a0); +extern s32 func_80148FB8(s32 a0); +extern s32 func_80148FC4(s32 a0); +extern s32 func_80148FD0(void); +extern s32 func_80148FD8(void); +extern s32 func_80148FE0(s32 a0); +extern s32 func_80148FEC(s32 a0); +extern s32 func_80148FF8(s32 a0); +extern s32 func_80149004(void); +extern void func_8014900C(s32 *a0); +extern void func_80149020(s32 *a0); +extern void func_80149034(s32 *a0); +extern void func_80149048(s32 *a0); +extern void func_8014905C(u8 *a0); +extern void func_801490E0(s32 *a0, s16 a1); +extern void func_801490E8(s32 *a0, s16 a1); +extern void func_801490F0(s32 *a0, s16 a1); +extern void func_80149078(s32 *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80012B04(s32 a0, s32 a1, s32 a2); +extern void func_801490F8(s32 a0, s32 a1); +extern s32 func_801491C4(s32 a0); +extern s32 func_80149184(s32 a0); +extern void func_80149204(s32 *a0); +extern void func_80149210(s32 a0, s32 a1); +extern s32 func_80149284(s32 *a0, s32 a1); +extern void func_80149350(s32 arg0); +extern void func_80149290(s32 a0); +extern void func_8012F14C(s32); +extern void func_80149374(s32 arg0, s32 arg1); +extern void func_801493D0(s32 param_1, s32 param_2, s32 param_3); +extern void func_8012F038(s32); +extern void func_8014942C(s32 arg0); +extern void func_8012EF70(s32 a0, s32 a1); +extern void func_80149544(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012EFB8(s32 a0); +extern void func_80149584(s32 arg0, s32 arg1, s32 arg2); +extern void func_8014964C(s32 param_1, s32 param_2); +extern s32 func_801496D4(void *a0); +extern void func_8015AD08(); +extern void func_80149704(void); +extern void func_8015ACC4(); +extern void func_80149724(void); +extern u8 D_80078EBF; +extern s32 func_80149744(struct S_80149744 *a0); +extern void func_8015F7A0(); +extern void func_80149788(void); +extern void func_801653B8(); +extern void func_80149864(void); +extern s16 currentLocationId; +extern s32 func_8016F1AC(void); +extern s32 func_80149884(void); +extern void func_80160B00(); +extern void func_801498C0(void); +extern s32 func_80149AA8(s32 *a0); +extern s32 func_80149B54(s32 *a0); +extern void func_80146750(void *a0); +extern s32 func_801498E0(s32 *a0); +extern s32 func_8012E5CC(s32 a0, s32 a1, s32 a2); +extern void func_80147364(u16 a0, s32 a1); +extern s32 func_800CCF28(s32 a0); +extern s32 func_80149954(s32 s0); +extern s32 func_80149A64(s32 *a0); +extern void func_8015DAC4(s32 *a0); +extern void func_8015554C(s32 *a0); +extern void func_80149AD4(s32 *a0); +extern void func_80149B14(s32 *a0); +extern u8 func_8014BEF8(void); +extern s32 func_80149B54(s32 * arg0); +extern void func_8015DE24(s32 *a0); +extern void func_80157510(s32 *a0); +extern void func_80149BAC(s32 *a0); +extern s32 func_80029178(s32 a0); +extern s32 func_80149C08(s32 arg0); +extern void func_801577C8(); +extern void func_80149C94(void); +extern void func_80157D20(void); +extern void func_80149CB4(void); +extern s32 func_80149CD4(s32 a0); +extern u8 func_8014B5B8(s32 *a0); +extern s32 func_80149D10(s32 a0); +extern s32 func_80149E94(s32 a0); +extern s32 func_80149DD8(s32 a0); +extern s32 func_80149D9C(s32 a0); +extern s32 func_80149F2C(s32 a0, s32 a1); +extern s32 func_80149E94(s32 arg0); +extern void func_80149FA8(void); +extern s32 D_8018CFFC[]; +extern u8 D_80078E78[]; +extern s32 func_80149FB0(s32 a0); +extern s32 func_80135260(s32 arg0, s32 arg1, s16 *arg2, s16 *arg3); +extern void func_8014A1B0(s32 a0, s32 a1); +extern s32 func_8014A048(s32 param_1); +extern u16 func_80156370(u16 a0); +extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4); +extern void func_8015D4B4(); +extern void func_8014A218(void); +extern s32 func_8014C278(s32 a0, s32 a1, s32 a2); +extern s32 func_8014C2B0(void *a0, void *a1, s32 a2); +extern s32 func_8014A238(s32 arg0); +extern s32 func_8014A2E4(s32 a0); +extern void func_8014A380(s32 a0, s32 a1); +extern s16 D_801152B0; +extern s16 D_801152B4; +extern s32 func_8014A3E0(struct S_8014A3E0 *a0); +extern s32 func_8014A454(s32 a0); +extern s32 func_8014A4B4(void *a0); +extern void func_8015EDD4(); +extern void func_8014A4FC(void); +extern s32 func_8014A674(s32 *a0); +extern s32 func_8014A69C(s32 *a0); +extern s32 func_8014A6C4(s32 a0); +extern void func_8015E184(); +extern void func_8014A830(void); +extern s32 func_80029AF4(void); +extern s32 func_8014A850(s32 param_1); +extern void func_8014AA04(s32 a0); +extern void func_801599A4(void *a0); +extern void func_80159B3C(void *a0); +extern s32 func_80165A20(s32 a0); +extern void func_8014AB7C(); +extern void func_8014AC10(); +extern void func_8014AA28(void); +extern void func_8014AB5C(void); +extern void func_80162CCC(void); +extern void func_8014AB7C(s32 arg0); +extern void func_8014ABF0(void); +extern void func_80016714(void *a0, s32 a1); +extern void func_8014AC10(s32 arg0); +extern void func_8014ACC0(s32 a0, s32 a1); +extern void func_8014AD30(s32 a0, u16 *a1, s32 a2, s32 a3); +extern void func_8014ACE8(void *a0, s32 a1, s32 a2); +extern void func_80146AFC(void *a0); +extern void func_8014ADA8(s32 a0, s32 a1); +extern void func_8014AD7C(s32 a0); +extern s32 D_80078E8C; +extern void func_8014B034(s32 arg0); +extern void func_8014B00C(s32 arg0); +extern void func_8014B084(void); +extern s16 D_80078E90; +extern void func_8014B034(s32 a0); +extern u16 D_80078EAC; +extern u8 D_80078EBA; +extern void func_800D10EC(void); +extern void func_8002AC98(void); +extern s32 func_8014B154(s32 *a0); +extern void func_8014B12C(void); +extern void func_8014B2F8(void); +extern void func_8014B4C4(void); +extern void func_8014B160(s32 a0); +extern s32 func_8016F1C4(void); +extern s16 D_80078E96; +extern s16 D_80078EB8; +extern u16 D_80078EA6; +extern void func_8014B2A8(void); +extern void func_8014B310(void); +extern void func_8014B2D0(void); +extern s32 D_80078E94; +extern s32 D_80078ECC; +extern void func_8014B33C(void); +extern u8 D_80062BF4[]; +extern void func_8014BC80(s32 a0, s32 a1); +extern void func_80019064(void *a0); +extern s32 D_80078E98; +extern void func_80166244(); +extern void func_8014B4D4(void *a0); +extern s16 D_80078E9A; +extern u8 D_80126D1C; +extern s32 D_80126D74; +extern void func_8014B598(s32 a0, s32 a1); +extern void func_8014B5B0(s32 *a0); +extern void func_8014B5C4(s32 *a0, s32 a1, s32 a2); +extern void func_8014B5D8(s32 s1); +extern s32 D_80078E9C; +extern s32 D_80078ED0; +extern void func_8014B6F0(s32 a0, s32 a1); +extern void func_8014B768(s32 a0, s32 a1); +extern void func_8014B944(s32 a0, s32 a1, s32 a2); +extern s32 D_80078EA4; +extern u16 D_80078EB2; +extern s16 D_80078EB4; +extern void func_8014BB0C(void); +extern void func_8014BB24(s32 a0, s32 a1, s32 a2); +extern void func_8014BC0C(s32 a0, s32 a1); +extern void func_8014BC44(s32 a0, s32 a1); +extern u8 D_800B9A17; +extern void func_8014BCC0(s32 a0, s32 a1); +extern u16 D_80078EB6; +extern s32 func_8014BCEC(s32 a0, s32 a1); +extern void func_8014BD24(s32 a0, s32 a1); +extern void func_8014BD60(s32 param_1, s32 param_2); +extern void func_8014BD98(s32 a0, u16 a1); +extern void func_8014BDC8(void); +extern void func_8014BDE0(void); +extern s32 func_8017267C(s32 *a0); +extern s32 func_80013294(void *a0, void *a1); +extern void func_80029ED4(s32 a0); +extern void func_8014BDE8(s32 a0); +extern void func_8014BE78(void); +extern void func_8014BE9C(void); +extern void func_80029124(s32 a0, s32 a1); +extern void func_8014BEC0(void); +extern void func_8014BF18(s32 a0); +extern void func_8014BF48(void); +extern u8 func_8014BF6C(void); +extern void func_8014BF8C(u8 arg0); +extern void func_8014BFB0(void); +extern u8 func_8014BFD4(void); +extern void func_8014BFF4(s32 a0, s32 a1); +extern void func_8014C010(s32 a0, s32 a1); +extern s32 func_8014C050(s32 a0, s32 a1); +extern s32 func_8014C088(s32 a0, s32 a1); +extern s32 func_8014C0C8(s32 a0_unused, s32 a1, s32 a2); +extern s32 func_8014C118(void * a0, s32 a1, s32 a2); +extern s32 func_8014C168(s32 * param_1, s32 param_2); +extern void func_8014C1C8(s32 arg0, s32 arg1, void *arg2); +extern u8 D_8018D084[]; +extern void func_8014C1A0(s32 arg0, s32 arg1); +extern s32 func_80013328(s32 a0, s32 a1); +extern s32 func_8014C59C(void *a0, void *a1); +extern s32 func_8014C308(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8014C43C(void *a0, s32 a1, s32 a2, s32 a3, s16 a5); +extern s32 func_8014C3A4(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C3D0(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C43C(void * a0, s32 a1, s32 a2, s32 a3, s16 a4); +extern s32 ratan2(s32 dx, s32 dy); +extern u8 D_8018D08C; +extern s32 func_8014C5FC(s32 a0, s32 a1, void *a2); +extern s16 func_8014C5D0(s32 a0, s32 a1); +extern s32 func_8014C5FC(s32 a0, s32 a1, void * a2); +extern u8 D_80126D17; +extern void func_8014C6AC(void); +extern void func_8014C6C0(void); +extern u8 D_80126D1E; +extern void func_8014C6D0(void); +extern void func_8014C6E0(void); +extern s32 func_8014C860(s32 a0, s32 a1); +extern void func_8014C8C8(s32 a0, s32 *a1); +extern void func_8014C88C(s32 a0); +extern void func_8014C8C8(s32 dst, s32 * src); +extern void func_8014C8F0(s32 arg0); +extern u8 D_801151F0[]; +extern s32 func_8014C918(s32 a0, s32 a1); +extern s32 D_80126B50; +extern void func_8014C968(void); +extern void func_8014C978(void); +extern s32 func_8014C98C(void); +extern void func_80139914(s32 a0); +extern s32 func_8014CA00(s32 a0); +extern u16 func_8014CA70(s32 a0, s32 a1); +extern s32 func_8014CA14(s32 a0, s32 a1); +extern u16 func_8014CAE4(s32 *a0, s32 a1); +extern s32 func_8014CA88(s32 *a0, s32 a1); +extern s32 func_8014CAFC(void); +extern s32 func_8014CB0C(void); +extern s32 func_8014CB1C(void); +extern u8 D_80126D1F; +extern s32 func_8014CB2C(void); +extern s32 func_8014CB58(void); +extern u8 D_80126D1D; +extern void func_8014CB68(void); +extern s32 func_8014CB7C(void); +extern s32 func_8014CB8C(void); +extern short D_80126C9E; +extern void func_8014CB9C(struct Packed8 *a0); +extern s32 D_80126CDC; +extern void func_8014CBD8(void); +extern s16 D_80126CC4; +extern void func_8014CBE8(void); +extern void func_8014CBF8(void *a0); +extern void func_8014D3E0(s32 a0); +extern void func_8014D04C(void); +extern void func_8014CCB4(void); +extern void func_8014CC28(s32 a0); +extern void func_8014CD0C(u8 *a0); +extern s32 func_8014CF04(s32 a0, s32 a1, void *a2); +extern void func_8014CD80(s32 a0, void *a1, void *a2); +extern void func_8014D0A4(s32 a0); +extern s32 func_8014D2A0(s32 a0, void *a1, void *a2); +extern s32 func_8014D12C(s32 a0, void *a1, void *a2); +extern void func_8014D438(s32 a0); +extern void func_8014D3E0(s32 _arg0); +extern void func_8014D610(s32 a0, void *a1, void *a2); +extern s32 func_8014D4C0(s32 a0, void *a1, void *a2); +extern void func_8014D790(s32 a0); +extern void func_8014D738(void); +extern s32 func_8014DD8C(s32 a0, void *a1, void *a2); +extern s32 func_8014D820(s32 a0, u16 *a1, u16 *a2); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014DCE0(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_8014DD8C(s32 arg0, void *arg1, void *arg2); +extern void func_8014DF94(s32 arg0); +extern void func_8014DF3C(void); +extern s32 func_8014E284(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E048(s32 a0, u16 *a1, u16 *a2); /* u16*: def lhu semantics (T5b reconcile; ptr param type codegen-neutral for the caller) */ +extern s32 func_80135A4C(s32 a0, s32 a1, s32 *a2, s32 a3); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern u8 D_801152A8[]; /* canonical TU type (engine_core) — read via *(u16*) cast */ +extern s16 D_801152AC; +extern s32 func_8014E048(s32 param_1, u16 * param_2, u16 * param_3); +extern void func_8014E48C(s32 a0); +extern void func_8014E434(void); +extern void func_8014E5B4(s32 a0, void *a1, void *a2); +extern s32 func_8014E514(u8 *a0, s32 a1, s32 a2); +extern void func_8014E6F8(struct SubE6F8 *a0); +extern void func_8014E6A0(void); +extern s32 func_8014E83C(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014E83C(s32 arg0, s16 * arg1, s16 * arg2); +extern void func_8014E934(s32 _arg0); +extern s32 func_8014EA4C(void *a0, void *a1, void *a2, s32 a3); +extern s32 func_8014E98C(void *a0); +extern u16 D_800B99DA; +extern s32 D_801150D8; +extern s16 D_801152AA; +extern u8 D_80126720[]; +extern s16 D_80126724; +extern s32 func_8014EA4C(void * a0, void * a1, void * a2, s32 _arg3); +extern s32 func_8014ED80(struct SubED80 *a0); +extern int D_801D1C88; +extern void func_8014ED28(s32 _arg0); +extern s32 func_8014EE14(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014EE14(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F24C(struct SubF24C *a0); +extern void func_8014F1F4(void); +extern s32 func_8014F2E0(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014F2E0(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F4C0(); +extern s32 func_8014F468(void); +extern int func_8014F74C(); +extern int func_8014F6F4(void); +extern u8 D_800D3918[]; +extern u8 D_801152A8[]; +extern s32 D_801152BC; +extern int func_8014F74C(s32 arg0); +extern s32 func_8014FA70(s32 a0); +extern s32 D_801D1C8C; +extern void func_8014FA04(s32 a0); +extern s32 func_8014FBC0(); +extern s32 func_8014FC18(u8 *self); +extern int func_8014FD54(int param_1); +extern void func_8014FCFC(void); +extern void func_80150170(void *a0); +extern s32 func_8014FE60(void *a0); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_8014FE60(void *e); +extern s32 func_80134510(s32 arg); +extern s32 func_80150150(s32 a, s32 b); +extern s32 func_80150460(s32 a, s32 b); +extern void func_801504D8(u16 *a0); +extern s32 func_80150480(s32 _arg0); +extern s32 func_80150528(void *a0, void *a1, void *a2); +extern s32 func_80150528(void *arg0, void *arg1, void *arg2); +extern s32 func_801506A4(s32 a0, s32 a1); +extern s32 func_801505FC(s32 a0); +extern s32 func_801506A4(s32 arg0, s32 arg1); +extern void func_80150820(s32 a0, s32 a1); +extern void func_8015086C(int param_1); +extern s32 func_801508B4(s32 a0); +extern s32 func_8015094C(s32 a0); +extern short func_801508F8(s32 a0); +extern s32 D_8018D0BC; +extern s32 D_80126990; +extern s32 D_80126994; +extern s32 func_80021174(s32 a0, s32 a1); +extern s32 func_8015094C(s32 param_1); +extern void func_80150B9C(void); +extern s32 func_80151184(s32 a0, s32 a1, s32 a2); +extern s32 func_80150BA4(s32 a0); +extern s32 func_801619D0(void *a0); +extern void func_80150BC8(s32 *a0); +extern s32 func_80150480(s32 a0); +extern u16 D_800AE6DC; +extern void func_80150C48(s32 a0); +extern int func_80151184(int arg, int a1, int a2); +extern int func_80150CA0(int arg); +extern void func_80150EC4(s32 a, s32 b); +extern void func_80150CC4(s32 a); +extern void func_80150CE4(s32 a); +extern void func_80150D04(s32 a); +extern void func_80150D24(s32 a); +extern void func_80150D44(s32 a); +extern void func_80150D64(s32 a); +extern void func_80150D84(s32 a); +extern void func_80150DA4(s32 a); +extern void func_80150DC4(s32 a); +extern void func_80150DE4(s32 a); +extern void func_80150E04(s32 a); +extern void func_80150E24(s32 a); +extern void func_80150E44(s32 a); +extern void func_80150EC4(s32 a0, s32 a1); +extern void func_80150E64(s32 a0); +extern void func_80150E84(s32 a0); +extern void func_80150EA4(s32 a0); +extern u8 D_800AE6C0; +extern s16 D_800AE6C8; +extern s16 D_800AE6CA; +extern s16 D_800AE6CC; +extern s32 D_800AE6C4; +extern s16 D_800AE6CE; +extern u8 D_800AE6BE; +extern u8 D_801201F8[]; +extern void func_80150F78(void); +extern void func_80150F80(s32 a0); +extern int func_80150FB4(int arg); +extern void func_80150FD8(s32 a0); +extern int func_80151014(int arg); +extern void func_80151038(s32 a0); +extern int func_80151070(int arg); +extern int func_80151094(int arg); +extern void func_801510B8(void); +extern void func_801510C0(void); +extern int func_801510C8(int arg); +extern int func_801510EC(int arg); +extern s32 func_8012DB84(void); +extern s32 func_80151110(void); +extern void func_80151130(void); +extern int func_80151138(int arg); +extern void func_8015115C(s32 *a0, s16 a1); +extern s32 func_80151164(s32 a0, s32 a1); +extern s32 func_80151184(s32 arg0, s32 arg1, s32 arg2); +extern void func_801511A8(u8 *a0); +extern void func_801511C4(u8 *a0); +extern int func_80151204(int arg, int a1); +extern int func_801511E0(int arg); +extern int func_80151204(int a0, int a1); +extern void func_80151238(void *a0); +extern void func_8015126C(u16 *p); +extern void func_80151780(s32 a0); +extern void func_801516F0(s32 *a0); +extern void func_8015173C(s32 *a0); +extern s16 D_8011DB1A; +extern s32 D_80127518; +extern s32 D_801151FC; +extern s32 func_801725CC(u8 *a0); +extern s32 func_80029D3C(void); +extern void func_80151878(void); +extern void func_80153B58(s32 *a0); +extern s32 func_80151880(s32 a0); +extern s32 func_801518D8(s32 a0); +extern s32 func_80151944(void); +extern s32 func_80151924(void); +extern void func_8014E934(s32 a0); +extern s32 func_8014F3E8(s32 a0); +extern void func_801519C8(s32 a0); +extern void func_80151980(s32 a0); +extern M2C_UNK D_800D5880; +extern s32 D_800D58AC; +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_801519C8(s32 arg0); +extern void func_80151C54(s32 a0); +extern void func_801542DC(s32 *a0, s32 a1); +extern void func_8015BDD0(s32 *a0); +extern void func_80165718(s32 a0); +extern u8 D_800D46E4[]; +extern void func_80151AE4(s32 arg0); +extern void (*D_8018D164[])(void); +extern void func_80151D24(void *a0); +extern void func_80151DB0(s32 a0); +extern void func_80151D60(void *a0); +extern s32 func_80172630(u8 *a0); +extern s32 D_80062C14; +extern void func_80151DB0(s32 param_1); +extern void func_80151E78(s32 *a0); +extern void func_80151ECC(struct S80151ECC *a0); +extern void func_80151FB4(s32 a0); +extern void func_80151F38(s32 *a0); +extern void func_801553C0(s32 a0); +extern void func_80153C18(); +extern void (*D_8018D188[])(void); +extern void func_80152058(void *a0); +extern void func_801520DC(s32 a0); +extern void func_80152094(s32 a0); +extern void func_80147324(s32 a0); +extern u8 D_80062C04[]; +extern M2C_UNK D_8018D178; +extern void func_801520DC(s32 arg0); +extern void func_801470B4(s32 a0); +extern void func_8015369C(s32 a0); +extern void func_80152194(s32 *a0); +extern s32 func_801536DC(s32 a0); +extern void func_8015220C(s32 a0); +extern s32 func_80153800(s32 a0); +extern void func_801522CC(s32 a0); +extern void func_80152254(s32 *a0); +extern void (*D_8018D19C[])(void); +extern void func_80152370(void *a0); +extern void func_801523F4(s32 a0); +extern void func_801523AC(s32 a0); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern u8 D_8018D1A8[]; +extern void func_801523F4(s32 arg0); +extern void func_801525F4(int); +extern s32 func_801535F4(void *arg0); +extern void func_8015BF48(s32 *a0); +extern void func_80152500(int param_1); +extern void func_801525F4(s32 a0); +extern void (*D_8018D1B8[])(void); +extern void func_80152698(void *a0); +extern void func_80152714(s32 a0); +extern void func_801526D4(s32 a0); +extern void func_80152790(s32 a0); +extern void (*D_8018D1D0[])(void); +extern void func_8015282C(void *a0); +extern void func_801528B0(s32 a0); +extern void func_80152868(s32 a0); +extern M2C_UNK D_8018D1C0; +extern void func_801528B0(s32 arg0); +extern void func_8015294C(s32 a0); +extern void func_80152A08(s32 a0); +extern void func_80152AC8(s32 a0); +extern void func_80152A50(s32 *a0); +extern void (*D_8018D1E4[])(void); +extern void func_80152B6C(void *a0); +extern void func_80152BF0(s32 a0); +extern void func_80152BA8(s32 a0); +extern void func_80152C80(s32 *a0); +extern void func_80152C40(s32 *a0); +extern void (*D_8018D200[])(void); +extern void func_80152D24(void *a0); +extern void func_80152DA8(s32 a0); +extern void func_80152D60(s32 a0); +extern M2C_UNK D_8018D1F0; +extern void func_80152DA8(s32 arg0); +extern void func_80152E4C(s32 a0); +extern void func_80152EFC(s32 a0); +extern void func_80152FBC(s32 a0); +extern void func_80152F44(s32 *a0); +extern void (*D_8018D214[])(void); +extern void func_80153060(void *a0); +extern void func_801530E4(s32 a0); +extern void func_8015309C(s32 a0); +extern void func_80155440(s32 *a0); +extern void func_801530E4(s32 arg0); +extern void func_80153150(struct S80153150 *a0); +extern void func_801531BC(s32 a0); +extern void func_8015327C(s32 a0); +extern void func_80153204(s32 *a0); +extern void (*D_8018D228[])(void); +extern void func_80153320(void *a0); +extern void func_801533A4(s32 a0); +extern void func_8015335C(s32 a0); +extern void func_80153410(s32 *a0); +extern void func_80153490(s32 a0); +extern void func_80153550(s32 a0); +extern void func_801534D8(s32 *a0); +extern void (*D_8011DB28)(s32 a0); +extern s32 func_801536DC(s32 param_1); +extern void func_800139C8(s32 a0, void *a1, void *a2); +extern s32 func_80153978(s32 a0, u16 *src); +extern s32 func_80133784(s32 a0, void *src, s32 dst); +extern s32 func_801539F8(s32 a0, void *a1); +extern s32 func_801539F8(s32 a0, void * a1); +extern s32 func_8016DA04(s32 a0); +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); +extern void func_80153C18(void); +extern u16 D_8011F748; +extern void func_80153C30(void); +extern void func_80153C74(s16 a0, s16 a1); +extern s16 D_8011DB18; +extern void func_80153C44(int a0, int a1, s16 a2); +extern s16 D_8011DB0C; +extern s32 D_80115210; +extern void func_80153C8C(void); +extern void func_80153C9C(void); +extern s32 func_80153CBC(void); +extern s32 D_8018D23C; +extern void (*D_8018D264[])(void *a0); +extern void func_80153CCC(S80153CCC *a0); +extern void func_80153D7C(s32 a0); +extern void func_80153D34(s32 a0); +extern u8 D_8018D244; +extern void func_80153D7C(s32 param_1); +extern void func_8015410C(void); +extern void func_80153E00(s32 param_1); +extern void func_80151664(void); +extern void func_80154134(u8 *a0); +extern void func_80154190(u8 *a0, s32 a1); +extern void func_80154150(s32 a0, s32 a1); +extern void func_80154218(u8 *a0, s32 a1, s32 a2); +extern void func_801541D8(u8 *a0, s32 a1, s32 a2); +extern s32 func_801549F8(s32 a0, s32 a1, s32 a2); +extern void func_801542A4(); +extern void func_801542A4(s32 *a0, s32 a1); +extern void func_8015430C(); +extern void func_8015430C(u8 *arg0, s32 arg1, s32 arg2); +extern void func_8015444C(void *a0, s32 *a1, s32 *a2, s32 *a3); +extern s32 func_80154358(void * arg0); +extern void func_80154AB4(s32 a0, s32 a1); +extern void func_80154B20(s32 a0, s32 a1, s32 a2); +extern void func_80154AE0(s32 a0, s32 a1, s32 a2); +extern void func_80154B7C(u8 *a0, s32 a1); +extern void func_80154B4C(u8 *a0, s32 a1); +extern void func_80154BC8(void *a0, s32 a1, s32 a2); +extern void func_80154B98(void *a0, s32 a1, s32 a2); +extern u8 D_800D8D10[]; +extern s16 D_80078E9E; +extern void func_801550FC(s32 a0); +extern void func_80154ED8(s32 a0, s32 a1); +extern void func_80154F9C(s32 a0); +extern void func_800183E0(s32 a0); +extern void func_801550FC(s32 arg0); +extern void func_8001D150(s32, s32); +extern void func_8001D130(int, int); +extern void func_80155150(int param_1); +extern s32 D_800DE2A4[]; +extern void func_801552F4(s32 a0); +extern void func_80155344(s32 a0); +extern s32 func_80155394(s32 *a0); +extern void func_801553A8(s32 *a0); +extern s32 func_80029178(s32); +extern int (*D_8018D2B0[])(void); +extern s32 func_80155458(s32 param_1); +extern s32 func_801659DC(u8 *a0); +extern s32 func_801554B8(void *arg0); +extern void func_801555F4(void *a0); +extern void func_80155518(s32 *a0); +extern void func_80155580(void *a0); +extern void (*D_8018D2B4[])(void); +extern s32 func_80161104(void); +extern void func_801555F4(void *); +extern void func_801555BC(void *a0); +extern s32 func_80155800(s32 arg0); +extern int func_80155A44(int param_1); +extern int func_80161208(); +extern u8 D_800D4DA8[]; +extern void func_80155B20(s32 *a0); +extern s32 D_800D4DB4; +extern void func_80155B9C(s32 a0); +extern u8 D_800D4DD4[]; +extern void func_80155C0C(s32 *a0); +extern void func_8014ED28(s32 a0); +extern int func_80155FF8(int arg, int a1); +extern s32 D_800D4DF4; +extern void func_80155C64(s32 a0); +extern void func_8015E880(s32 *a0); +extern void func_80155D70(s32 param_1); +extern void func_80155E30(void *a0); +extern s32 func_80161208(); +extern void func_80155EA4(void *arg0); +extern void func_80155F58(void); +extern s32 func_80155F80(); +extern s32 func_80155F60(void); +extern s32 func_80155F80(s32 a0); +extern int func_80155FB0(int arg, int a1); +extern int func_80155FD4(int arg, int a1); +extern int func_80156044(int arg, int a1); +extern s32 func_80029B4C(s32 a0, s32 a1); +extern s32 func_80029BC8(s32 a0, s32 a1); +extern s32 func_80029C44(s32 a0, s32 a1); +extern s32 func_8015640C(s32 a0, s32 a1); +extern s32 rand(void); +extern u32 func_8015616C(s32 param_1, u16 param_2); +extern u16 func_80156370(u16 param_1); +extern s32 func_801564B0(s32 a0); +extern s32 func_8002A1B4(void); +extern s32 func_8002A400(void); +extern s32 func_8002A670(void); +extern s32 func_8002A8E0(void); +extern s32 D_801151E0[]; +extern s32 func_801565C0(void); +extern void func_80156A14(s32 *a0); +extern void func_80156648(s32 *a0); +extern u8 D_8011DAD8[]; +extern s32 func_8014C568(void *a0); +extern void func_801567BC(s32 a0); +extern u8 D_80126730[]; +extern void func_80156848(s32 param_1, s32 param_2); +extern unsigned char D_8011520C[]; +extern unsigned short D_8018D718[]; +extern void func_80156A1C(s32 param_1, s32 param_2); +extern s32 D_801150E0[]; +extern void func_80156A88(s32 a0, s32 a1); +extern void func_80156B74(s32 param_1, u32 param_2, u8 *param_3); +extern void func_80156ECC(int param_1, int param_2, int param_3, int param_4, int param_5); +extern void func_80156FA8(s16 *param_1, s16 *param_2, s16 *param_3); +extern void func_80157158(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern s32 func_80135004(s32 a0, void *a1, s32 a2); +extern u32 func_801571C4(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801575E4(void *a0); +extern void func_801574DC(s32 *a0); +extern void func_80157544(void *a0); +extern void (*D_8018D728[])(void); +extern void func_8014CC28(s32 a0); /* defined */ +extern s32 func_8014F3E8(s32 a0); /* declared */ +extern void func_8015BDD0(s32 *a0); /* defined */ +extern void func_801575E4(void *a0); /* defined */ +extern void func_80157580(s32 arg0); +extern u8 D_800D4F14[]; +extern void func_801576A8(void *arg0); +extern s32 func_8015773C(u8 *a0); +extern s32 func_8015771C(u8 *a0); +extern s32 func_8015773C(u8 * arg0); +extern int D_801D1CC0; +extern void func_801578C0(s32 a0); +extern void func_80157788(int param_1); +extern void func_801577C8(s32 arg0); +extern void (*D_8018D750[])(void); +extern void func_80157808(void *param_1); +extern void func_80157880(s32 a0); +extern s32 func_801725A4(u8 *a0); +extern u8 D_800D5128; +extern u8 D_8018D730; +extern void func_801578C0(s32 param_1); +extern void func_80147A84(int); +extern void func_80148038(int, int); +extern void func_80147460(int); +extern void func_80146D90(int); +extern void func_80161450(void *a0); +extern void func_80157A8C(int); +extern void func_80154A74(int, int); +extern unsigned char D_800D5178; +extern unsigned char D_8018D740; +extern void func_8015795C(int param_1); +extern void func_80161D20(s32 a0, s32 a1); +extern void func_80157A8C(s32 a0); +extern void func_8016706C(s32 a0); +extern u8 D_800D51AC[]; +extern void func_80157AC8(s32 param_1); +extern void func_80157B74(int param_1); +extern void func_8016158C(void *a0); +extern void func_8015BE04(s32 *a0); +extern void func_80157BC8(s32 a0); +extern void func_80157CCC(s32 a0); +extern void func_80157DC4(void *a0); +extern void func_80157FC4(void *a0); +extern void func_80157D74(u16 *a0); +extern void (*D_8018D790[])(void); +extern void func_80157E38(void *); +extern void func_80157E00(void *a0); +extern void func_80157E38(void * a0); +extern s32 func_80157F64(s32 *a0); +extern s32 func_80156600(void *a0); +extern void func_80157EA4(void *a0); +extern void (*D_8018D798[])(void); +extern void func_80158038(void *); +extern void func_80158000(void *a0); +extern s32 D_800D51E0; +extern s32 D_8018D764; +extern void func_80158038(void * param); +extern u8 D_800D524C[]; +extern void func_80161418(void *a0); +extern void func_801580B4(s32 a0); +extern void func_801581AC(s32 a0); +extern void (*D_8018D7A4[])(void); +extern void func_8015824C(void *a0); +extern void func_801582C0(void *); +extern void func_80158288(void *a0); +extern u8 D_800D52A8[]; +extern void func_801585A4(s32 *a0); +extern void func_801582C0(void *a0); +extern s32 func_801585AC(s32 *a0); +extern u8 D_800D52E8[]; +extern void func_80158344(s32 *a0); +extern s32 func_801615C4(void *a0, s32 a1); +extern u8 D_8018D774; +extern u8 D_800D533C; +extern void func_80158434(s32 param_1); +extern void func_80158548(s32 param_1); +extern void func_801585EC(u8 *a0); +extern void func_80158794(void); +extern s32 D_801D1CC8; +extern s32 D_801D1CD4; +extern s32 D_801D1CD8; +extern void func_80158880(s32 *param); +extern void func_8015879C(s32 param_1); +extern void func_80158814(void *arg0); +extern void (*D_8018D7E0[])(s32 *); +extern void func_80158AE4(void *a0); +extern void func_80158AB4(void *a0); +extern void func_8016F264(void); +extern void func_80165840(void); +extern void func_801658DC(void); +extern void func_80165A78(s32); +extern void func_80158AE4(void * a0); +extern M2C_UNK D_800D58D8; +extern void func_80158BB0(void *arg0); +extern s32 func_80159404(s32 a0, s32 a1); +extern void func_80158C40(s32 *a0); +extern void func_80158CD8(s32 *a0); +extern s32 func_80159434(s32 a0, s32 a1); +extern void func_80158D60(s32 a0); +extern M2C_UNK D_800D5904; +extern void func_80158E24(s32 *a0); +extern s32 D_8018D7B4[]; +extern int rand(void); +extern s32 func_8013767C(s32 a0); +extern void func_80158F00(int param_1); +extern u8 D_80110C3C[]; +extern s32 func_801399F0(s32); +extern void func_80139914(s32); +extern s32 func_80159464(void); +extern void func_801594E8(s32, s32); +extern void func_80158FA4(s32 param_1); +extern s32 func_801399F0(s32 a0); +extern u8 D_80110C94[]; +extern u8 D_80110CD4[]; +extern void func_80159070(void *a0); +extern s32 func_80029A94(s32); +extern void func_80175454(void); +extern void func_800298BC(void *); +extern void func_8002992C(s32); +extern void func_800CF804(void); +extern void func_800CF818(void); +extern u8 D_80110D0C[]; +extern void func_80159120(s32 a0); +extern void func_801592CC(s32 *a0); +extern u8 D_800AE6BD; +extern s32 D_801D1CD0; +extern void func_8015934C(void *arg0); +extern void func_801593E4(A801593E4 *a0); +extern void (*D_8018DA30[])(void); +extern void func_80159698(void *a0); +extern s32 func_801596D4(void *a0); +extern void func_80174B6C(void); +extern void func_80129248(s16 a0); +extern void func_8013C938(void); +extern void func_8013CB20(void); +extern void func_8013C98C(void); +extern void func_8002850C(s32, s32, s32); +extern void func_80028620(s32, void *); +extern s16 D_800B9AAC[]; +extern s16 D_800B9B00; +extern u16 D_801270C0; +extern u32 D_800AFAE8[]; +extern char D_8018D850[]; +extern s32 func_801596F0(s32 param_1); +extern s32 func_80159874(void); +extern void func_800167B8(s32 a0); +extern s32 func_8015987C(s32 a0); +extern int func_800167F0(int arg); +extern int func_801598BC(void); +extern void func_80159968(void *a0); +extern void func_801598E0(u8 *a0); +extern void (*D_8018DAD4[])(void); +extern void func_80159A20(void *a0); +extern void func_801599E0(void *a0); +extern void func_80159A18(void); +extern void func_80159BE4(s32); +extern void func_80159B08(s32 *a0); +extern void func_80159B70(void *a0); +extern void func_80159B3C(void * a0); +extern void (*D_8018DC28[])(void); +extern void func_80159BAC(s32 a0); +extern s32 func_80172590(u8 *a0); +extern unsigned char D_8018DA44; +extern void func_80159BE4(s32 arg0); +extern void func_8015A1C8(s32 a0); +extern void func_8015A2D8(s32); +extern void func_8015A1FC(s32 *a0); +extern void func_8015A264(void *a0); +extern void func_8015A230(s32 *a0); +extern void (*D_8018DC30[])(void); +extern void func_8015A2A0(s32 a0); +extern int D_8018DA54; +extern s32 func_80172608(u8 *a0); +extern void func_8015A2D8(s32 param_1); +extern u8 D_800D48DC; +extern s32 func_8015AB7C(s32 a0); +extern s32 D_8011F9C4; +extern s32 func_8015ABD4(s32 a0, s32 a1, s32 a2); +extern s32 func_80161CD0(s32 a0, s32 a1); +extern M2C_UNK D_8018DA74; +extern void func_8015AC48(s32 arg0); +extern void func_8015AC90(s32 a0); +extern void func_8015ADB0(s32 a0); +extern void func_8015ACC4(s32 *arg0); +extern void func_8015AD3C(void *a0); +extern void func_8015AD08(void *arg0); +extern void (*D_8018DC38[])(void); +extern void func_8015ADB0(s32); +extern void func_8015AD78(s32 a0); +extern void func_8015ADB0(s32 arg0); +extern s32 D_800D4A9C; +extern int func_8015B6F4(int param_1); +extern u8 D_800D4F8C[]; +extern s32 func_8015B7B4(s32 a0); +extern u8 D_800D4BE0[]; +extern s32 func_8014A51C(void); +extern s32 func_8015B858(u8 *a0); +extern s32 D_800D4B48; +extern void func_8015B8F8(s32 *a0); +extern void func_8015BD8C(s32 *a0); +extern s32 func_8015BE94(); +extern void func_8015BE38(struct Obj *a0); +extern s32 func_8015BE74(void); +extern void func_80161124(void *a0); +extern s32 func_8015BE94(s32 *a0); +extern s32 func_8015AE2C(); +extern s32 func_8015BEC4(void); +extern s32 func_8015B950(s32 arg0); +extern s32 func_8015BEE4(void); +extern void func_8015BF04(s32 *a0); +extern void func_8015C0C4(s32 a0); +extern void func_8015BFF4(void *a0); +extern void func_8015BF7C(s32 *a0); +extern void func_8015C030(s32 *a0, s32 a1); +extern void func_8015BFB0(s32 *a0, s32 a1); +extern void (*D_8018DC60[])(void); +extern void func_8015C0C4(s32); +extern void func_8015C08C(s32 a0); +extern s32 func_8015C128(s32 param_1); +extern void func_8015C6A4(void); +extern void func_8015C788(s32 a0); +extern void func_8015C6AC(s32 *a0); +extern void func_8015C714(void *a0); +extern void func_8015C6E0(s32 *a0); +extern void (*D_8018DC6C[])(void); +extern void func_8015C788(s32); +extern void func_8015C750(s32 a0); +extern void func_8015CB94(s32 a0); +extern void func_8015CBCC(void); +extern void func_8015CBD4(void); +extern void func_8015CBDC(void); +extern void func_8015CBE4(void); +extern void func_8015CBEC(void); +extern void func_8015CBF4(void); +extern void func_8015CBFC(void); +extern void func_8015CC04(void); +extern void func_8015CC0C(s32 *param_1); +extern void func_8015CC74(s32 *a0); +extern void func_8015CC40(s32 *a0); +extern s32 func_8015CCD0(); +extern s32 func_8015CCB0(void); +extern s32 func_801725E0(u8 *a0); +extern s32 func_8015CCD0(s32 param_1); +extern s32 func_8015CD20(s32 arg0); +extern void func_8015CF24(s32 a0); +extern void func_8015D01C(); +extern void func_8015CF58(s32 *param_1); +extern void func_8015CFC0(s32 *a0); +extern void func_8015CF8C(s32 *a0); +extern void func_8015CFFC(void); +extern void func_8015D01C(int param_1); +extern void (*D_8018DAE0[])(void *); +extern s32 func_801725F4(u8 *a0); +extern void func_8015D104(void *arg0); +extern s32 D_8018DD10; +extern void func_8015D380(s32 a0); +extern unsigned char D_8018CDF4[]; +extern void func_8015D414(int param_1); +extern void func_8015D57C(s32); +extern void func_8015D480(s32 *a0); +extern s32 func_8015D4E8(s16 *a0); +extern void func_8015D4B4(s16 *a0); +extern void func_8015D524(s32 arg0); +extern void func_8015D544(s32 a0); +extern void func_801746DC(void); +extern void func_8015D57C(s32 arg0); +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern void func_80154150(int, int); +extern void func_80149374(int, int); +extern unsigned char D_8018DD24[]; +extern void func_8015D5E8(int param_1); +extern int func_8015E0D4(int); +extern void func_8015DA5C(s32 a0); +extern void func_8015DB6C(s32 a0); +extern void func_8015DA90(s32 *a0); +extern void func_8015DAF8(s32 *a0); +extern void func_8015DB6C(s32); +extern void func_8015DB34(s32 a0); +extern void func_8015DCB8(s32 a0); +extern void func_8014BD60(s32 a0, s32 a1); +extern int func_8015DD74(int); +extern void func_8015DBD4(void *arg0); +extern int func_8015DC84(int a0); +extern s8 D_8018DD60[]; +extern void func_8015DCB8(s32 param_1); +extern int func_8015DD74(int arg0); +extern void func_8015DECC(s32 a0); +extern void func_8015DDF0(s32 *a0); +extern void func_8015DE58(s32 *a0); +extern void func_8015DECC(s32); +extern void func_8015DE94(s32 a0); +extern void func_8015E018(s32 a0); +extern void func_8015DF34(void *arg0); +extern int func_8015DFE4(int a0); +extern void func_8015E018(s32 param_1); +extern int func_8015E0D4(int a0); +extern void func_8015E22C(s32 a0); +extern void func_8015E150(s32 *a0); +extern s32 func_8015E1B8(s32 a0); +extern void func_8015E184(s32 *arg0); +extern void func_8015E22C(s32); +extern void func_8015E1F4(s32 a0); +extern u8 D_800D4FF4[]; +extern u8 D_800D5098[]; +extern u8 D_800D5060[]; +extern s32 func_8014A850(s32 a0); +extern void func_8015E40C(s32 a0); +extern void func_8015E588(void); +extern void func_8015E4B0(s32 a0); +extern void func_8015E288(s32 a0); +extern u16 D_8018DDA8; +extern u16 D_8018DDAA; +extern u16 D_8018DDAC; +extern s32 D_8018DDB0; +extern void func_80013E94(void *a0, void *a1); +extern void func_8015E4B0(s32 param_1); +extern void func_8013C9C4(void *a0); +extern s32 D_8018DDB8; +extern void func_8015E5B0(u8 *self); +extern void func_8015E714(s32 *a0); +extern void func_8015E95C(s32); +extern void func_8015E84C(s32 *a0); +extern void func_8015E8E8(s32 *a0); +extern void func_8015E9B8(s32 *a0); +extern void func_8015E8B4(s32 *a0); +extern void func_8015E924(s32 a0); +extern void func_8015E95C(s32 a0); +extern s16 D_801152A0; +extern void func_80160818(s32 *a0); +extern void func_8015ED6C(s32 *a0); +extern void func_8015EE7C(s32); +extern void func_8015EDA0(s32 *a0); +extern s32 func_8015EE08(s32 a0); +extern void func_8015EDD4(s32 *arg0); +extern void func_8015EE44(s32 a0); +extern int D_800D4C48; +extern int D_8018DAC4; +extern void func_8015EE7C(s32 param_1); +extern void func_8015EEE0(void *arg0); +extern void func_8015EF9C(void); +extern void func_8015F080(s32); +extern void func_8015EFA4(s32 *a0); +extern void func_8015F00C(s32 *a0); +extern void func_8015EFD8(s32 *a0); +extern void func_8015F048(s32 a0); +extern void func_8015F080(s32 a0); +extern s32 D_80062BE8; +extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); +extern s32 func_80161208(void); +extern void func_8015F118(void *a0); +extern void func_8015F260(s32 *a0); +extern void func_8015F380(); +extern void func_8015F2BC(s32 *a0); +extern void func_8015F324(s32 *a0); +extern void func_8015F2F0(s32 *a0); +extern void func_8015F360(void); +extern s32 func_801725B8(u8 *a0); +extern void func_8015F380(void* arg0); +extern void func_8015F738(s32 *a0); +extern void func_8015F848(s32 *a0); +extern void func_8015F76C(s32 *a0); +extern s32 func_8015F7D4(s32 a0); +extern void func_8015F7A0(s32 *arg0); +extern void func_8015F810(s32 *a0); +extern void func_80147078(s32 *, s16); +extern void func_80159B70(void *); +extern void func_8015F89C(void *arg0); +extern void func_8015F948(s32 *param_1); +extern void func_8015F9A4(void *arg0); +extern void func_8015FA24(s32 arg0); +extern void func_8015FBE0(s32 *a0); +extern void func_8015FA44(s32 *a0); +extern void func_8015FAAC(s32 *a0); +extern void func_8015FA78(s32 *a0); +extern s32 func_801612B8(void *a0, s32 a1); +extern void func_8016007C(s32 a0); +extern void func_8015FAE8(void *arg0); +extern void func_8015FCC8(void *param_1); +extern unsigned int D_8018DE3C[]; +extern void func_8015FD74(int param_1); +extern s32 func_80028DE0(void); +extern u8 func_80165700(s32 a0, s32 a1); +extern void func_8015FDCC(s32 a0); +extern u8 D_80078EC2; +extern u8 func_801656E8(s32 a0, s32 a1); +extern void func_80165670(s32 a0, s32 a1); +extern void func_8016004C(s32 a0); +extern void func_8015FF20(void *param_1); +extern void func_801601AC(s32 *a0); +extern void func_801600D0(s32 *a0); +extern void func_80160138(s32 *a0); +extern void func_80160104(s32 *a0); +extern void func_80160174(s32 *a0); +extern void func_801601E4(s32 *a0); +extern void func_80160244(s32 *a0); +extern void func_8016032C(void); +extern void func_80160410(s32 *a0); +extern void func_80160334(s32 *a0); +extern void func_8016039C(s32 *a0); +extern void func_80160368(s32 *a0); +extern void func_801603D8(s32 *a0); +extern u8 D_80062BD0; +extern void func_80160410(s32 * a0); +extern void func_801607B8(s32 *a0); +extern void func_801608C0(s32 *a0); +extern void func_801607E4(s32 *a0); +extern void func_8016084C(s32 *a0); +extern void func_80160888(s32 *a0); +extern void func_80160A28(s32 a0); +extern void func_80160A74(s32 *a0); +extern void func_80160BB4(s32 *a0); +extern void func_80160ACC(s32 *a0); +extern s32 func_80160B34(s32 a0); +extern void func_80160B00(s32 *arg0); +extern void func_80160B70(s32 a0); +extern void func_80160C28(void *arg0); +extern void func_80160CB4(s32 *a0); +extern void func_80160D10(void *arg0); +extern void func_80160DEC(u8 *a0); +extern void func_80160F00(); +extern void func_80160E3C(s32 *a0); +extern void func_80160EA4(); +extern void func_80160E70(s32 *a0); +extern void (*D_8018DEEC[])(void); +extern void func_80160EA4(void *a0); +extern void func_80160EE0(void); +extern void func_80160F00(void* arg0); +extern void func_800D0F4C(s32 a0); +extern u8 D_80110EC0; +extern void func_80160F70(s32 a0); +extern void func_80160FE0(s32 *a0); +extern void func_80161034(void *a0); +extern void func_80161094(s32 a0); +extern void func_801610FC(void); +extern void func_801483E8(void); +extern s32 func_80161A60(s32 a0); +extern void func_8016130C(void *a0, s32 a1); +extern void func_80161240(void *a0); +extern void func_80161374(void *a0, s32 a1); +extern void func_80161278(void *a0); +extern s32 func_801612B8(void * a0, s32 a1); +extern void func_8016163C(void *a0, s32 a1); +extern void func_80161774(void *a0, s32 a1); +extern s32 func_8016197C(s32 a0, s32 a1); +extern s32 func_80161488(void *a0); +extern void func_80161888(void *a0, s32 a1); +extern void func_801614E4(void *a0); +extern void func_8016191C(void *a0, s32 a1); +extern void func_8016151C(void *a0); +extern void func_80161554(void *a0); +extern s32 func_801615C4(void * arg0, s32 arg1); +extern s32 func_801619A4(s32 *a0); +extern s32 func_80161A00(s32 a0); +extern s32 func_80161A30(s32 a0); +extern int func_801497A8(void); +extern int func_80161BE0(void *param_1); +extern u16 D_8018DF1C[]; +extern void func_80161C98(int param_1, u32 param_2); +extern void func_80161E08(s32); +extern s32 func_80162438(s32); +extern s32 D_800AE6A8; +extern void func_800D1734(void *); +extern s32 D_8018DF80; +extern void func_80161D88(void); +extern void func_80161E08(s32 param_1); +extern int func_800291DC(int); +extern int func_800D0E30(void *a0); +extern int func_801620C4(void); +extern s32 func_800D0D7C(s32, s32); +extern int D_801D1CE0[]; +extern void func_8016216C(void); +extern u8 D_80078EB0; +extern u8 D_80078EB1; +extern s32 func_801621CC(s32 arg0); +extern void func_801622C4(void); +extern void (*D_8018DFA4[])(void); +extern void func_80162330(void *a0); +extern void func_8014706C(void *a0); +extern s32 func_8016236C(u8 *a0); +extern void func_800D0C48(s32 a0); +extern s32 func_801623B8(s32 *a0); +extern s32 func_800167F0(s32 a0); +extern s32 func_80162414(void); +extern s32 func_80162438(s32 _unused0); +extern int func_801626B8(void); +extern void func_80162714(void); +extern int D_801D1D38[]; +extern void func_80162760(void); +extern void func_801627C0(void); +extern void (*D_8018DFEC[])(void); +extern void func_80162834(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80162968(s32 a0); +extern s32 func_80162ACC(u8 *a0); +extern u8 D_800B5CB8; +extern s32 D_8018DFDC; +extern s32 D_800B5CBC; +extern u8 D_800B5CDF; +extern s32 D_800B5CEC; +extern void func_80162870(s32 param_1); +extern void func_801628F4(s32 *a0); +extern void func_80162968(s32 param_1); +extern void func_80162AC0(s32 *a0, s8 a1); +extern s32 func_80162AE0(u8 *a0); +extern void func_80162AF4(void); +extern void func_80162CC4(void); +extern s32 D_80126D40; +extern void func_80162B1C(void); +extern void func_80162D28(s32 *a0); +extern void func_80162D88(s32 *a0); +extern void func_80162DE8(s32 *a0); +extern void func_80162E48(s32 *a0); +extern void func_80162EA8(s32 *a0); +extern void func_80162F60(s32 arg0, s32 arg1); +extern void func_80162F80(s32 arg0, s32 arg1); +extern void func_80162FA0(s32 arg0, s32 arg1); +extern void func_80162F08(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80162FC0(s32 *a0); +extern void func_80162FF4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801630C4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163194(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg4); +extern void func_8016325C(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163234(s32 a0); +extern s32 D_80115100; +extern s32 func_801632E0(void); +extern s32 D_80115200; +extern s32 func_801632F0(void); +extern u16 D_80126B18[]; +extern void func_80163328(void); +extern s32 func_801633A8(void); +extern s32 func_80163408(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void func_80163534(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, u16 * a5); +extern void func_8016345C(s32 a0, u16 a1, s32 a2, u16 a3, s32 a4); +extern char D_801D154C[8]; +extern void *memcpy(void *dst, const void *src, unsigned int n); +extern void func_801634D8(s32 param_1, u16 param_2, u16 param_3, s32 param_4, u16 param_5); +extern void func_80157158(); +extern void func_80163664(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801636D0(s32 a0, s32 a1); +extern s32 func_8016380C(struct S8016380C *a0, s32 a1); +extern void *memcpy(void *dst, void *src, s32 n); +extern s32 func_801638A0(u8 *a0, s32 a1); +extern s32 func_80163950(s32 a0); +extern void (*D_8018DFF4[])(void); +extern void func_80163A58(void *a0); +extern void func_80163A94(s32 param_1); +extern void func_80163C2C(s32 param_1); +extern void func_80163EC8(s32 param_1); +extern void func_80164270(s32 *a0); +extern void func_80164418(void); +extern void func_80163764(s32 a0); +extern void func_801642AC(s32 a0); +extern void func_8016432C(s32 a0); +extern void func_80164410(void); +extern s32 func_80012DBC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164530(s32 arg0); +extern void (*D_8018E048[])(void); +extern void func_80164744(s32 param_1); +extern void func_8001C810(s32 a0, s32 a1); +extern void func_80164A74(s32 *a0); +extern void func_80164930(s32 a); +extern u16 D_800DF2E0; +extern s32 D_8018E010; +extern s16 D_8018E044; +extern s16 D_8018E042; +extern s16 D_8018E040; +extern void func_801647A4(int param_1); +extern void func_80164ACC(); +extern void func_80164864(void *a0); +extern void func_80164930(s32 param_1); +extern s32 func_8014C308(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164ACC(s32 a0); +extern void (*D_8018E054[])(void); +extern void func_80164BA0(void *a0); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80164DD0(s32 a0); +extern void func_80164DB0(void); +extern u8 D_801D1D98; +extern u8 D_801D1D99; +extern u8 D_801D1D9A; +extern u8 D_801D1D9B; +extern u8 D_801D1D9C; +extern u8 D_801D1D9D; +extern u8 D_801D1D9E; +extern u8 D_801D1D9F; +extern void func_80164BDC(s32 param_1); +extern void func_80164E40(void); +extern void func_80164CD4(u8 *a0); +extern void func_80164D4C(void *arg0); +extern void (*D_8018E064[])(void); +extern void func_80164EA4(void *a0); +extern void func_80165124(void *a0); +extern void func_80164EE0(int param_1); +extern s32 func_80165140(s32 a0); +extern void func_801651B8(void *a0); +extern void func_80164F44(void *arg0); +extern void func_80165024(void *a0); +extern void func_80165064(s32 *a0); +extern void func_801650C4(s32 *a0); +extern s32 func_80165140(s32 param_1); +extern s32 func_80165240(s32 a0, s32 a1, s32 a2); +extern s32 D_801D1DD8; +extern void func_801651B8(void * param_1); +extern u8 D_80126CF8; +extern void func_8016533C(void); +extern void func_801653F4(s32 a0); +extern void func_80165580(s32 a0); +extern void func_80165374(s32 a0); +extern void func_80165580(s32 _arg0); +extern void func_801653B8(s32 *a0); +extern s32 func_80165624(s32 a0); +extern u8 D_80078EC5; +extern void (*D_8018E0A8[])(void); +extern u8 func_80165658(s32 a0, s32 a1); +extern void func_800CAE0C(s32 a0); +extern void func_801654A8(s32 arg0); +extern void func_80165B28(void *a0); +extern void func_801655E4(s32 a0); +extern u8 D_8018E124[]; +extern s32 D_8018E144[]; +extern u8 D_8018E1C0[]; +extern u8 func_801656D0(s32 a0, s32 a1); +extern u8 D_8018E1E0[]; +extern u8 D_8018E200[]; +extern void func_800CAF6C(void); +extern void func_80165770(void); +extern void func_801657D8(void); +extern u8 D_80078EC3; +extern void func_801657A0(void); +extern s32 D_80078EA0; +extern s32 D_80078EA8; +extern u8 D_80078EBB; +extern s32 D_80078ED4; +extern s32 D_80078ED8; +extern s32 D_80078EDC; +extern u8 D_80078EE0; +extern void func_80165874(void); +extern s8 D_80078EC4; +extern void func_801658EC(void); +extern s32 func_80165900(void); +extern s32 func_80165910(void); +extern s32 D_8012672C; +extern s32 D_8012811C; +extern s32 D_80126B08; +extern void func_80165938(void); +extern void func_80165958(void); +extern s32 func_80165978(void); +extern void func_80165988(void); +extern s32 func_801659A8(void); +extern void func_801659B8(void); +extern s32 func_801659CC(void); +extern void func_80165A18(void); +extern s32 func_80165A50(s32 _arg0); +extern void func_80165AC8(void); +extern void func_80165A78(s32 arg0); +extern void (*D_8018E29C[])(void); +extern void func_80165B08(void); +extern void func_80165B10(void); +extern void func_80165B18(void); +extern void func_80165B20(void); +extern void (*D_8018E318[])(void); +extern void func_80165BB4(u8 *a0); +extern void func_80165B6C(u8 *a0); +extern void func_80165C58(s32 arg0); +extern void func_80165BFC(void *a0); +extern void func_80165C78(void); +extern M2C_UNK D_801D155C; +extern void func_80165E2C(u16 *arg0); +extern s32 func_80165FA4(s32 a0, s32 a1, s32 a2); +extern s32 func_80167DBC(s32 a0, s32 a1, s32 a2); +extern s32 func_80167AE0(s32 a0, s32 a1, s32 a2); +extern void func_80165E90(void); +extern void func_80020F34(s32 a0, s32 a1); +extern s32 func_80165FA4(s32 arg0, s32 arg1, s32 arg2); +extern void (*D_8018E324[])(void); +extern void func_80166018(void *a0); +extern void func_80166054(s32 arg0); +extern void func_801661CC(s32 param_1); +extern void func_80166244(void* arg0); +extern void func_8016629C(void *a0); +extern void func_801662F4(void *a0); +extern void func_8016634C(void *a0); +extern void func_801663A4(void *a0); +extern void (*D_8018E32C[])(void); +extern void func_801663FC(void *a0); +extern u8 D_800D387C[]; +extern u8 D_800D3888[]; +extern s32 func_800D21C4(s32 a0, void *a1, s32 a2); +extern void func_800D1FC8(s32 a0, s32 a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_801665B4(); +extern void func_80146C3C(); +extern void func_80166438(u8 *a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_800D22E4(s32 a0); +extern void func_801665B4(s32 *a0); +extern void (*D_8018E3F4[])(void); +extern void func_80166618(void *a0); +extern void (*D_8018E404[])(void); +extern void func_80166654(void *a0); +extern s32 func_80166690(s32 param_1, s32 param_2); +extern s32 func_80166994(); +extern s32 func_80166F58(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern s32 func_80167540(s32 arg0); +extern void (*D_8018E414[])(void); +extern void func_801678B4(void *a0); +extern void RotMatrixYXZ(void *a0, void *a1); +extern void func_80048EAC(void *a0, void *a1); +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80146C3C(void); +extern void func_801678F0(s32 a0); +extern void (*D_8018E420[])(void); +extern void func_80167A9C(void *a0); +extern void func_80167AD8(void); +extern s32 func_80167AE0(s32 param_1, s32 param_2, s32 param_3); +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u8 D_8018E380[]; +extern u8 D_8018E394[]; +extern s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2); +extern void func_800D20C0(void *a0, void *a1, s32 a2); +extern void func_80017E68(void *a0, void *a1); +extern void func_800D23D0(void *a0); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern s32 D_801269A4; +extern s32 D_801269A8; +extern s32 D_801269AC; +extern void func_80168070(s32 param_1, s16 *param_2, s16 *param_3, void *param_4); +extern s32 func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8016829C(s32 a0); +extern s32 func_80166690(s32 a0, s32 a1); +extern void func_80168328(s32 arg0); +extern void func_801683D8(s32 a0); +extern void func_801684B4(s32 a0); +extern void func_80168540(s32 a0); +extern void func_801685EC(s32 a0); +extern void func_80168640(s32 a0); +extern s32 RotMatrixX(s32 a0, void *a1); +extern void func_80168664(void *arg0); +extern void (*D_8018E438[])(void); +extern void func_80168744(void *a0); +extern void func_80168BDC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801687CC(s32 a0); +extern void func_80168780(s32 a0); +extern void func_80168828(void); +extern void func_801687CC(s32 param_1); +extern void func_80168828(); +extern void (*D_8018E440[])(void); +extern void func_801689D8(void *a0); +extern void func_80168A14(s32 *a0); +extern void func_80168A88(void); +extern void (*D_8018E448[])(void); +extern void func_80168AA8(void *a0); +extern void func_80168AE4(s32 a0); +extern void func_800D2318(void); +extern void func_80168BDC(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void (*D_8018E450[])(void); +extern void func_80168D58(void *a0); +extern void func_80168D94(int a0); +extern void func_80168F40(); +extern void func_80168EC4(s32 a0); +extern void func_80168F40(void *arg0); +extern void (*D_8018E458[])(void); +extern void func_8016901C(void *a0); +extern void func_80169058(s32 a0); +extern s32 func_80169228(void); +extern void func_801691B8(void *a0); +extern void (*D_8018E460[])(void); +extern void func_801693CC(void *a0); +extern void func_80169584(s32 param_1); +extern void func_80169408(s32 a0); +extern void func_8016951C(int param_1); +extern s32 func_80017758(void *a0, void *a1); +extern s32 func_80017DC4(void *a0, void *a1); +extern void func_801696D8(s32 a0, s32 a1); +extern void (*D_8018E468[])(void); +extern void func_80169830(void *a0); +extern void func_8016986C(s32 a0); +extern s32 func_80169A4C(s32 a0, s32 a1); +extern void func_801699D0(void *arg0); +extern void (*D_8018E51C[])(void); +extern void func_80169B80(void *a0); +extern void func_80169E44(s32 a0); +extern void (*D_8018E524[])(void); +extern void func_80169F00(void *a0); +extern char D_8018E4D4[]; +extern char D_8018E494[]; +extern void func_80169F3C(int param_1); +extern void func_80169FE0(s32 a0); +extern void (*D_8018E55C[])(void); +extern void func_8016A020(void *a0); +extern void func_8016A05C(void *a0); +extern void func_8016A290(s32 a, void *b, void *c); +extern void func_8016A08C(s32 param_1); +extern void func_8016A1CC(int param_1); +extern void func_8016A290(s32 param_1, void *param_2, void *param_3); +extern void (*D_8018E568[])(void); +extern void func_8016A700(void *a0); +extern s32 func_8016A73C(s32 arg0); +extern s32 func_8016A8FC(s32 a0); +extern void func_8016A890(s32 arg0); +extern u16 D_80126B5E; +extern u16 D_80126B66; +extern void func_8016AA50(s32 param_1, s32 param_2); +extern void (*D_8018E5B0[])(void); +extern void func_8016AB30(void *a0); +extern void func_8016B234(void); +extern void func_8016AFB0(s32 a0); +extern void func_8016B114(void *arg0); +extern s32 func_8016B448(s32, s32); +extern s32 func_8016BA48(s32 a0); +extern void func_8016B3F4(s32 a0); +extern s32 func_8016B428(s32 a0); +extern void func_8016B984(void *a0); +extern s32 func_8016B448(s32 arg0, s32 arg1); +extern void (*D_8018E62C[])(void); +extern void func_8016B4BC(void *a0); +extern int func_8016B9F8(int); +extern int func_8016B834(int, int); +extern void func_8016B91C(int); +extern int D_801D20F8; +extern void func_8016B4F8(int param_1); +extern s32 func_8016B9F8(s32 param_1); +extern void func_8016B6BC(s32, s32, s32, s32); +extern void func_8016B91C(s32); +extern s16 D_8018E620[]; +extern void func_8016B5C0(s32 param_1); +extern void func_8001CD9C(int, void *); +extern int *D_8018E664[]; +extern unsigned short D_8018E66C[]; +extern unsigned short D_8018E674[]; +extern unsigned char D_801D2100[]; +extern int func_8016B834(int param_1, int param_2); +extern void func_8016B964(SrcB964 *a0, DstB964 *a1); +extern void func_8016B91C(s32 arg0); +extern s32 D_801D20F8; +extern s32 func_8016BA68(s32, s32); +extern void func_8016BADC(void *a0, s32 a1, s32 a2); +extern void (*D_8018E67C[])(void); +extern void func_8016BBA4(void *a0); +extern s32 func_8016BBE0(s32 param_1); +extern void func_8016BFA8(s32 a0, s32 a1, s32 a2, s32 a3); +extern M2C_UNK D_801D2234; +extern M2C_UNK D_801D2238; +extern void func_8016BCC0(void *arg0); +extern s32 func_8016BD78(s32 param_1); +extern s32 func_8016BEA0(s32 param_1); +extern void func_8016BF34(void *a0); +extern void func_8016BFD0(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern s32 D_801D21C0; +extern void (*D_8018E6AC[])(void); +extern void func_8016C14C(void *a0); +extern s32 func_8016C374(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_801D223C[]; +extern u8 D_801D2244[]; +extern u8 D_801D21F4[]; +extern void func_8016C2C4(s32 param); +extern s32 func_8016C49C(s32 param_1_arg); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_8016C74C(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern short func_8016CF04(s32 a0, s32 a1); +extern void func_8016C83C(s32 a0); +extern void (*D_8018E6B4[])(void); +extern void func_8016CB84(void *a0); +extern short func_8016CF04(s32 param_1, s32 param_2); +extern void (*D_8018E6D0[])(void); +extern void func_8016D19C(void *a0); +extern void (*D_8018E6D8[])(void); +extern void func_8016D428(void *a0); +extern void func_8016D464(u8 *a0); +extern void func_8016D4DC(s32 a0); +extern void func_8016D5EC(s32 *a0); +extern short func_8016CBC0(void); +extern void func_8016D64C(int param_1); +extern void func_8016D778(s32 a0); +extern void func_800D20C0(); +extern void func_8016D848(s32 *a0); +extern void func_8016D984(s32 *a0); +extern void func_8016DBD8(u8 *a0); +extern void (*D_8018E740[])(int); +extern void func_8016DA30(int param_1); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_8018E6E4; +extern u8 D_8018E6F0; +extern void func_8016DA7C(s32 param_1); +extern void func_8016DB34(s32 param_1); +extern void (*D_8018E774[])(void); +extern void func_8016DEA4(void *a0); +extern void func_8016DEE0(s32 a0); +extern void (*D_8018E77C[])(void); +extern void func_8016DF20(void *a0); +extern void func_8016E3CC(s32 a0); +extern void func_8016E1CC(s32 a0); +extern void func_8016E26C(s32 *a0); +extern void func_8016E2E8(void *a0); +extern void func_8016E460(void *a0, void *a1); +extern void func_8016E358(void *a0); +extern void func_8016E460(void *arg0, void *arg1); +extern void (*D_8018E7D0[])(void); +extern void func_8016E5B8(void *a0); +extern void func_8016E5F4(s32 arg0); +extern void func_8016E778(); +extern void func_8016E688(void *a0); +extern void func_8016E6E4(s32 a0); +extern void func_8016E728(u8 *a0); +extern void func_8016E7C8(int param_1, short *p1, unsigned int *p2); +extern void func_8016E778(int param_1); +extern void func_8016E7C8(int param_1, short *param_2, unsigned int *param_3); +extern s32 D_80115218; +extern void func_8016E8F0(void); +extern void func_8016E918(short param_1, short param_2); +extern s32 func_8016E95C(); +extern u16 D_8018E804[]; +extern s32 func_8016EC0C(s32 a0, s32 a1); +extern void func_8016EAC0(Wave *param_1); +extern u8 D_8018E7F4[]; +extern void func_8016EB3C(s32 p); +extern void func_8016EBA8(u8 *param_1); +extern void func_8016ED6C(void); +extern s32 D_80126D70; +extern void func_8016EDEC(s32 a0, s32 a1, s32 a2); +extern void func_8016ED8C(s32 a0, s32 a1, s32 a2); +extern void func_8016EE40(s32 a0, s32 a1, s32 a2); +extern void func_8016EDBC(s32 a0, s32 a1, s32 a2); +extern void func_8016EE94(); +extern void func_8016EDEC(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_8016EF78(s32 a0); +extern void func_8016EE40(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_801726D0(void *a0); +extern s32 D_80126D50; +extern s32 D_80126D54; +extern u8 D_80126D6C; +extern u8 D_80126D6D; +extern u8 D_80126D6E; +extern s32 D_80126D5C; +extern s32 D_80126D60; +extern s16 D_80126D64; +extern s16 D_80126D66; +extern s16 D_80126D68; +extern s16 D_80126D6A; +extern u8 D_80126D1A; +extern s32 D_80127058; +extern s32 D_8012705C; +extern s32 D_80127060; +extern s32 D_80127064; +extern s32 D_80127068; +extern s32 D_8012706C; +extern s32 D_80127070; +extern s32 D_80127074; +extern s16 D_80126D20; +extern void func_8016EE94(s32 a0, s32 a1); +extern s32 func_8016EFC8(s32); +extern s32 func_8016EFA8(s32 a0); +extern void func_8016F094(s32 *a0); +extern s32 func_8016F0AC(); +extern s32 D_8018E820; +extern void func_8016F250(void); +extern void func_8016F288(void); +extern void func_8016F2A8(void); +extern void func_8016F2C8(void); +extern void func_8016F2EC(void); +extern void func_8016F30C(void); +extern void func_8016F330(void); +extern void func_8016F350(void); +extern void func_8016F374(void); +extern void func_8016F388(void); +extern void func_8016F398(void); +extern s32 func_8016F44C(s32 a0); +extern void func_8016F470(s32 a0); +extern s32 func_8016F410(s32 a0); +extern void func_80175414(s32); +extern s32 func_8016F4C4(s32); +extern s32 func_8016F494(s32 a0); +extern void func_8016F0E4(void); +extern s32 func_8016F4C4(s32 param_1); +extern void func_8016F4F4(void); +extern void func_801719A4(int a0, int a1); +extern void func_800D1724(s32 a0); +extern void func_80171928(void *a0); +extern void *D_8011F738; +extern void func_8016F4FC(void *a0); +extern void func_8014708C(void *a0); +extern void func_8016F540(void *a0); +extern void func_8016F578(s32 *a0); +extern void func_8016F5B0(void *a0); +extern void func_80147060(u8 *a0); +extern void func_8016F5E0(u8 *a0); +extern void func_8016F610(void *a0); +extern void func_8016F648(void *a0); +extern void func_8016F680(void *a0); +extern void func_8016F6B0(void *a0); +extern void (*D_8018E898[])(void); +extern void func_8016F6E0(void *a0); +extern s32 func_80171990(u8 *a0); +extern void func_8016F764(void *a0); +extern void func_8016F71C(u8 *a0); +extern void (*D_8018E8A0[])(void); +extern void func_8016F798(void *a0); +extern void func_8016F804(void *a0); +extern void func_8016F7D4(u8 *a0); +extern void func_80171928(void *); +extern void (*D_8018E8A8[])(void); +extern void func_8016F834(void *a0); +extern void func_8016F8AC(u8 *a0); +extern void func_8016F870(u8 *a0); +extern void func_80172358(u8 *a0, u8 *a1); +extern void (*D_8018E8B0[])(void); +extern void func_8016F8E4(void *a0); +extern void func_8016F95C(void *a0); +extern void func_8016F920(u8 *a0); +extern s32 func_80171CC4(void *a0, void *a1); +extern s32 func_80171D1C(void *a0, void *a1, s32 a2); +extern u16 D_8011F73E; +extern void (*D_8018E8B8[])(void); +extern void func_8016F9C4(void *a0); +extern void func_80171B44(s32 *a0); +extern void func_8016FA44(s32 a0); +extern void func_8016FA00(s32 a0); +extern s32 func_80171C64(s32 a0, s32 a1); +extern void (*D_8018E8C0[])(void); +extern void func_8016FA84(void *a0); +extern void func_8016FB10(void *a0); +extern void func_8016FAC0(u8 *a0); +extern void func_8016FB50(void *a0); +extern void (*D_8018E8CC[])(void); +extern void func_8016FB7C(void *a0); +extern void func_8016FC24(); +extern void func_8016FBB8(s32 a0); +extern s32 func_80171B4C(s32 a0, s32 a1); +extern void func_8016FC24(s32 a0); +extern void func_8016FC64(void *a0); +extern void (*D_8018E8D8[])(void); +extern void func_8016FC90(void *a0); +extern void func_8016FD08(u8 *a0); +extern void func_8016FCCC(u8 *a0); +extern s32 func_80172658(s32 *a0); +extern void func_8016FD08(u8 *s0); +extern void func_8016FD7C(s32 *a0); +extern void (*D_8018E8E4[])(void); +extern void func_8016FDB4(void *a0); +extern void func_8016FE2C(u8 *a0); +extern void func_8016FDF0(u8 *a0); +extern void func_8016FE2C(u8 * a0); +extern s32 func_8016FE78(s32 *a0); +extern s32 func_80172664(s32 *a0); +extern void func_8016FED0(s32 *a0); +extern void (*D_8018E8F4[])(void); +extern void func_8016FF30(void *a0); +extern void func_8016FFA8(u8 *a0); +extern void func_8016FF6C(u8 *a0); +extern void (*D_8018E904[])(void); +extern void func_8016FFDC(void *a0); +extern void func_80170068(u8 *a0); +extern void func_80170018(u8 *a0); +extern void func_801700B8(u8 *a0); +extern void func_80170100(u8 *a0); +extern void (*D_8018E90C[])(void); +extern void func_80170150(void *a0); +extern void func_801701C8(u8 *a0); +extern void func_8017018C(u8 *a0); +extern void func_801701C8(u8 * a0); +extern void (*D_8018E914[])(void); +extern void func_80170240(void *a0); +extern void func_801702B8(s32 a0); +extern void func_8017027C(u8 *a0); +extern s16 func_80171AB0(s32 a0, void *a1); +extern void (*D_8018E91C[])(void); +extern void func_801702FC(void *a0); +extern void func_80170374(u8 *a0); +extern void func_80170338(u8 *a0); +extern s32 func_8014C168(s32 *a0, s32 a1); +extern void func_80170374(u8 * a0); +extern void (*D_8018E924[])(void); +extern void func_801703E0(void *a0); +extern void func_8017044C(u8 *a0); +extern void func_8017041C(u8 *a0); +extern void func_8017044C(u8 * a0); +extern void (*D_8018E92C[])(void); +extern void func_801704B0(void *a0); +extern void func_8017051C(void *a0); +extern void func_801704EC(u8 *a0); +extern void (*D_8018E934[])(void); +extern void func_80170548(void *a0); +extern void func_801705C0(u8 *a0); +extern void func_80170584(u8 *a0); +extern void func_801705C0(u8 * a0); +extern void (*D_8018E93C[])(void); +extern void func_801705F8(void *a0); +extern void func_80170670(void *a0); +extern void func_80170634(u8 *a0); +extern void func_8012A568(void (*a0)(void)); +extern void (*D_8018E944[])(void); +extern void func_801706AC(void *a0); +extern void func_80170718(void *a0); +extern void func_801706E8(u8 *a0); +extern void func_80129FF4(void); +extern void (*D_8018E94C[])(void); +extern void func_80170748(void *a0); +extern void func_801707D4(void *a0); +extern void func_80170784(u8 *a0); +extern s32 func_80174ED4(void); +extern void (*D_8018E954[])(void); +extern void func_80170810(void *a0); +extern void func_801708B0(void *a0); +extern u8 D_800D5DA8; +extern void func_8017084C(s32 a0); +extern u8 D_800D5A34[]; +extern void func_80170AD8(void *a0); +extern void func_80171904(s32 a0); +extern void func_80170B48(int a0); +extern void func_80170928(void); +extern u8 D_800D59EC[]; +extern void func_80170970(void); +extern u8 D_800D599C[]; +extern void func_801709B8(void); +extern u8 D_800D5934[]; +extern void func_80170A00(void); +extern void func_80170A48(void); +extern u8 D_800D5DC0[]; +extern void func_80170A90(void); +extern void (*D_8018E95C[])(void); +extern void func_80170B14(int a0); +extern void func_80170B90(u8 *a0); +extern void (*D_8018E964[])(void); +extern void func_80170BD8(void *a0); +extern void func_80170C44(u8 *a0); +extern void func_80170C14(u8 *a0); +extern void (*D_8018E96C[])(void); +extern void func_80170C74(void *a0); +extern s32 func_8017197C(u8 *a0); +extern void func_80170CF0(void *a0); +extern void func_80170CB0(u8 *a0); +extern void (*D_8018E974[])(void); +extern void func_80170D68(void *a0); +extern void func_80170DE0(u8 *a0); +extern void func_80170DA4(u8 *a0); +extern s32 D_8011F73C; +extern s32 D_8011F740; +extern void func_801718AC(void *a0); +extern void func_80170DE0(u8 * _arg0); +extern void (*D_8018E97C[])(void); +extern void func_80170E34(void *a0); +extern void func_80170EAC(u8 *a0); +extern void func_80170E70(u8 *a0); +extern int func_800D0F8C(int a0); +extern void func_80170EAC(u8 * _arg0); +extern void (*D_8018E984[])(void); +extern void func_80170EFC(void *a0); +extern void func_80170F74(void *a0); +extern void func_80170F38(u8 *a0); +extern void (*D_8018E98C[])(void); +extern void func_80170FB0(void *a0); +extern void func_80171028(void *a0); +extern void func_80170FEC(u8 *a0); +extern void (*D_8018E994[])(void); +extern void func_80171064(void *a0); +extern void func_801710DC(u8 *a0); +extern void func_801710A0(u8 *a0); +extern u16 D_8011F73A; +extern void func_801710DC(u8 * arg0); +extern void (*D_8018E99C[])(void); +extern void func_80171120(void *a0); +extern void func_8017118C(u8 *a0); +extern void func_8017115C(u8 *a0); +extern void func_80142454(s32 a0); +extern void func_8017118C(u8 * a0); +extern void (*D_8018E9A4[])(void); +extern void func_801711C0(void *a0); +extern void func_80171238(void); +extern void func_801711FC(u8 *param_1); +extern void (*D_8018E9AC[])(void); +extern void func_80171260(void *a0); +extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80171384(void *a0); +extern void (*D_8018E9B4[])(void); +extern void func_801714E4(void *a0); +extern void func_8017162C(void *a0); +extern void func_80171520(s32 a0); +extern s32 func_801716AC(s32 a0, void *a1, s32 *a2); +extern s32 func_80012FC8(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_800A5E94; +extern u8 D_800A5E95; +extern u8 D_800A5E96; +extern s32 func_801716AC(s32 a0, void * a1, s32 * a2); +extern int func_800D0FE0(int a0); +extern void func_801717A0(void *a0); +extern void func_8013E588(void *a0); +extern void func_801717F4(void *a0); +extern void func_80171824(void *a0); +extern void func_80171854(void *a0); +extern void func_80171884(void); +extern void func_80171A1C(u8 *a0); +extern void func_80171928(void * a0); +extern void func_8017196C(s32 *a0, s8 a1); +extern void func_80171A04(s32 *a0); +extern void func_80171A10(s32 *a0); +extern void func_80171A34(s32 *a0, s8 a1); +extern s32 func_80171A44(u8 *a0); +extern s32 func_80171A58(u8 *a0); +extern s32 func_80171A6C(u8 *a0); +extern void func_80171A80(s32 *a0, s32 a1); +extern s32 func_80171A88(s32 a0); +extern s16 func_80171AB0(s32 param_1, void * _arg1); +extern void func_80171B10(void *a0); +extern void func_80171EC8(s32 a0); +extern s32 func_80171C64(s32 param_1, s32 param_2); +extern s32 func_80171D78(s32 a0, s32 a1); +extern int func_8017250C(short *a0, short *a1); +extern s32 func_80171CC4(void * a0, void * a1); +extern s32 func_80171FFC(short *a0, short *a1, s32 a2); +extern s32 func_80171D1C(void * a0, void * a1, s32 a2); +extern s32 func_8017248C(s32 a0, s32 a1); +extern s32 func_80171E08(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); +extern void func_80172170(s32 a0, s32 a1); +extern s32 func_8017209C(void *arg0, void *arg1, s32 arg2, s32 arg3); +extern void func_801722CC(s32 *a0); +extern void func_80172304(s32 *a0); +extern void func_80172310(u8 *a0); +extern void func_801723C4(s32 param_1, s32 param_2); +extern void func_80161C24(s32, s32); +extern void func_80172414(s32 a0); +extern s32 func_801724EC(s32 a0); +extern s32 func_8017248C(s32 arg0, s32 arg1); +extern s32 func_80013450(s32); +extern s32 func_80172560(u8 *a0, u8 *a1); +extern s32 func_8017261C(u8 *a0); +extern s32 func_80172644(u8 *a0); +extern s32 func_80172670(s32 *a0); +extern s32 func_80172688(s32 *a0); +extern s32 func_80172694(s32 *a0); +extern s32 func_801726A0(s32 *a0); +extern s32 func_801726AC(s32 *a0); +extern s32 func_801726B8(s32 *a0); +extern s32 func_801726C4(s32 *a0); +extern s32 func_80172760(s32 a0); +extern s32 func_80174650(s32); +extern void (*D_80127088)(void); +extern s32 D_801270BC; +extern s16 D_80126B0C; +extern void func_801726D0(void * _arg0); +extern void func_80172710(void); +extern void func_80174684(void *); +extern void func_80172738(void); +extern s16 D_80126B30; +extern s32 func_801727D0(void *a0); +extern void func_80172780(void *a0); +extern void func_80172844(u8 *a0); +extern void func_8017280C(u8 *a0); +extern void func_8017288C(void); +extern s32 func_801728E4(void *a0); +extern void func_80172894(void *a0); +extern void func_80172958(u8 *a0); +extern void func_80172920(u8 *a0); +extern s16 D_80126B36; +extern void func_80172958(u8 * a0); +extern void func_801729A8(void); +extern s32 func_801729F0(void *a0); +extern s16 D_80126B34; +extern s16 D_80126B32; +extern void func_801729B0(s32 a0); +extern void func_80172A8C(void *a0); +extern void func_80172A2C(int param_1); +extern void func_80172ACC(u8 *a0); +extern void func_80172B0C(void); +extern s32 func_80172B44(void *a0); +extern void func_80172B14(s16 a0); +extern s32 D_801150F8; +extern void func_80172BC8(void *a0); +extern void func_80172B80(u8 *a0); +extern void func_80172C48(void); +extern void (*D_8018E9F8[])(void); +extern void func_80172CA0(void *a0); +extern void func_80172D14(u8 *a0); +extern void func_80172CDC(u8 *a0); +extern void func_80172D14(u8 * a0); +extern void func_80172D60(void); +extern s32 D_80127508; +extern s32 func_80172DAC(void *a0); +extern void func_80172D68(s32 a0); +extern void func_80172E20(u8 *a0); +extern void func_80172DE8(u8 *a0); +extern void func_80172E20(u8 * a0); +extern void func_80172E8C(void); +extern void func_8017303C(void *); +extern void func_80172E94(void); +extern void func_80172ED4(void); +extern void func_80172EFC(void); +extern void func_80172F24(void); +extern u8 D_800D47F4[]; +extern void func_80172F4C(void); +extern void func_80172F9C(void); +extern u8 D_800D5C6C[]; +extern void func_80172FEC(void); +extern s32 func_80173078(void *a0); +extern void func_8017303C(void * a0); +extern void func_801730FC(struct S801730FC *a0); +extern void func_801730B4(s32 a0); +extern void func_8017316C(void); +extern s32 func_8017319C(void *a0); +extern void func_80173174(void); +extern u8 D_800D5AA0[]; +extern void func_80173220(void *a0); +extern void func_801731D8(s32 *a0); +extern M2C_UNK D_8018E9BC; +extern void func_80173220(void * arg0); +extern void func_80173294(void); +extern void func_801732C4(); +extern void func_8017329C(void); +extern void func_801732C4(s32 *a0); +extern void func_8017331C(); +extern void func_801732F4(void); +extern void func_8017331C(s32 *a0); +extern void func_80173374(); +extern void func_8017334C(void); +extern void func_80173374(s32 *a0); +extern void func_801733A4(void); +extern void func_801733CC(s32 a0); +extern void func_801734BC(s32 a0, s32 a1); +extern s16 D_80126B3E; +extern void func_80173460(s32 a0, s32 a1); +extern void func_801734BC(s32 arg0, s32 _unused1); +extern void (*D_8018EA28[])(void); +extern void func_80173544(void *a0); +extern void func_801735B8(u8 *a0); +extern void func_80173580(u8 *a0); +extern s16 D_80126B40; +extern void func_801735EC(void *a0); +extern void func_80173648(u8 *a0); +extern void func_801736A8(void); +extern s32 func_8014C118(void *a0, s32 a1, s32 a2); +extern s32 func_801736FC(void *a0); +extern void func_801736B0(s32 a0, s32 a1); +extern void func_80173770(u8 *a0); +extern void func_80173738(u8 *a0); +extern void func_801723C4(s32 a0, s32 a1); +extern void func_801737B0(void); +extern s32 func_801737E8(void *a0); +extern void func_801737B8(s16 a0); +extern void func_8017385C(u8 *a0); +extern void func_80173824(u8 *a0); +extern void func_801738D4(void); +extern s32 func_8017390C(void *a0); +extern void func_801738DC(s16 a0); +extern void func_80173980(u8 *a0); +extern void func_80173948(u8 *a0); +extern void func_801739D8(u8 *a0); +extern void func_80173A20(void); +extern s32 D_8012750C; +extern void func_80173A60(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80173A28(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void (*D_8018EA64[])(void); +extern void func_80173B4C(void *a0); +extern void func_80173BC0(u8 *a0); +extern void func_80173B88(u8 *a0); +extern void func_80173C64(u8 *a0); +extern void func_80173E1C(s32 a0); +extern s16 D_80126938; +extern s16 D_80126B3A; +extern void func_800D128C(s32, s32); +extern void func_80174158(s32 a0); +extern void func_8002A088(s32); +extern void func_8002A2D4(s32); +extern void func_8002A544(s32); +extern void func_8002A7B4(s32); +extern s32 func_80174188(s32 a0); +extern void func_801741A8(s32 a0); +extern s32 func_800D0EC4(void); +extern void func_800D0F0C(s32, s32); +extern void func_80145EE8(s32); +extern void func_80173EF8(void *param_1); +extern s32 func_8014BCEC(s32, s32); +extern void func_801741A8(s32 _arg0); +extern s16 D_80126B3C; +extern s16 D_8011F9C8; +extern void func_801741EC(u8 *a0); +extern void func_80174274(void); +extern s32 func_801742A4(void *a0); +extern void func_8017427C(void); +extern void func_80174318(u8 *a0); +extern void func_801742E0(u8 *a0); +extern void func_80174354(void); +extern s32 func_80174384(void *a0); +extern void func_8017435C(void); +extern void func_801743F0(u8 *a0); +extern void func_801743C0(u8 *a0); +extern void func_801743F0(u8 * a0); +extern void func_80174430(void); +extern s32 func_80174474(void *a0); +extern void func_80174438(s32 a0); +extern void func_801744E0(u8 *a0); +extern void func_801744B0(u8 *a0); +extern void func_80174524(void); +extern void func_80174554(); +extern void func_8017452C(void); +extern void func_80174554(s32 arg0); +extern void func_801745AC(); +extern void func_80174584(void); +extern void func_801745AC(s32 *a0); +extern void func_80174604(void); +extern void func_801745DC(void); +extern void func_80174630(void); +extern s32 func_80174650(s32 _arg0); +extern void func_80174674(void); +extern void func_801746A4(void); +extern s32 func_800CF8CC(void); +extern void func_80174714(void); +extern s32 func_80174754(void); +extern s16 func_80174764(void); +extern s16 func_80174774(void); +extern s32 func_801747CC(void *a0); +extern void func_80174784(void); +extern s32 func_801747AC(s32 a0); +extern s32 func_80174808(u8 *a0); +extern void func_8017481C(void); +extern s32 func_80174888(void *a0); +extern void func_80174824(void); +extern void func_8017484C(s32 a0); +extern void func_801748C4(s32 a0); +extern void func_801748E4(void); +extern void func_8012A018(s32 a, s32 b); +extern s32 func_8017496C(void *a0); +extern s32 D_80126950; +extern void func_801748EC(void); +extern s32 func_801749C8(); +extern s32 func_801749A8(s32 a0); +extern void func_80174BBC(void *a0); +extern void func_8012A0E0(void); +extern void func_80174BF4(void *a0); +extern void (*D_8018EABC[])(); +extern void func_80174BF4(void * arg0); +extern s32 func_80174CB0(s32, s32); +extern s32 func_80174C60(s32 a0); +extern void func_80174C80(s32 a0); +extern s32 D_8012697C; +extern u16 D_80126980; +extern s32 func_80174F28(void *a0); +extern void func_80174E9C(s32 a0); +extern void func_80174EF0(s32 a0, s16 a1); +extern s32 func_80175014(u8 *a0, u8 *a1, s32 a2); +extern void func_80174F64(u8 *a0); +extern void func_80174FBC(u8 *a0); +extern s32 func_8017509C(u8 *a0, s32 a1, u8 *a2, u8 *a3); +extern void func_80175184(s32 *a0); +extern void func_80175114(s32 *a0); +extern void func_80175184(); +extern void func_80175150(s32 *a0); +extern void (*D_8018EACC[])(void*); +extern s32 func_80175268(s32); +extern void func_80175184(s32* arg0); +extern s32 func_80175218(void *a0); +extern void func_801751D8(void *a0); +extern void (*D_8018EAD4[])(s32); +extern s32 func_80175218(void * param_1); +extern void func_801752BC(s32 *a0); +extern u8 D_8011F7A8; +extern u8 D_8011F7A9; +extern u8 D_8011F7AD; +extern u8 D_8011F7AE; +extern void func_80175414(s32 _arg0); +extern void func_80175494(void); +extern void (*D_8018EC3C[])(); +extern s32 func_801758FC(void); +extern s32 func_80175820(void); +extern s32 func_801759D8(void); +extern void func_8017553C(s32 *param); +extern void func_801757A0(s32 a0); +extern short D_800B9A02; +extern void func_80175590(void *arg0); +extern s16 D_800B9A02; +extern void func_801757A0(s32); +extern void func_80175624(void *a0); +extern void func_801757E0(int); +extern void func_80175668(void); +extern void (*D_8018EC48[])(); +extern void func_80175690(s32 *param); +extern void func_80175DA8(s32 a0); +extern void func_80175AB8(s32 a0); +extern void func_80176144(s32 a0); +extern void func_801756E4(s32 arg0); +extern void func_80175798(void); +extern void func_80176734(s32 a0); +extern void func_80176218(s32 a0); +extern void func_80176D00(s32 a0); +extern void func_801757E0(s32 a0); +extern s32 func_80178004(s32 a0, s32 a1, s32 a2); +extern u8 D_8011F7B1; +extern u16 D_8011F7B4; +extern u16 D_8011F7B6; +extern s16 D_8011F81E; +extern void *func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern u32 func_801783D0(s32 a0, s32 a1); +extern void *func_801777BC(void *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern u16 D_8011F82C; +extern u16 D_8011F82A; +extern u32 * func_80176D94(void *param_1, u32 param_2, s16 param_3_); +extern void func_801778A8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80176FF4(s32 a0); +extern u16 D_8011F830; +extern u16 D_8011F82E; +extern u32 * func_801770E0(void *param_1, u32 param_2, s16 param_3_); +extern void func_80177340(s32 a0); +extern u8 D_8011F837; +extern u8 D_8011F7F0; +extern u8 D_8011F7AB; +extern u32 * func_8017742C(u32 *param_1, s32 param_2, s32 param_3); +extern void func_801776EC(u8 *a0); +extern void * func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern uint * func_80177EA4(uint *param_1, int param_2, uint param_3, int param_4); +extern void func_80177F84(s32 param_1, s32 param_2); +extern u32 * func_80178298(u32 *param_1, u8 *param_2, short param_3, short param_4); +extern M2C_UNK D_801D17A4; +extern void func_80178438(u16 *arg0); +extern void func_801787D4(void); +extern void func_8012A908(void); +extern void func_8017869C(s32 a0); +extern void func_80130D0C(s32 a0); +extern void func_8013E370(void); +extern s32 D_8011DB08; +extern void func_8017849C(void); +extern void func_8013E4B4(void); +extern s16 D_801270C4; +extern s32 D_801274D8; +extern s16 D_801270C2; +extern u8 D_801270C6; +extern u8 D_801270C7; +extern s32 D_801274DC; +extern s32 D_801274E0; +extern void func_80178608(void); +extern void func_80178744(s32 a0, s32 a1); +extern void func_80178840(); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern s32 func_801788B8(s32 arg0, s32 arg1); +extern s32 func_801789AC(s32 arg0); +extern s16 D_801D35C8; +extern int func_80178970(void); +extern void func_80178B18(s32 param_1, s32 param_2); +extern s32 func_80178B70(s32 param_1, s32 param_2); +extern void func_80178BB8(s32 a0, s32 a1); +extern s32 func_80178BF8(); +extern s32 D_801D2978; +extern short D_801D363C; +extern void func_80178CBC(s32 arg0, s32 arg1); +extern void func_80178D18(void); +extern s32 func_80178D40(s32 arg0, s32 arg1); +extern void func_80179B28(s32 a0); +extern void func_80179B74(u16 *p); +extern void func_80179D30(u16 *a0); +extern void func_80179D78(u16 *a0); +extern void func_80179DCC(short a0); +extern void func_80179DF8(void); +extern void func_80179E1C(short a0); +extern void func_80179E48(s16 a0); +extern void func_80179E74(s16 a0); +extern void func_80179EA0(u16 *a0); +extern void func_80179EE8(short a0); +extern void func_80179F14(s16 a0, s16 a1); +extern void func_80179F44(void); +extern void func_80179F6C(short a0); +extern void func_80179F98(u16 *a0); +extern void func_80179FEC(u16 *a0); +extern void func_8017A040(u16 *a0); +extern s32 D_801D2DA4; +extern void func_8017A094(s32 arg0); +extern void func_8017A0C4(s32 arg0); +extern void func_8017A0F4(void); +extern void func_8017A11C(void); +extern s32 D_801D2DCC; +extern void func_8017A144(s32 a0); +extern void func_8017A180(void); +extern void func_8017A1A8(void); +extern void func_8017A1D0(void); +extern void func_8017A1F8(void); +extern void func_8017A220(void); +extern void func_8017A248(void); +extern void func_8017A270(void); +extern void func_8017A298(void); +extern void func_8017A2C0(void); +extern void func_8017A2E8(void); +extern void func_8017A310(void); +extern void func_8017A338(void); +extern void func_8017A360(void); +extern void func_8017A388(void); +extern s16 D_801D2D88; +extern s32 func_8017A3B0(void); +extern short D_801D2DC4; +extern short D_801D2DC0; +extern int func_800D0CA0(int); +extern int func_8001AAA0(void); +extern int func_800D0CE0(void); +extern int func_8017A3D8(void); +extern void func_80172310(u8*); +extern void func_80172780(void*); +extern void func_80172894(void*); +extern void func_801729B0(s32); +extern void func_80172B14(s16); +extern void func_80172C50(u16 *); +extern void func_80172D68(s32); +extern void func_801733FC(s16, u16 *); +extern void func_80173460(s32, s32); +extern void func_801734BC(s32, s32); +extern void func_801736B0(s32, s32); +extern void func_801737B8(s16); +extern void func_801738DC(s16); +extern void func_80173A28(s32, s32, s32, s32, s32, s32); +extern void func_80174438(s32); +extern void func_8017A4AC(void); +extern s32 func_8017AD0C(s32 arg0); +extern s32 func_8017AD0C(s32); +extern s32 func_8017ADE8(s32 a0); +extern s32 func_8017AE08(void); +extern void func_8017B0E4(int param_1, int param_2); +extern s16 D_801D2D8C; +extern u16 D_801D2E0C; +extern u16 D_801D2E0E; +extern u16 D_801D2E10; +extern void func_8017B1D8(void); +extern s32 func_8017B238(s32 param_1, s32 param_2); +extern s32 func_8017B368(s32 param); +extern s32 func_8017B614(s32 param_1, s32 param_2); +extern s32 D_80114F30; +extern s32 D_80114F34; +extern s32 D_80114F38; +extern s32 D_80114F24; +extern s32 D_80114F28; +extern s32 D_80114F2C; +extern u8 D_8012694C; +extern s16 D_801D2E04; +extern s16 D_801D2E06; +extern s16 D_801D2E08; +extern s16 D_801D2DFC; +extern s16 D_801D2DFE; +extern s16 D_801D2E00; +extern void func_8017B7A8(void); +extern s16 D_801D2E1C; +extern s16 D_801D2E1E; +extern s16 D_801D2E20; +extern s16 D_801D2E24; +extern s16 D_801D2E26; +extern s16 D_801D2E28; +extern void func_8017B824(void); +extern void func_8017B880(void); +extern s32 func_8017B8E8(s32 src); +extern short D_801D2E14; +extern short D_801D2E16; +extern short D_801D2E18; +extern void func_8017B940(void); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(void *a0, void *a1, void *a2); +extern SV4 D_801D2DAC; +extern SV4 D_801D2DB4; +extern void func_8017BA3C(s32 param_1, s32 param_2); +extern s32 func_8017BB34(s32 param_1, s32 param_2); +extern void (*D_801D2DD4[10])(int); +extern void func_8017BC38(int param_1); +extern void func_8017B0E4(int, int); +extern void func_8017BCA0(int param_1); +extern void func_8012A4BC(void); +extern void func_8017BCF4(int param_1); +extern void (*D_801D2DD0)(void); +extern void func_8017BD50(int param_1); +extern void (*D_8018EE24[])(void); +extern void func_8017BE60(void *a0); +extern void func_8017BE9C(void); +extern void func_8017BEA4(void); +extern void func_8017BEAC(void); +extern void func_8017BEB4(void); +extern void (*D_8018EF40[])(void); +extern void func_8017C8B8(void *a0); +extern void func_8012C218(void *a0); +extern void func_8017CC60(void); +extern void (*D_8018EF98[])(void); +extern void func_8017CD10(void *a0); +extern void (*D_8018EFAC[])(void); +extern void func_8017D33C(void *a0); +extern void (*D_8018EFC0[])(void); +extern void func_8017D5DC(void *a0); +extern void func_8017D898(s32 arg0); +extern int func_8017FB44(int param_1); +extern void func_8017E810(void); +extern void func_8017E89C(void); +extern void func_8017E8DC(void); +extern void (*D_8018F1A4[])(void); +extern void func_8017E968(void *a0); +extern void func_8017EEDC(void); +extern s32 func_8017E9A4(s32 a0); +extern s32 func_8017E9E8(void); +extern void (*D_8018F1AC[])(void); +extern void func_8017EA0C(void *a0); +extern void func_8017EF04(void); +extern s32 func_8017EA48(s32 a0); +extern void func_800D1EBC(void); +extern void func_8017EB14(void); +extern void (*D_8018F1B8[])(void); +extern void func_8017EB34(void *a0); +extern void func_8001BFD0(void); +extern void func_800D1E28(void); +extern s32 func_8017EB70(u8 *a0); +extern void (*D_8018F1C4[])(void); +extern void func_8017EBEC(void *a0); +extern void func_8017EF2C(void); +extern s32 func_8017EC28(s32 a0); +extern void (*D_8018F1D0[])(void); +extern void func_8017ED00(void *a0); +extern void func_8017F02C(void); +extern s32 func_8017ED3C(s32 arg0); +extern s32 func_8017ED78(void); +extern void func_8017EDE8(void); +extern void (*D_8018F1E0[])(void); +extern void func_8017EE08(void *a0); +extern M2C_UNK D_8018F1EC; +extern M2C_UNK D_8018F1F0; +extern void (*D_8018F204[])(void); +extern void func_8017EF54(void *a0); +extern void func_8012A094(s32 a0); +extern void func_8017F3E4(void *a0); +extern void func_8017F0F0(void); +extern void (*D_8018F20C[])(void); +extern void func_8017F9AC(s32 param_1, s16 *param_2); +extern void func_8017F558(s32 a0); +extern void func_8017F794(s32 a0); +extern void func_8017F844(s32 a0); +extern s32 func_80012ABC(s32 a0, s32 a1, s32 a2); +extern void func_8013B7F4(void *a0, int a1); +extern s32 resLoad_lastId; +extern s32 func_8017FB74(void); +extern void func_8002D4C8(s32 arg0, s32 arg1); +extern void func_8017FB8C(void); +extern void func_8017FD30(void); +extern void func_8017FBBC(void); +extern s32 D_801D30C8; +extern void func_8017FD0C(void); +extern void func_8017FF68(void *a0, s32 a1); +extern code_fn D_801A4C2C[]; +extern s32 func_8018030C(s32 a0); +extern void func_801801C4(int param_1); +extern void (*D_801A4C88[])(void); +extern void func_80180568(void *a0); +extern void func_801805A4(void); +extern void func_801805AC(void); +extern void func_8012AD44(s32 *a0, s16 a1); +extern void func_801806B8(s32 *a0); +extern void func_80180804(void * arg0); +extern void (*D_801A4DA4[])(void); +extern void func_80180E18(void *a0); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_801806E0(void *a0); +extern void func_80181044(int param_1); +extern void func_801810C8(void); +extern void func_801813E0(s32 *a0); +extern void func_80181760(void * arg0); +extern void func_80181788(s32 *a0); +extern void func_801819F0(void *a0); +extern void func_80181A20(void *arg0); +extern void func_80181D84(void); +extern void func_80181ED4(void); +extern void func_8018226C(void *a0); +extern void func_80178B18(s32 a0, s32 a1); +extern M2C_UNK D_801A4E88; +extern void func_80182294(void *arg0); +extern void func_801822D0(void *arg0); +extern code_fn D_801A4ED4[]; +extern s32 func_80182438(s32 a0); +extern void func_801822F0(int param_1); +extern void (*D_801A4F00[])(void); +extern void func_801825EC(void *a0); +extern void func_801829B4(void); +extern s32 func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CF00(s32 a0); +extern void func_800233CC(void *a0, unsigned short a1); +extern s32 func_8012AD50(void *a0); +extern void func_801829BC(void *a0); +extern void (*D_801A4FA4[])(void); +extern void func_80182C68(void *a0); +extern void func_80182FD4(void *a0, void *a1); +extern void func_801833F0(void *ent, void *spr, u32 *q, u32 *ot); +extern void func_80183910(void); +extern void func_80183918(void); +extern void func_801839DC(s32 arg0, s32 arg1, s32 arg2); +extern void func_80183AF8(s32 arg0, Rec_8018A6A4_8018393C *arg1, s32 arg2, s32 arg3); +extern void func_8018393C(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_80183A0C(s32 a0); +extern s16 D_801D3292; +extern void func_80183A84(s32 arg0); +extern s32 rand(void); /* TU L951, verbatim */ +extern void aF8018A860(); +extern s32 func_80183BCC(void); +extern void func_80183C08(s32 a0, s32 a1); +extern void func_80183D30(s32 arg0); +extern void func_80183C54(void); +extern void func_80183FF4(void); +extern void func_80184040(s32 a0); +extern void func_80184018(s32 a0); +extern void func_801840C8(void *arg0, void *arg1, s32 arg2, s32 arg3); +extern void func_80184134(void *a0, void *a1, s16 a2); +extern void func_80184268(s32 a0, s16 a1, u16 a2); +extern void func_801841A4(s32 a0); +extern s32 func_80184384(void); +extern void func_8018421C(s32 a0, s32 a1); +extern void aF8018AFD0(); +extern void func_801843C0(void); +extern void RotMatrixZ(s32 a0, void *a1); +extern void func_8004901C(void *a0, void *a1); +extern void func_80016638(void *a0, s32 a1, s32 a2); +extern void func_801844D4(s32 a0); +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012BD14(s32 a0); +extern void func_8002D59C(s32 a0, u16 a1, s32 a2); +extern void func_801847B8(s32 a0); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern void func_80184A50(void *arg0); +extern void func_80185084(void *a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_80185218(void *a0); +extern s32 func_8012D624(void *a0, s32 a1, s32 a2); +extern void func_801855C8(void *a0); +extern void (*D_801A764C[])(void); +extern void func_801856B4(void *a0); +extern void (*D_801A7700[])(void); +extern void func_801856F0(void *a0); +extern void func_8018572C(void *a0); +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); +extern void func_80185744(s32 a0); +extern void func_801857E8(void *a0); +extern void func_80185804(void *a0); +extern void func_80185888(s32 *a0); +extern void func_801858C4(void *a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012E688(void*, s32, s32); +extern void func_801858F4(s32 a0); +extern s32 func_8012BCCC(s32 a0); +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_80185978(s32 a0); +extern void func_8012E688(void *a0, s32 a1, s32 a2); +extern void func_8012B23C(void *a0); +extern void func_80185A3C(void *a0); +extern void func_80143970(void *a0); +extern void func_80185B1C(s32 a0); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern void func_80185B8C(s32 a0); +extern void func_80185C68(void); +extern void func_8002A04C(s32 a0); +extern void func_80185C70(s32 arg0); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_80185D28(s32 a0); +extern void func_8012CBA4(s32 a0); +extern void func_8012DFD4(u8 *a0); +extern void func_80185DEC(s32 a0); +extern void func_80185E40(s32 a0); +extern void func_8012C1B8(void); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80185EBC(s32 param_1); +extern void func_80185FA0(s32 a0); +extern void func_8018606C(s32 a0); +extern void func_80186318(void * arg0); +extern void func_801863B4(void *a0); +extern void func_80186A8C(void *a0); +extern void (*D_801A973C[])(void); +extern void func_80186D94(void *a0); +extern void func_80186E88(s32 arg0); +extern void (*D_801A9A58[])(void); +extern void func_80186EC4(void *a0); +extern s32 D_801A9788; +extern void func_80187094(s32 *a0); +extern void (*D_801AE45C[])(void); +extern void func_801881C8(void *a0); +extern void func_8002AC00(s32 arg0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8001C214(s32 a0, s32 a1); +extern s32 func_8012B030(u8 *a0); +extern void func_80188354(void *a0); +/* ==== end §8b carried decl layer ==== */ + + +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern void func_80143970(void *a0); +extern void func_8012A828(s32 a0, s32 a1); +extern void func_8012B23C(void *a0); +extern void func_8012B2CC(s32 a0); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern s32 rand(void); + +void func_801884D8(void *a0) { + + extern u8 D_801AF494[]; + extern u8 D_801BBE74[]; + extern u8 D_801BB73C[]; + extern char D_801BCDEC[]; + extern u8 D_801BCC6C[]; + extern s32 D_801AF5CC; + extern s32 D_801AF66C; + extern s32 D_801AF6B4; + + s16 state = *(s16 *)((s32)a0 + 0x70); + + if (func_8012C354((s32)a0, (s32)(D_801AF494 + state * 0x34)) == 0) { + func_8012CAE4((void *)a0); + } else { + s16 state2; + u16 saved; + + *(u8 *)((s32)a0 + 0xC0) = 1; + *(s32 *)((s32)a0 + 0xB4) = -0x401; + func_80143970((void *)a0); + + state2 = *(s16 *)((s32)a0 + 0x70); + switch (state2) { + case 0: + func_8012A828((s32)a0, (s32)D_801BBE74); + *(s16 *)((s32)a0 + 0x2) = 1; + func_8012B23C((void *)a0); + saved = *(u16 *)((s32)a0 + 0xFC); + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF5CC; + *(s16 *)((s32)a0 + 0xFC) = 0; + *(u16 *)((s32)a0 + 0x100) = saved; + break; + case 2: + func_8012A828((s32)a0, (s32)D_801BB73C); + saved = *(u16 *)((s32)a0 + 0xFC); + *(s16 *)((s32)a0 + 0x2) = 9; + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF66C; + *(u16 *)((s32)a0 + 0x100) = saved; + break; + case 1: + case 3: + func_8012A828((s32)a0, (s32)&D_801BCDEC); + *(s16 *)((s32)a0 + 0x2) = 6; + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF6B4; + break; + case 4: + func_8012A828((s32)a0, (s32)D_801BBE74); + *(s16 *)((s32)a0 + 0x2) = 0xD; + func_8012B23C((void *)a0); + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF5CC; + *(s16 *)((s32)a0 + 0xFC) = 0x1E; + break; + case 5: + if (*(s16 *)((s32)a0 + 0xFC) != 0) { + func_8012A828((s32)a0, (s32)D_801BCC6C); + *(s16 *)((s32)a0 + 0x2) = 0xE; + *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12) = rand() & 0xFFF; + } else { + func_8012A828((s32)a0, (s32)D_801BBE74); + *(s16 *)((s32)a0 + 0x2) = 1; + } + func_8012B23C((void *)a0); + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF5CC; + *(s16 *)((s32)a0 + 0xFE) = 1; + do { + func_8012C658(0x12F, 5, (s32)a0); + *(s16 *)((s32)a0 + 0xFE) = *(u16 *)((s32)a0 + 0xFE) + 1; + } while (*(s16 *)((s32)a0 + 0xFE) < 6); + *(s16 *)((s32)a0 + 0xFE) = 0; + break; + } + func_8012B2CC((s32)a0); + } +} + + + +/* func_801886FC — ov_SC02_026 / ov_SC02_026_jr_8017C180.c MATCH (237 ins) + * + * §136c SIBLING-FIRST provenance (nothing here was derived from the .s that could be copied): + * - the func_8004787C / func_80047948 / func_80133784 trig+collide block is copied VERBATIM + * from the already-banked SAME-TU sibling func_80183B04 (TU:4468), including the + * `s32 r; r = 0x30;` non-const multiplier (T1) and the `V8_801886FC {u16 x,y,z,w}` locals. + * - the RotTransPers + positional-sound block follows the byte-proven RTP_SND() macro in + * src/ov_SC06_030/ov_SC06_030_jr_8017C8D0.c:3480 — in particular the $a0-PINNED SCOPES on + * &D_800AF648, which rematerialise the lui/addiu before EACH call instead of letting CSE + * hoist the address into a callee-saved pseudo. + * - the `*(u16*)(*(s32*)(a0+0x20)+0x12) = *(u16*)(...) + d;` accumulate form is copied from + * the SAME-TU sibling func_80180C80 (TU:3936). + * + * THE FOUR LEVERS THAT CLOSED IT (each one MOVED the count; recorded for the cookbook): + * + * 1. §136 L1 — `r = 0x30` MUST BE ITS OWN LOCAL, and the two func_8012B608 results must be + * per-arm block-scoped locals (`s32 d`). Sharing one `s32 r` across all three sites makes + * it a GLOBAL allocno; as a BLOCK-LOCAL one it is handed $s0 by local-alloc (which runs + * BEFORE global-alloc), which then forces the actor — it conflicts with r — onto $s1 and + * lets `anim` (which does not conflict) take $s0. One shared local ⇒ $s0/$s1 swapped + * across the ENTIRE function (98 mismatches). + * + * 2. BLKmode STACK SLOTS ARE ROUNDED TO 8. `u16 sxy[2]` (4 bytes) occupies EIGHT bytes and + * pushed z/flag from sp+0x4C/0x50 to sp+0x50/0x54. A scalar `s32 sxy` read through + * `*(u16 *)&sxy` keeps the 4-byte slot. (Same reason the RTP_SND sibling packs its + * sxy/z/flag into ONE struct.) `s32 mv[4]` + `V8_801886FC pad[2]` are the 0x10..0x2F filler that + * makes vars = 0x48 ⇒ frame 0x68. + * + * 3. §21 ZERO-BYTE RE-TIE on `vol`. Both magic-multiplies write the same match_scratch, so + * sched1 (the PRE-reload pass — verified with -fno-schedule-insns/-insns2) is free to swap + * them and always hoisted the PAN multiply first, inverting the whole tail schedule and + * losing the mfhi→mult hazard nop. Source statement order does NOT move it (9 spellings + * swept, all identical); only the re-tie does. Worth +2 ins and 33 mismatches. + * + * 4. REUSE ONE VARIABLE FOR X AND PAN. gcc-2.7.2 has no live-range splitting, so one C local + * == one hard register: writing `sx = (sx + 0xA0) / 0x14;` (instead of a fresh `pan`) is + * what keeps the pan field in $a2 — a separate `pan` local is a fresh allocno and takes the + * dying $v1 instead. Register PINS on `pan` made it WORSE (6 → 10): a local `register` + * var is the hard reg for its whole range and evicts the block's temps. Only `av` needed + * a pin ($a1). + * Sub-lever: `pan = pan << 8;` must be an IN-PLACE statement (`sll $a2,$a2,8`), not + * `(pan << 8)` in the expression — reorg can only steal the shift into the bne delay slot + * when it is dead on the fall-through, i.e. when dest == src. That is the last +1 ins. + * Sub-lever: the OR must be spelled `vol | (0x3000 | sx)`. fold's `associate:` rewrites + * `(VAR|CON)|ARG1` to `(CON|ARG1)|VAR`, which is what puts `ori ...,0x3000` on VOL and the + * plain `or` on the pan field — and this nesting is the only one of six spellings that + * also gets the commutative `or`'s operand order right. + * + * DECLARATION SURFACE (RE-AUDITED against the WHOLE TU — above AND below the splice point). + * The first audit only looked ABOVE the INCLUDE_ASM at TU:4680 and wrongly concluded that + * func_8012BE98 / func_8012B744 / func_8012BD3C / RotTransPers / D_800AF648 "appear nowhere". + * They are all declared by the banked sibling func_8018389C at TU:4846-4857, i.e. BELOW the + * splice, and cc1 reports only the FIRST conflict — so the byte-correct body was refused with + * "conflicting types for func_8012BE98 / func_8012B744". + * Every symbol below now carries the TU's ONE existing spelling VERBATIM; where the type + * disagreed with what this body wants, the disagreement is pushed to a cast at the USE site + * (lever A), which is zero-byte — re-verified MATCH (237 ins) after the change. + * + * copied VERBATIM from their existing TU spellings — + * func_8012A828 (TU:3527 et al), func_8012B608 (4163/4240/4848), + * func_8012B1B4 (4164/4241/4697/4849), func_8012CBA4 (4343/4699/4850), + * func_8004787C (2206/4700), func_80047948 (2205/4701), func_80133784 (599/4702), + * func_8002D4C8 (59/4855), func_8004914C / func_800491AC (2646/2647/4852/4853), + * RotTransPers (4854/5017), D_800AF648 (4857/5025), D_801BBE74 (5378), + * func_8012BD3C (4851), + * func_8012BE98 (4846, `extern void func_8012BE98(s32 a0, u16 *a1)`) <- CONFORMED, + * func_8012B744 (4847, `extern s32 func_8012B744(void *a0, void *a1)`) <- CONFORMED. + * USE-SITE casts that absorb the two conformed types (same idiom as the sibling at TU:4876) — + * ((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)anim) -- void-declared, returns s32 + * func_8012B744((void *)(a0 + 4), (void *)anim) -- s32 args -> void * params + * NOT declared anywhere in the TU (so this form is free) — D_801BB7E4 only. + * D_801BB7E4 is a real dlabel in asm/ov_SC02_026/data/tail.data.s:60402. + * func_801886FC itself has NO prototype anywhere in the TU or in any included header (only + * the INCLUDE_ASM at 4680), so no §37/§124 asm-label alias is needed on the defined symbol. + * The TU includes ../shared/engine_core.h but expands ZERO DEFINE_func_*()/DEFINE_data_*() + * macros (verified by grep), so that header contributes no file-scope declaration here. + * The conformed func_8012B744 type is also the fleet-dominant one (engine_core.h:3723) and + * RotTransPers' is the one engine_core.h:108 uses, so both stay compatible if a macro is + * ever spliced in. + */ + +extern void func_8012A828(s32 a0, s32 a1); +extern void func_8012BE98(s32 a0, u16 *a1); +extern s32 func_8012B744(void *a0, void *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +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_801886FC(s32 a0) { + + extern u8 D_800AF648; + extern u8 D_801BBE74[]; + extern u8 D_801BB7E4[]; + typedef struct { + u16 x, y, z, w; + } V8_801886FC; + s32 mv[4]; /* sp+0x10 : the 4-word block handed to func_8012B1B4 */ + V8_801886FC pad[2]; /* sp+0x20 : gcc's own area (vars must be 0x48 for a 0x68 frame) */ + V8_801886FC sp30; /* sp+0x30 : func_80133784 arg1 */ + V8_801886FC sp38; /* sp+0x38 : func_80133784 arg2 */ + s16 v[4]; /* sp+0x40 : RotTransPers arg0 */ + s32 sxy; /* sp+0x48 : DVECTOR — see lever 2, a u16[2] here costs 8 bytes */ + s32 z; /* sp+0x4C */ + s32 flag; /* sp+0x50 */ + s32 anim; + s32 r; + s32 t; + + if (*(u16 *)(a0 + 0x72) & 0x4000) { + func_8012A828(a0, (s32)D_801BBE74); + *(s16 *)(a0 + 0xFE) = 0; + } + + anim = a0 + 0x88; + *(u16 *)(a0 + 0xFC) = *(u16 *)(a0 + 0xFC) + 1; + if (((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)anim) >= 0x1000) { + s32 d = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), + func_8012B744((void *)(a0 + 4), (void *)anim), 0x20); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + d; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; + } + + mv[0] = 0; + mv[1] = 0; + mv[2] = -(*(s16 *)(a0 + 0xFC) << 17) / 0x18; + func_8012B1B4(a0, (s32)mv); + + if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { + s32 d; + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + d = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), + func_8012B744((void *)(a0 + 4), (void *)anim), 0x20); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + d; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; + } + + t = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + r = 0x30; + sp30.x = *(u16 *)(a0 + 0x6) - ((t * r) >> 12); + sp30.y = *(u16 *)(a0 + 0xA) - 0x20; + t = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + sp30.z = *(u16 *)(a0 + 0xE) - ((t * r) >> 12); + sp38.x = sp30.x; + sp38.y = sp30.y + 0x60; + sp38.z = sp30.z; + + if ((func_80133784(1, &sp30, (s32)&sp38) & 0x6000) == 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + + if (*(s16 *)(a0 + 0xFE) == 0 && func_8012BD3C(a0, 0x200, 0x40000) == 1) { + func_8012A828(a0, (s32)D_801BB7E4); + *(s16 *)(a0 + 0x2) = 2; + v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); + v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); + v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); + /* $a0-pinned scopes: rematerialise &D_800AF648 (lui/addiu) before EACH call */ + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } + RotTransPers((s32)v, (s32)&sxy, &z, &flag); + if (flag >= 0 && (u32)((*(u16 *)&sxy + 0x9F) & 0xFFFF) < 0x13F + && (u32)((*((u16 *)&sxy + 1) + 0x77) & 0xFFFF) < 0xEF) { + s32 sx; /* screen X, then REUSED as the pan field */ + register s32 av __asm__("$5"); /* |X| — the one pin that helped */ + s32 vol; + sx = (s16)*(u16 *)&sxy; + av = sx; + if (sx < 0) { + av = -sx; + } + vol = ((0xA0 - av) * 0x7F) / 0xA0; + /* lever 3: sched1 otherwise hoists the PAN multiply ahead of this one */ + __asm__("" : "=r"(vol) : "0"(vol)); + sx = (sx + 0xA0) / 0x14; + if (sx == 0x10) { + sx = 0xF; + } + sx = sx << 8; /* in place, so reorg can steal it */ + func_8002D4C8(0xA9B, (vol | (0x3000 | sx)) & 0xFFFF); + } + } + + if (*(s16 *)(a0 + 0xFC) == 0x18) { + *(s16 *)(a0 + 0xFC) = 0; + } +} + + + +/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c): + * func_8012B1B4 TU:3931/4008/4455/4529 + * func_8012B8E4 TU:4456/4528 (not declared above the splice; same form) + * func_8012CBA4 TU:4110/4457 (void return -> cast at the use site) + * func_8004787C TU:2206/3652/4190/4458 + * func_80047948 TU:2205/3651/4459 + * func_80133784 TU:599/855/4460 + * func_8012BCCC TU:3928/4005/4461 + * func_8012BDBC TU:4462/5984 + * func_8012A828 TU:3527/3810/…/4463 (23 decls, all this form) + * rand TU:957/4154/4189/4214/4622 + * D_801BC97C TU:4800/5275/5298 as `extern u8 D_801BC97C[]` + * D_801BC774 / D_801BC0F4 appear nowhere else in the TU; same canonical form. */ +extern void func_8012B1B4(s32 a0, s32 a1); +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012BCCC(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); +extern s32 rand(void); + +void func_80188AB0(s32 a0) { + + extern u8 D_801BC774[]; + extern u8 D_801BC0F4[]; + extern u8 D_801BC97C[]; + typedef struct { + u16 x, y, z, w; + } V8_80188AB0; + s32 sp10[4]; + V8_80188AB0 pad[2]; + V8_80188AB0 sp30; + V8_80188AB0 sp38; + s32 t; + s32 r; + s32 v; + + *(s16 *)(a0 + 0xFC) = *(u16 *)(a0 + 0xFC) + 1; + sp10[0] = 0; + sp10[1] = 0; + sp10[2] = (*(s16 *)(a0 + 0xFC) * -0x20000) / 0x24; + func_8012B1B4(a0, (s32)sp10); + + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; + + if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + + v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + r = 0x30; + sp30.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12); + sp30.y = *(u16 *)(a0 + 0xA) - 0x20; + v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + sp30.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12); + sp38.x = sp30.x; + sp38.y = sp30.y + 0x60; + sp38.z = sp30.z; + + if ((func_80133784(1, &sp30, (s32)&sp38) & 0x6000) == 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + + t = func_8012BCCC(a0); + if (t < 0x1001) { + if (func_8012BDBC(a0, 0x200) == 1) { + s32 s; + if ((rand() & 3) == 0) { + func_8012A828(a0, (s32)D_801BC774); + s = 0x5; + } else { + func_8012A828(a0, (s32)D_801BC0F4); + s = 0xF; + } + *(s16 *)(a0 + 0x2) = s; + } + } + if (t > 0x40000) { + func_8012A828(a0, (s32)D_801BC97C); + *(s16 *)(a0 + 0x2) = 1; + *(s16 *)(a0 + 0xFC) = 0; + *(s16 *)(a0 + 0xFE) = 1; + } + if (*(s16 *)(a0 + 0xFC) == 0x24) { + *(s16 *)(a0 + 0xFC) = 0; + } +} + + + +/* func_80188CF0 — ov_SC02_026 jr_8017C180 family exemplar (15 members). + * + * §136c sibling-first: the RTP + positional-sound tail is the byte-proven + * RTP_SND block from src/ov_SC06_030/ov_SC06_030_jr_8017C8D0.c:3480 + * (func_8017E120) — `u16 sxy[2]`, the `(u32)((sxy[i] + K) & 0xFFFF) < N` + * range tests, the explicit `(s16)sxy[0]` sign-extension (sll/sra off the + * already-loaded lhu), and the $a0-pinned scopes that REMATERIALISE + * &D_800AF648 per call instead of letting CSE hoist it into a callee-saved + * register (which would shove the actor out of $s0). + * + * The head (func_8012B608 accumulate + &0xFFF) copies the form banked at + * TU:3941 (func_80180C80) / TU:4478 (func_80183B04). Head + RTP were right on + * the first compile (115/154); the panner tail took SIX levers, each measured: + * + * 1. FRAME PADDING (idiom 6). Locals start at sp+0x10 (the o32 outgoing-arg + * area) but the RTP block is at sp+0x20, so 16 bytes of padding precede it. + * It must be an AGGREGATE — a scalar becomes a pseudo and vanishes; only + * assign_stack_local aggregates size the frame. vars 0x28 => frame 0x48. + * + * 2. THE abs TESTS `x`, NOT `ax`. Target is + * bgez $a2,L / addu $a1,$a2,$zero (DELAY SLOT) / negu $a1,$a2 / L: + * i.e. `ax = x; if (x < 0) ax = -x;`. The textbook `if (ax < 0) ax = -ax;` + * makes the branch DEPEND on the copy, so reorg cannot sink `move ax,x` + * into the delay slot: it emits the copy first and fills the slot with the + * divide magic's `lui` (12 off). `__builtin_abs` is the WRONG lever here — + * it is one abssi2 insn, the block never splits, and the whole divide pair + * re-schedules (22 off). + * + * 3. $a1-PIN ON THE abs RESULT (§40 / ov_SC03_006_jr_8012ACE0.c:816). + * Unpinned, local-alloc's combine_regs ties the abs dest to its dying input + * and every downstream register shifts (12 off). Pin ONLY the abs result: + * pinning `x` or the pan quotient re-seats the divide chain (17 / 8 off). + * + * 4. ZERO-BYTE RE-TIE ON `vol` (§21 / S4). Both divides share one HI/LO, so + * the scheduler must choose which `mult` issues first, and priority is + * height-to-block-end: the pan quotient feeds the `bne`, so it wins and the + * vol chain sinks (41 off, -2 ins). A NON-volatile + * `__asm__("" : "=r"(vol) : "0"(vol));` gives `vol` a free in-block + * consumer, flipping the chains back to the target's + * `mult / mfhi $t1 / addiu / nop / mult` (that `nop` is the mfhi->mult + * hazard and IS in the target). A *volatile* asm over-serialises (35 off). + * + * 5. THE PAN QUOTIENT IS THE SAME VARIABLE AS `x` (§136 L1 — the Ghidra seed + * had this right, it reuses iVar5). Target's `subu $a2,$v1,$v0` puts the + * quotient back in x's register; a separate `pan` local is a fresh global + * allocno and takes $v1 (earlier in REG_ALLOC_ORDER) — 6 off, and no pin + * fixes it. + * + * 6. 0x3000 IN A LOCAL, NOT A LITERAL. fold reassociates + * `(vol | 0x3000) | pan` into `vol | (pan | 0x3000)`, landing the `ori` on + * the shifted pan — in EVERY literal spelling swept (2-5 off). Hoisting it + * into `flg` leaves no constant for fold to move, and keeping the OR inside + * the call ARGUMENT preserves the target's `addiu $a0,0xA9B` -> `ori` -> + * `or` order (a standalone `vol |= 0x3000;` statement fixes the tree but + * swaps those two, 2 off). + * + * Declarations: func_8012B608 / func_8012B1B4 / func_8012CBA4 / + * func_8004914C / func_800491AC / func_8002D4C8 / D_801AF72C are copied + * VERBATIM from the TU (lines 3930, 3931, 4110, 2646, 2647, 59, 4464). + * func_8012BE98 / func_8012B744 / func_8012BD3C / RotTransPers / D_800AF648 + * appear NOWHERE in the TU, so the fleet-dominant forms are used and the + * return value of the `void`-declared func_8012BE98 is taken through a cast + * at the call site (idiom 9). + */ + +extern void func_8012BE98(s32 a0, u16 *a1); +extern s32 func_8012B744(void *a0, void *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +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_80188CF0(s32 a0) { + + extern u8 D_800AF648; + extern u8 D_801AF72C[]; + /* locals start at sp+0x10 (the 16-byte outgoing-arg area). The first + 16 bytes are unreferenced in this function but are part of the + frame — vars must be 0x28, i.e. frame 0x48. */ + struct { + s32 pad0[4]; /* sp+0x10 */ + s16 v[3]; /* sp+0x20 */ + s16 pad1; /* sp+0x26 */ + u16 sxy[2]; /* sp+0x28 */ + s32 z; /* sp+0x2C */ + s32 flag; /* sp+0x30 */ + } L; + void *p88; + + p88 = (void *)(a0 + 0x88); + + if (((s32 (*)(s32, u16 *))func_8012BE98)(a0, (u16 *)p88) >= 0x1000) { + s32 r = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), + func_8012B744((void *)(a0 + 4), p88), 0x20); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; + } + + func_8012B1B4(a0, (s32)D_801AF72C); + + if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { + s32 r2; + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + r2 = func_8012B608(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12), + func_8012B744((void *)(a0 + 4), p88), 0x20); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) + r2; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF; + } + + if (func_8012BD3C(a0, 0x200, 0x40000) == 1) { + *(s16 *)(a0 + 0x2) = 7; + L.v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); + L.v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); + L.v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } + RotTransPers((s32)L.v, (s32)L.sxy, &L.z, &L.flag); + if (L.flag >= 0 && (u32)((L.sxy[0] + 0x9F) & 0xFFFF) < 0x13F + && (u32)((L.sxy[1] + 0x77) & 0xFFFF) < 0xEF) { + s32 x = (s16)L.sxy[0]; + register s32 ax __asm__("$5"); + s32 vol; + ax = x; + if (x < 0) { + ax = -x; + } + vol = ((0xA0 - ax) * 0x7F) / 0xA0; + __asm__("" : "=r"(vol) : "0"(vol)); + x = (x + 0xA0) / 0x14; + if (x == 0x10) { + x = 0xF; + } + x = x << 8; + { + s32 flg = 0x3000; + func_8002D4C8(0xA9B, ((vol | flg) | x) & 0xFFFF); + } + } + } +} + + + +extern void func_8012B1B4(s32 a0, s32 a1); +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012BCCC(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); + +void func_80188F58(s32 a0) { + + extern u8 D_801AF72C[]; + extern u8 D_801BC434[]; + typedef struct { + u16 x, y, z, w; + } V8_80188F58; + V8_80188F58 pad[2]; + V8_80188F58 sp20; + V8_80188F58 sp28; + s32 t; + s32 r; + s32 v; + + func_8012B1B4(a0, (s32)D_801AF72C); + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; + + if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + + v = func_8004787C(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + r = 0x30; + sp20.x = *(u16 *)(a0 + 0x6) - ((v * r) >> 12); + sp20.y = *(u16 *)(a0 + 0xA) - 0x20; + v = func_80047948(*(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) & 0xFFF); + sp20.z = *(u16 *)(a0 + 0xE) - ((v * r) >> 12); + sp28.x = sp20.x; + sp28.y = sp20.y + 0x60; + sp28.z = sp20.z; + + if ((func_80133784(1, &sp20, (s32)&sp28) & 0x6000) == 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + + t = func_8012BCCC(a0); + if (t < 0x2401) { + if (func_8012BDBC(a0, 0x200) == 1) { + *(s16 *)(a0 + 0x2) = 0x11; + func_8012A828(a0, (s32)D_801BC434); + } + } + if (t > 0x40000) { + *(s16 *)(a0 + 0x2) = 6; + } +} + + + +/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c) where they + * already exist, so the splice introduces no conflicting types: + * func_8002D4C8 TU:59/3245/3279/4619/4909/… `void (s32,s32)` + * func_8012BCCC TU:3928/4005/4461 `s32 (s32)` + * func_8012A828 TU:3527/3810/…/4463 `void (s32,s32)` (23 decls, all this form) + * func_8012B8E4 TU:4456/4528 `s32 (s32,s32)` + * func_8012B1B4 TU:3931/4008/4455/4529 `void (s32,s32)` + * func_8012CBCC TU:3907/3932/4530 `void (s32)` + * func_8004914C TU:2646 `void (void *)` + * func_800491AC TU:2647 `void (void *)` + * D_80126B62 TU:1793/4533 `u16` -> cast to s16* at the use site + * D_801AF464 TU:4722 (block scope) `s32` -> `(s32)&D_801AF464 | …` (line 4753) + * RotTransPers / D_800AF648 are not declared in this TU; the forms below are the + * fleet-canonical ones (ov_SC02_026_jr_80140608.c:416/2312, o0c.c:365/371). + * D_801BCF84 / D_801AF738 appear nowhere else in the TU (real dlabels in + * asm/ov_SC02_026/data/tail.data.s:61984 / :47419); same canonical `extern s32` form + * as the neighbouring D_801BD190 (TU:4385). */ +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); +extern s32 func_8012BCCC(s32 a0); +extern void func_8012A828(s32 a0, s32 a1); +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBCC(s32 a0); + + +void func_80189100(s32 a0) { + + extern u8 D_800AF648; + extern s32 D_801BCF84; + extern s32 D_801AF464; + extern s32 D_801AF738; + extern u16 D_80126B62; + /* sp+0x10 local block. Frame is 0x38 = 0x10 outgoing args + 0x20 vars + + * 8 saved regs ($s0,$ra), so the vars block is 12 bytes larger than the + * fields this function actually touches -> trailing `unused[3]`. */ + struct { + s16 v[3]; /* sp+0x10 */ + s16 pad0; /* sp+0x16 */ + u16 sxy[2]; /* sp+0x18 */ + s32 z; /* sp+0x1C */ + s32 flag; /* sp+0x20 */ + s32 unused[1]; /* sp+0x24 */ + } L; + s16 x; + s32 y; + + if (*(s32 *)(a0 + 0x94) == 0xD) { + L.v[0] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x48); + L.v[1] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x4C); + L.v[2] = *(s32 *)(*(s32 *)(a0 + 0x20) + 0x50); + /* $a0-pinned scopes force the &D_800AF648 constant to be rematerialised + * per call (cookbook §88a); otherwise CSE parks it in a callee-saved reg + * and mis-seats every register in the function. */ + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_8004914C(r4); } + { register void *r4 __asm__("$4"); r4 = &D_800AF648; func_800491AC(r4); } + RotTransPers((s32)L.v, (s32)L.sxy, &L.z, &L.flag); + if (L.flag >= 0 && (u32)((L.sxy[0] + 0x9F) & 0xFFFF) < 0x13F + && (u32)((L.sxy[1] + 0x77) & 0xFFFF) < 0xEF) { + s32 vol = (s16)L.sxy[0]; + if (vol < 0) { + vol = -vol; + } + vol = ((0xA0 - vol) * 127) / 160; + func_8002D4C8(0x702, (vol | 0x1000) & 0xFFFF); + } + } + + if (func_8012BCCC(a0) <= 0x24000) { + s16 c; + c = *(u16 *)(a0 + 0x102) + 1; + *(s16 *)(a0 + 0x102) = c; + if (c >= 0x78) { + if ((*(u16 *)(a0 + 0x100) & 0x2000) == 0) { + func_8012A828(a0, (s32)&D_801BCF84); + *(s16 *)(a0 + 0x2) = 10; + *(s16 *)(a0 + 0x102) = 0; + *(s32 *)(a0 + 0x58) = (s32)&D_801AF464 | 0x40000000 | 0x20000000; + } + } + } + + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x10); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; + + x = *(s16 *)(a0 + 0xA); + y = *(s16 *)&D_80126B62; + if (x <= y - 0x100) { + *(s16 *)(a0 + 0xA) = x + 0x8; + } else if (x >= y - 0x80) { + *(s16 *)(a0 + 0xA) = x - 0x8; + } + + func_8012B1B4(a0, (s32)&D_801AF738); + func_8012CBCC(a0); +} + + + +/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c) where they + * already exist, so the splice introduces no conflicting types: + * func_8012B1B4 TU:3892/3969/4452/4498/4623 + * func_8012CBCC TU:3868/3893/3970/4665/4824 + * D_80126B5C TU:362 (u8 -> cast to s32* at the use site, the load is `lw`) + * D_80126B62 TU:1793 (u16 -> cast to s16* at the use site, the load is `lh`) + * func_8012B8E4 and D_80126B64 are not yet declared in this TU; the forms below are + * the ones used everywhere else in src/ (s32 return / extern s32). */ +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBCC(s32 a0); + + +void func_8018934C(s32 a0) { + + extern u8 D_80126B5C; + extern u16 D_80126B62; + extern s32 D_80126B64; + /* sp10[0..3] is the 4-word block handed to func_8012B1B4 ($a1 = sp+0x10). + * The frame's extra 8 bytes at sp+0x20 are gcc's OWN spill area (cookbook + * §83c) -- declaring them as a 6th/5th array element makes the frame 0x40. */ + s32 sp10[4]; + s16 t; + s32 y; + + if (*(s32 *)(a0 + 0x94) == 0xA) { + *(s16 *)(a0 + 0x98) = 0; + } + + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) += func_8012B8E4(a0, 0x4); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) &= 0xFFF; + + sp10[0] = 0; + sp10[1] = 0; + + sp10[2] = *(s32 *)(a0 + 0x4) - *(s32 *)&D_80126B5C; + if (sp10[2] > 0) { + sp10[2] = -sp10[2]; + } + sp10[3] = *(s32 *)(a0 + 0xC) - D_80126B64; + if (sp10[3] > 0) { + sp10[3] = -sp10[3]; + } + sp10[2] = (sp10[2] + sp10[3]) >> 4; + func_8012B1B4(a0, (s32)sp10); + + t = *(s16 *)(a0 + 0xA); + y = *(s16 *)&D_80126B62; + if (t <= y - 0xA) { + *(s16 *)(a0 + 0xA) = t + 0x8; + } else if (t >= y) { + *(s16 *)(a0 + 0xA) = t - 0x8; + } else if (*(s32 *)(a0 + 0x94) == 0xA) { + *(s16 *)(a0 + 0x2) = 0xB; + *(s16 *)(a0 + 0x98) = 1; + } + + func_8012CBCC(a0); +} + + + + +void func_80189498(u8 *s0) { + + extern void (*D_801AF750[])(void *); + extern u8 D_801202A0[]; + u16 v0; + s32 a0; + u8 *v1; + + // Call indirect function based on index at s0[2] + v0 = *(u16 *)(s0 + 0x2); + ((void (*)(u8 *))D_801AF750[v0])(s0); + + // Check if s0[0] is zero + v0 = *(u16 *)(s0); + if (v0 == 0) return; + + // Check if s0[0x100] & 0x1000 is zero + v0 = *(u16 *)(s0 + 0x100); + if ((v0 & 0x1000) == 0) return; + + // Search for entry in D_801202A0 table + v1 = D_801202A0; + for (a0 = 0; a0 < 0x60; a0++) { + if (*(u16 *)(v1) == 0x15E) { + s16 v1_val = *(s16 *)(v1 + 0x6); + s16 s0_val = *(s16 *)(s0 + 0x6); + if (s0_val < v1_val + 0xF0) { + *(s16 *)(s0 + 0x6) = v1_val + 0xF0; + } + return; + } + v1 += 0x10C; + } +} + + + + + +extern s32 func_8012B77C(s32 out, s32 from, s32 to); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8012C218(void *a0); +extern s32 func_80143C74(s32 a0, s32 a1); +extern s32 rand(void); + +void func_80189550(s32 param_1) +{ + + extern s32 D_801151D4; + s32 sp10[4]; + s32 sp20; + s32 v0; + s32 v1; + + v0 = *(s32 *)(param_1 + 0x1C); + v1 = D_801151D4; + *(s32 *)(param_1 + 0x1C) = v0 - 1; + *(s16 *)((s32)sp10 + 0x2) = *(s32 *)(v1 + 0x5C); + *(s16 *)((s32)sp10 + 0x6) = *(s32 *)(v1 + 0x60); + *(s16 *)((s32)sp10 + 0xA) = *(s32 *)(v1 + 0x64); + func_8012B77C((s32)&sp20, param_1 + 4, (s32)sp10); + + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = (sp20 + 0x400) & 0xFFF; + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x18) += 0x55; + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x1A) += 0x55; + + v1 = *(s32 *)(param_1 + 0x1C); + if (v1 == 0xF) { + func_8002D4C8(0xCBA, 0); + v1 = *(s32 *)(param_1 + 0x1C); + } + if (v1 < 0x10) { + if (v1 == 0) { + func_8012C218((void *)param_1); + } else { + param_1 = func_80143C74(param_1, 0); + if (param_1 != 0) { + *(s16 *)(param_1 + 0x16) = -4; + v0 = rand(); + *(s16 *)(param_1 + 0x12) = (v0 & 7) - 4; + v0 = rand(); + *(s16 *)(param_1 + 0x1A) = (v0 & 7) - 4; + v0 = rand(); + { s32 t = *(u16 *)(param_1 + 0x6) - 0x10; *(s16 *)(param_1 + 0x6) = t + (v0 & 0x1F); } + v0 = rand(); + { s32 t = *(u16 *)(param_1 + 0xE) - 0x10; *(s16 *)(param_1 + 0xE) = t + (v0 & 0x1F); } + } + } + } +} + + + +extern s32 func_8012D624(void *a0, s32 a1, s32 a2); +extern void func_8012C218(void *a0); +extern void func_8012B370(void *a0); + +void func_801896A4(void *a0) { + + extern void (*D_801AF7E0[])(void *); + u16 temp; + s32 a1; + + D_801AF7E0[*(u16 *)((s32)a0 + 0x2)](a0); + + if (*(u16 *)((s32)a0 + 0x0) != 0) { + *(u16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) - 0x40; + temp = *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x18); + a1 = (s32)(temp << 16) >> 24; + if (func_8012D624(a0, a1, 0x14) == 1) { + func_8012C218(a0); + } else { + *(u16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) + 0x40; + func_8012B370(a0); + } + } +} + + + + +extern s32 func_8012D624(void *a0, s32 a1, s32 a2); +extern void func_8012C218(void *a0); + +void func_80189750(void *a0) { + + extern void (*D_801AF940[])(void); + extern u16 D_80126B96; + u16 *q; + + D_801AF940[*(u16 *)((s32)a0 + 0x2)](); + if (*(u16 *)((s32)a0 + 0x0) != 0) { + *(s16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) - 0x40; + if (func_8012D624(a0, 0x10, 0x16) == 1) { + q = &D_80126B96; + *q |= 0x200; + func_8012C218(a0); + } else { + *(s16 *)((s32)a0 + 0xa) = *(u16 *)((s32)a0 + 0xa) + 0x40; + } + } +} + + + + +void func_80189800(void *a0) { + extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); + extern void func_8012A828(s32 a0, s32 a1); + extern void func_80131E00(void *a0, s32 a1); + extern s32 D_801BCD04; + extern s32 D_801AF5CC; + extern s32 D_801AF464; + + u16 buf[8]; + register u16 v0 __asm__("$2"); + register u16 v1 __asm__("$3"); + register u16 a2 __asm__("$6"); + + v0 = *(u16 *)((s32)a0 + 0x6); + *(u16 *)(&buf[0]) = v0; + *(u16 *)(&buf[4]) = v0; + + v1 = *(u16 *)((s32)a0 + 0xA); + v0 = v1 - 8; + *(u16 *)(&buf[1]) = v1; + *(u16 *)(&buf[5]) = v1; + + a2 = *(u16 *)((s32)a0 + 0xE); + v1 = v1 + 8; + *(u16 *)(&buf[1]) = v0; + *(u16 *)(&buf[5]) = v1; + *(u16 *)(&buf[2]) = a2; + *(u16 *)(&buf[6]) = a2; + + if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x1F) != 0) { + func_80131E00(a0, 6); + } else { + func_8012A828((s32)a0, (s32)&D_801BCD04); + *(u16 *)((s32)a0 + 0x2) = 1; + *(u16 *)((s32)a0 + 0x5C) = (u16)0xAA10; + *(s32 *)((s32)a0 + 0xBC) = (s32)&D_801AF5CC; + *(s16 *)((s32)a0 + 0xFC) = 0; + *(s32 *)((s32)a0 + 0x58) = (s32)&D_801AF464 | 0x40000000 | 0x20000000; + *(s16 *)((s32)a0 + 0x88) = *(u16 *)((s32)a0 + 0x6); + *(s16 *)((s32)a0 + 0x8A) = *(u16 *)((s32)a0 + 0xA); + *(s16 *)((s32)a0 + 0x8C) = *(u16 *)((s32)a0 + 0xE); + } +} + + + + +/* func_801898E8 — "ground-collision probe, then either bounce-off or pick a state script" + * (jr_8017C180 family; byte-verified MATCH, 71 ins). + * + * Declaration provenance (whole-TU grep in one pass, cookbook §135-8 / D2 — every symbol below + * checked BOTH above and below the splice point at ov_SC02_026_jr_8017C180.c:4748): + * func_8012CEB0(s32,s32,s32) — TU decls at 4365 (file scope) / 4704 / 4851, identical form + * func_8012A828(s32,s32) — 23 TU decls, all this form (or the unnamed-param twin) + * func_80131E00(void*,s32) — TU fn-scope decls at 4706 / 4853, identical form + * D_801BC97C — declared BELOW the splice point at 5158 as `extern u8 D_801BC97C[]`; + * that exact type is reused here so the two cannot conflict + * D_801BB0B4 / D_801BB2BC / D_801BBE74 — real dlabels in asm/ov_SC02_026/data/tail.data.s, + * declared nowhere else in this TU (D_801BBE74's `void (*[])(void)` + * decl lives in a DIFFERENT TU, ov_SC03_125, so it is not a conflict) + * + * Codegen notes: + * - The buf[8] halfword-pair setup + the three $2/$3/$6 pins are the byte-verified twin of + * func_801843AC in THIS TU (line 4703). The doubled buf[1]/buf[5] stores are real: the ±8 + * adjust is a SECOND store to the same slot, and §135-4 (the list scheduler preserves the + * relative order of disambiguable stores) is what emits sh/sh then sh/sh off one lhu of a0+0xA. + * - 0x5C takes `ori $v0,$zero,0xAA10`, so the destination must be UNSIGNED (§135-3): through a + * s16 the constant folds negative and gcc emits `addiu` instead. + * - The 0x100 |= 0x8000 arm needs the plain `x = x | 0x8000` read-modify-write; gcc allocates the + * address pseudo to $a0 (the pending call arg) on its own, which is why the lhu/sh are + * $a0-based while everything else is $s0-based. + * - THE RESIDUAL THAT DECIDED THIS FUNCTION: the D_801BC97C/D_801BBE74 selector must be TWO + * SEPARATE CALLS, not a `tbl = cond ? A : B;` select feeding one call. With a select, both + * arms are single sets of the same pseudo, and gcc-2.7.2's jump.c rewrites + * `if (c) t=A; else t=B;` into `t=B; if (c) t=A;` — the D_801BBE74 lui/addiu hoists ABOVE the + * beqz and the whole tail shifts (-3 ins, LENGTH-DRIFT, 20 mismatches). Two calls are not + * simple sets, so the transform cannot fire; cross_jump then merges only the common + * [move $a0,$s0; jal] tail, which is exactly the target's j-over-arm shape. + */ + +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012A828(s32 a0, s32 a1); +extern void func_80131E00(void *a0, s32 a1); + +void func_801898E8(void *a0) { + + extern u8 D_801BB0B4[]; + extern u8 D_801BB2BC[]; + extern u8 D_801BBE74[]; + extern u8 D_801BC97C[]; + u16 buf[8]; + register u16 v0 __asm__("$2"); + register u16 v1 __asm__("$3"); + register u16 a2 __asm__("$6"); + + v0 = *(u16 *)((s32)a0 + 0x6); + buf[0] = v0; + buf[4] = v0; + + v1 = *(u16 *)((s32)a0 + 0xA); + v0 = v1 - 8; + buf[1] = v1; + buf[5] = v1; + + a2 = *(u16 *)((s32)a0 + 0xE); + v1 = v1 + 8; + buf[1] = v0; + buf[5] = v1; + buf[2] = a2; + buf[6] = a2; + + if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x1F) != 0) { + *(u16 *)((s32)a0 + 0x100) = *(u16 *)((s32)a0 + 0x100) | 0x8000; + func_80131E00(a0, 6); + } else { + if (*(s32 *)((s32)a0 + 0x90) == (s32)&D_801BB2BC) { + func_8012A828((s32)a0, (s32)&D_801BB0B4); + *(u16 *)((s32)a0 + 0x2) = 0x14; + *(u16 *)((s32)a0 + 0x34) = 1; + *(s16 *)((s32)a0 + 0xFE) = 0; + *(s32 *)((s32)a0 + 0xCC) = (s32)&D_801BBE74; + } else { + if (*(s16 *)((s32)a0 + 0xFE) != 0) { + func_8012A828((s32)a0, (s32)&D_801BC97C); + } else { + func_8012A828((s32)a0, (s32)&D_801BBE74); + } + *(u16 *)((s32)a0 + 0x2) = 1; + } + *(s16 *)((s32)a0 + 0xFC) = 0; + *(u16 *)((s32)a0 + 0x5C) = (u16)0xAA10; + } +} + + +extern void func_8002A04C(s32 a0); +extern void func_8012B2CC(s32 a0); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); + +extern void func_8012C098(void *param_1); + +void func_80189A04(s32 a0) { + s32 ent; + + if (*(u16 *)a0 != 0) { + if (*(s16 *)(a0 + 0x70) == 4) { + ent = func_8012C658(0x12C, 4, a0); + if (ent != 0) { + *(u16 *)(ent + 0x6) = *(u16 *)(a0 + 0x88); + *(u16 *)(ent + 0x88) = *(u16 *)(a0 + 0x88); + *(u16 *)(ent + 0xE) = *(u16 *)(a0 + 0x8C); + *(u16 *)(ent + 0x8C) = *(u16 *)(a0 + 0x8C); + *(u16 *)(ent + 0xA) = *(u16 *)(a0 + 0x8A) - 0x400; + *(u16 *)(ent + 0x8A) = *(u16 *)(a0 + 0x8A); + func_8012B2CC(ent); + } + } + if (func_80153BD8(a0)) { + func_80153BF0(a0); + } + if (*(s32 *)(a0 + 0x78) != 0) { + func_8002A04C(a0); + } + func_8012C098((void *)a0); + } +} + + + +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); + +void func_80189AE4(s32 a0) { + + extern u8 D_801AF448[]; + typedef struct { u16 x, y, z, w; } V8_80189AE4; + V8_80189AE4 sp10; + V8_80189AE4 sp18; + + if (*(s32 *)(a0 + 0x94) >= 8) { + *(s16 *)(a0 + 0xFE) = 1; + func_8012B1B4(a0, (s32)D_801AF448); + if ((((s32 (*)(s32))func_8012CBA4)(a0) & 0x6000) == 0) { + sp10.x = *(u16 *)(a0 + 0x3A); + sp10.y = *(u16 *)(a0 + 0x3E); + sp10.z = *(u16 *)(a0 + 0x42); + sp18 = sp10; + sp18.y += 8; + if (func_80133784(1, &sp10, (s32)&sp18) != 0) { + *(s32 *)(a0 + 0x4) = *(s32 *)(a0 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a0 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a0 + 0x40); + } + } + } +} + + + + +extern void func_80131B14(void); +extern void func_8012B23C(void *a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80189BBC(s32 a0) { + register s32 s0 __asm__("$16") = a0; + u16 v0 = *(u16 *)(s0 + 0x100); + u16 v1 = *(u16 *)(s0 + 0x60); + + v0 |= 0x8000; + v1 <<= 2; + + *(u16 *)(s0 + 0x100) = v0; + *(u16 *)(s0 + 0x60) = v1; + func_80131B14(); + + *(u8 *)(s0 + 0xC2) = 0; + *(u16 *)(s0 + 0x98) = 0; + func_8012B23C((void *)s0); + + func_80131A34(s0, 0x8); + func_8002D4C8(0xA74, 0); +} + + +extern s32 func_80153BD8(s32 arg); + extern s32 func_80153BF0(s32 a0); + void func_80189C24(u8 *a0) { + *(s16 *)(a0 + 0xfe) = 0; + if (func_80153BD8((s32)a0)) { + ((void (*)(void *))func_80153BF0)(a0); + } + } + + + + +/* Modeled on the byte-matched sibling func_801843AC in the same TU + * (src/ov_SC02_026/ov_SC02_026_jr_8017C180.c:4677-4719): identical two-box + * build + func_8012CEB0 collision probe, differing only in the mask (0x19 vs + * 0x1F) and the else-arm payload. All declarations are block-scope and copied + * verbatim from the TU so the splice introduces no conflicting types. */ + +void func_80189C60(void *a0) { + extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); + extern void func_8012A828(s32 a0, s32 a1); + extern void func_80131E00(void *a0, s32 a1); + extern char D_801BCDEC[]; + + u16 buf[8]; + register u16 v0 __asm__("$2"); + register u16 v1 __asm__("$3"); + register u16 a2 __asm__("$6"); + + v0 = *(u16 *)((s32)a0 + 0x6); + *(u16 *)(&buf[0]) = v0; + *(u16 *)(&buf[4]) = v0; + + v1 = *(u16 *)((s32)a0 + 0xA); + v0 = v1 - 8; + *(u16 *)(&buf[1]) = v1; + *(u16 *)(&buf[5]) = v1; + + a2 = *(u16 *)((s32)a0 + 0xE); + v1 = v1 + 8; + *(u16 *)(&buf[1]) = v0; + *(u16 *)(&buf[5]) = v1; + *(u16 *)(&buf[2]) = a2; + *(u16 *)(&buf[6]) = a2; + + if ((func_8012CEB0((s32)&buf[0], (s32)&buf[4], 0) & 0x19) != 0) { + func_80131E00(a0, 6); + } else { + func_8012A828((s32)a0, (s32)&D_801BCDEC); + *(u16 *)((s32)a0 + 0x2) = 6; + *(u16 *)((s32)a0 + 0x5C) = (u16)0xA810; + } +} + + + +/* Declarations copied VERBATIM from the TU (ov_SC02_026_jr_8017C180.c:4453-4456), + * so the splice introduces no conflicting types. Type disagreements are pushed + * to casts at the use sites (cookbook §37 lever A) — codegen-neutral. */ +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012CBA4(s32 a0); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); + +void func_80189D04(s32 *s0) { + + extern u8 D_801AF448[]; + typedef struct { + u16 a, b, c, d; + } Data_t_80189D04; + + Data_t_80189D04 buf_src, buf_dst; + s32 v0; + + func_8012B1B4((s32)s0, (s32)D_801AF448); + + v0 = ((s32 (*)(s32))func_8012CBA4)((s32)s0); + if (v0 & 0x6000) { + return; + } + + // Load halfwords from s0 + buf_src.a = *(u16 *)((u8 *)s0 + 0x3A); + buf_src.b = *(u16 *)((u8 *)s0 + 0x3E); + buf_src.c = *(u16 *)((u8 *)s0 + 0x42); + + // Struct assignment generates lwl/lwr + swl/swr + buf_dst = buf_src; + + // Modify the b field of buf_dst (at offset 2) + buf_dst.b += 8; + + v0 = func_80133784(1, &buf_src, (s32)&buf_dst); + if (v0 == 0) { + return; + } + + // Copy three words + *(s32 *)((u8 *)s0 + 0x04) = *(s32 *)((u8 *)s0 + 0x38); + *(s32 *)((u8 *)s0 + 0x08) = *(s32 *)((u8 *)s0 + 0x3C); + *(s32 *)((u8 *)s0 + 0x0C) = *(s32 *)((u8 *)s0 + 0x40); +} + + + + +extern void func_8012B14C(s32 a0, s32 a1); + +void func_80189DC4(s32 a0) +{ + + extern u8 D_801AF458[]; + *(s32 *)(a0 + 0xC4) = *(s32 *)(a0 + 0xC4) & -5; + func_8012B14C(a0, (s32)D_801AF458); +} + + +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); + +void func_80189DF8(s32 a0) +{ + s32 v0; + + if (*(u8 *)((s32)a0 + 0x5E) == 0x23) { + *(u16 *)((s32)a0 + 0x100) |= 0x4000; + } + v0 = func_80153BD8(a0); + if (v0 != 0) { + func_80153BF0(a0); + } +} + + +extern s32 func_80153BD8(s32 arg); + extern s32 func_80153BF0(s32 a0); + void func_80189E54(s32 param_1) { + if (func_80153BD8(param_1)) { + ((void (*)(s32))func_80153BF0)(param_1); + } + } + + + + +extern void func_8012A828(s32 a0, s32 a1); + +void func_80189E8C(s32 a0) +{ + + extern u8 D_801BB954[]; + if ((*(u16 *)(a0 + 0x72) & 0x4000) != 0) { + func_8012A828(a0, (s32)D_801BB954); + *(s16 *)(a0 + 0x2) = 3; + *(s16 *)(a0 + 0xFC) = 0; + *(s16 *)(a0 + 0xFE) = 1; + } +} + + + + +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); +extern void func_8012A828(s32 a0, s32 a1); +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80153C74(s16 a0, s16 a1); + + +void func_80189EE8(s32 a0) { + + extern u8 D_801BB954[]; + extern s32 aD801AF930 __asm__("D_801AF70C"); + extern s32 aD801AF938 __asm__("D_801AF714"); + s32 val; + + if (func_80153BD8(a0) == 0) { + ((void (*)(s32))func_80153BF0)(a0); + func_8012A828(a0, (s32)D_801BB954); + *(s16 *)(a0 + 0x2) = 0x13; + *(s16 *)(a0 + 0x34) = 3; + *(s16 *)(a0 + 0xFC) = 0; + *(s32 *)(a0 + 0x1C) = 0x1E; + } + + if ((*(s32 *)(a0 + 0x94) == 0xA) || (*(s32 *)(a0 + 0x94) == 0x1A)) { + if (func_8012DEB8(a0, (s32)&aD801AF930, (s32)&aD801AF938) == 1) { + func_8002D4C8(0xCB2, 0); + val = *(u16 *)(a0 + 0x70) - 2; + if ((u32)val < 2) { + func_80153C74(3, 0x18); + } else { + func_80153C74(1, 0x14); + } + } + } +} + + + +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); + +void func_80189FC0(void *a0) { + + extern u8 D_801BB954[]; + s16 val70; + u16 val72; + + if (*(s32 *)(a0 + 0x94) == 0x17) { + val70 = *(s16 *)(a0 + 0x70); + if (val70 == 0x2) { + func_8012C588(0x1A7, (s32)a0); + } else { + func_8002D4C8(0xCB3, 0); + func_8012C588(0x19F, (s32)a0); + } + } + + val72 = *(u16 *)(a0 + 0x72); + if ((val72 & 0x4000) != 0) { + func_8012A828((s32)a0, (s32)D_801BB954); + *(s16 *)(a0 + 0x2) = 0x3; + *(s16 *)(a0 + 0xFC) = 0; + *(s16 *)(a0 + 0xFE) = 0; + } +} + + + + +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); +extern void func_8012A828(s32 a0, s32 a1); +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80153C74(s16 a0, s16 a1); + + +void func_8018A054(s32 a0) { + + extern s32 aD801BC890 __asm__("D_801BC66C"); + extern s32 aD801AF930 __asm__("D_801AF70C"); + extern s32 aD801AF938 __asm__("D_801AF714"); + u16 val; + + if (func_80153BD8(a0) == 0) { + ((void (*)(s32))func_80153BF0)(a0); + func_8012A828(a0, (s32)&aD801BC890); + *(s16 *)(a0 + 0x34) = 7; + *(s16 *)(a0 + 0x2) = 0x13; + *(s32 *)(a0 + 0x1C) = 0x1E; + } + + if (*(s32 *)(a0 + 0x94) == 0x17) { + if (func_8012DEB8(a0, (s32)&aD801AF930, (s32)&aD801AF938) == 1) { + func_8002D4C8(0xCB2, 0); + val = *(u16 *)(a0 + 0x70); + if ((u16)(val - 2) < 2u) { + func_80153C74(3, 0x18); + } else { + func_80153C74(1, 0x14); + } + } + } +} + + + + +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, s32 a1); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8002D4C8(s32 a0, s32 a1); + + +void func_8018A120(s32 a0) { + + extern u8 D_801AF744[]; + extern u8 D_801AF71C[]; + extern u8 D_801AF724[]; + extern u8 D_801BB73C[]; + extern u16 D_80126B96; + extern s16 D_80126B98; + s32 result; + u16 val70; + u16 *q; + + if ((*(u16 *)(a0 + 0x72) & 0x4000) != 0) { + *(s16 *)(a0 + 0x2) = 0xC; + func_8012B1B4(a0, (s32)D_801AF744); + *(s16 *)(a0 + 0x16) = -0x8; + func_8012A828(a0, (s32)D_801BB73C); + *(s16 *)(a0 + 0x98) = 0x1; + } + + if (*(s32 *)(a0 + 0x94) == 0xF) { + result = func_8012D5E4(a0, (s32)D_801AF71C, (s32)D_801AF724, 0x14); + if (result == 1) { + func_8002D4C8(0xCB2, 0); + + val70 = *(u16 *)(a0 + 0x70); + if (((u32)val70 - 2) < 2) { + q = &D_80126B96; + D_80126B98 = 0x18; + *q = *q | 0x2000; + } + } + } +} + + + + +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8012CBCC(s32 a0); +extern void func_8012A828(s32 a0, s32 a1); + +void func_8018A1F8(s32 a0) { + + extern s32 aD_801BB960 __asm__("D_801BB73C"); + extern s32 aD_801AF698 __asm__("D_801AF474"); + u16 temp; + + if (*(s32 *)(a0 + 0x94) == 0xD) { + func_8002D4C8(0x702, 0x107F); + } + + func_8012CBCC(a0); + + temp = *(u16 *)(a0 + 0x102) + 1; + *(u16 *)(a0 + 0x102) = temp; + + if ((s16)temp == 0x1E) { + *(u16 *)(a0 + 0x2) = 0x9; + func_8012A828(a0, (s32)&aD_801BB960); + *(u16 *)(a0 + 0x102) = 0; + *(s32 *)(a0 + 0x14) = 0; + *(s32 *)(a0 + 0x58) = ((s32)&aD_801AF698 | 0x40000000) | 0x20000000; + } +} + + + + +extern void func_8012CBCC(s32 a0); + +void func_8018A294(s32 a0) { + s16 v = *(s16 *)(a0 + 0xFC); + + if (v != 0) { + *(s16 *)(a0 + 0xFC) = v - 1; + } else if (((s32 (*)(s32))func_8012CBCC)(a0) & 0x6000) { + *(s16 *)(a0 + 0x2) = 1; + } +} + + +void func_8018A2EC(void) { +} + + +void func_8018A2F4(s32 entity) { + extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); + extern void func_8012A828(s32 a0, s32 a1); + + extern u16 D_80126B96; + extern s16 D_80126B98; + extern s32 D_80127078; + extern u8 D_801AF70C[]; + extern u8 D_801AF714[]; + extern u8 D_801BC1FC[]; + extern u8 D_801BC97C[]; + + s32 result; + + result = func_8012DEB8(entity, (s32)&D_801AF70C, (s32)&D_801AF714); + + if (result == 1) { + D_80126B96 = 0x400F; + D_80126B98 = 0; + D_80127078 = entity; + *(u16 *)(entity + 0x2) = 0x10; + func_8012A828(entity, (s32)&D_801BC1FC); + } else { + func_8012A828(entity, (s32)&D_801BC97C); + *(u16 *)(entity + 0x2) = 3; + *(u16 *)(entity + 0xFC) = 0; + *(u16 *)(entity + 0xFE) = 1; + } +} + + + + +extern s32 func_80153BD8(s32 a0); +extern void func_8012A828(s32 a0, s32 a1); + +void func_8018A394(s32 a0) { + + extern u8 D_801BC97C[]; + s32 result; + + result = func_80153BD8(a0); + if (result == 0) { + func_8012A828(a0, (s32)&D_801BC97C); + *(s16 *)(a0 + 0x2) = 3; + *(s16 *)(a0 + 0xFC) = 0; + } else { + *(s16 *)(a0 + 0x2) = 4; + } +} + + + +void func_8018A3E8(s32 a0) { + extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); + extern void func_8012A828(s32 a0, s32 a1); + + extern u16 D_80126B96; + extern s16 D_80126B98; + extern s32 D_80127078; + extern u8 D_801AF70C[]; + extern u8 D_801AF714[]; + extern u8 D_801BC53C[]; + extern char D_801BCDEC[]; + + s32 result; + + result = func_8012DEB8(a0, (s32)&D_801AF70C, (s32)&D_801AF714); + + if (result == 1) { + D_80126B96 = 0x400F; + D_80126B98 = 0; + D_80127078 = a0; + *(u16 *)(a0 + 0x2) = 0x12; + func_8012A828(a0, (s32)&D_801BC53C); + } else { + func_8012A828(a0, (s32)&D_801BCDEC); + *(u16 *)(a0 + 0x2) = 0x6; + } +} + + + + +extern s32 func_80153BD8(s32); +extern void func_8012A828(s32, s32); + +void func_8018A47C(s32 a0) +{ + + extern s32 aD801BC890 __asm__("D_801BC66C"); + s32 v0; + + v0 = func_80153BD8(a0); + if (v0 != 0) { + v0 = 0x8; + } else { + func_8012A828(a0, (s32)&aD801BC890); + v0 = 0x6; + } + *(s16 *)(a0 + 0x2) = v0; +} + + + +extern s32 func_8012BEE8(s32 a0); + +void func_8018A4C4(int param_1) +{ + int iVar1; + + iVar1 = *(int *)(param_1 + 0x1c) - 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (*(int *)(param_1 + 0x1c) == 0) { + *(short *)(param_1 + 2) = *(unsigned short *)(param_1 + 0x34); + } +} + + + + +extern void func_8012A828(s32 a0, s32 a1); + +void func_8018A4EC(s32 a0) +{ + if (((*(u16 *)(a0 + 0x72) & 0x4000) != 0) || (*(s16 *)(a0 + 0x98) == 0)) { + *(s16 *)(a0 + 0x2) = *(u16 *)(a0 + 0x34); + func_8012A828(a0, *(s32 *)(a0 + 0xCC)); + } +} + + + +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, s32 a1); +extern void func_8012B23C(void *a0); +extern void func_8012B2CC(s32 a0); +extern void func_8012B14C(s32 a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); + + +void func_8018A538(s32 param_1) +{ + + extern u8 D_801AF7A4[]; + extern u8 D_801AF7BC[]; + extern u8 D_801AF7D4[]; + s32 v0; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + func_8001CA1C(v0, (s32)D_801AF7A4); + func_8012A828(param_1, (s32)D_801AF7BC); + *(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(*(s32 *)(param_1 + 0x64) + 0x20) + 0x12); + func_8012B23C((void *)param_1); + func_8012B2CC(param_1); + func_8012B14C(param_1, (s32)D_801AF7D4); + *(s16 *)(param_1 + 2) = 1; + *(s16 *)(param_1 + 0xA) = *(u16 *)(param_1 + 0xA) - 0x90; + *(s16 *)(param_1 + 6) = + *(u16 *)(param_1 + 6) - + (func_8004787C(*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12)) >> 8); + *(s16 *)(param_1 + 0xE) = + *(u16 *)(param_1 + 0xE) - + (func_80047948(*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12)) >> 8); + } +} + + + +extern void func_8012CBCC(s32 a0); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8018A624(s32 a0) +{ + s32 v1; + + if ((((s32 (*)(s32))func_8012CBCC)(a0) & 0x2000) != 0) { + *(s16*)(a0 + 0x2) = 2; + *(s32*)(a0 + 0x1C) = 0x3C; + *(s16*)(a0 + 0x98) = 1; + + v1 = *(s32*)(a0 + 0x20); + *(u16*)(v1 + 0x2C) |= 0x10; + + *(s32*)(*(s32*)(a0 + 0x20) + 0x4) |= 0x8000000; + + *(s16*)(*(s32*)(a0 + 0x20) + 0x12) = 0; + func_8002D4C8(0xCB4, 0); + } +} + + + +/* Decls conformed VERBATIM to the TU's own file-scope decl block + * (src/ov_SC02_026/ov_SC02_026_jr_8017C180.c:5052-5060, the block that feeds the + * banked sibling func_801850E4). Two of them disagreed with this draft: + * func_8012C1B8 -> TU says `void` return, draft wanted s32 (the reported conflict) + * func_8012B23C -> TU says `void *` param, draft wanted s32 (hidden behind it) + * Both disagreements are pushed to casts at the USE site (§37 lever A) — zero bytes + * change; the same cast idiom is already used by func_801850E4 above. */ +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, s32 a1); +extern s32 rand(void); +extern void func_8012B23C(void *a0); +extern void func_8012B2CC(s32 a0); +extern void func_8012B14C(s32 a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); + +void func_8018A6A8(s32 a0) +{ + + extern s32 D_801AF7EC; + extern s32 D_801AF8AC; + extern s32 D_801AF934; + s32 v0; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(a0 + 0x20) = v0; + + if (v0 == 0) { + func_8012CAE4((void *)a0); + } else { + func_8001CA1C(v0, (s32)&D_801AF7EC); + func_8012A828(a0, (s32)&D_801AF8AC); + v0 = rand(); + *(u32 *)(a0 + 0x94) = v0 & 0xF; + + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(*(s32 *)(a0 + 0x64) + 0x20) + 0x12); + + func_8012B23C((void *)a0); + func_8012B2CC(a0); + func_8012B14C(a0, (s32)&D_801AF934); + + *(u16 *)(a0 + 0x2) = 1; + + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x2C) |= 0x10; + + *(s16 *)(a0 + 0xA) -= 0x90; + + v0 = func_8004787C(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12)); + *(s16 *)(a0 + 0x6) -= (s16)(v0 >> 8); + + v0 = func_80047948(*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12)); + *(s16 *)(a0 + 0xE) -= (s16)(v0 >> 8); + } +} + + +extern void func_8012CBCC(s32 a0); + void func_8018A7B4(s32 arg0) { + if ((((s32 (*)(void))func_8012CBCC)() & 0x2000) != 0) { + *(s16*)(arg0 + 0x2) = 0x2; + } + } + + +extern void func_8012C218(void *a0); + + +void func_8018A7EC(void *a0) { + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18) = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x18) + 0x200; + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) + -0x200; + if (*(s16 *)(*(s32 *)(a0 + 0x20) + 0x1a) < 0x401) { + func_8012C218(a0); + } +} + + + +extern void (*D_801CC9AC[])(void); + +void func_8018A858(void *a0) { + D_801CC9AC[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018A894); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018A90C); + + + +extern s32 func_8012E778(int param_1, int param_2); +extern s32 func_8012C51C(int a0, int a1); + +void func_8018A9BC(int param_1, int param_2) +{ + + extern u16 D_800AF7BC; + extern u16 D_800AF7BE; + extern u8 D_801D34C8[]; + s32 i; + + i = 0; + if (func_8012E778(param_1, ((s32)(D_800AF7BE >> 1) << 16) | (D_800AF7BC >> 1)) != 0) { + do { + if (D_801D34C8[i] == 0) { + D_801D34C8[i] = 1; + *(s32 *)(param_2 + 0x10) = i | 0x80000000; + *(u16 *)(param_2 + 8) = *(u16 *)(param_1 + 0x70); + func_8012C51C(param_2, param_1); + return; + } + i++; + } while (i < 5); + } +} + + + +extern s32 func_8012C194(void); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_8018AE00(s32 a0); + +void func_8018AA74(void *a0) +{ + + extern u32 D_801D3388; + s32 iVar2; + u32 *puVar3; + + *(s16 *)((s32)a0 + 0xFC) = 0x7000; + *(s16 *)((s32)a0 + 0x100) = 0; + *(s16 *)((s32)a0 + 0xFE) = 0; + *(s16 *)((s32)a0 + 0x104) = 0; + *(s16 *)((s32)a0 + 0x106) = 0; + puVar3 = (u32 *)((u8 *)&D_801D3388 + (*(s16 *)((s32)a0 + 0xDC) * 0x40)); + iVar2 = func_8012C194(); + *(s32 *)((s32)a0 + 0x20) = iVar2; + if (iVar2 != 0) { + func_8001CD50(iVar2, (s32)puVar3); + *(s16 *)(iVar2 + 0x10) = 0x400; + *(u32 *)(iVar2 + 4) = *(u32 *)(iVar2 + 4) | 0x60000000; + func_800233CC(puVar3, 0x40); + puVar3[0] = 0x808080; + puVar3[1] = 0x808080; + func_8018AE00((s32)a0); + *(s16 *)((s32)a0 + 2) = 3; + } +} + + + +/* func_8018AB34 — per-frame entity tick: decay the sound-handle envelope at + * +0x20, ramp the s16 pair at +0xFE/+0x106 up to a 0x6000 ceiling, then ramp + * the pair at +0xFC/+0x104 down; when the +0xFC accumulator goes negative the + * entity releases its D_801D34C8 slot and hands off to func_8012C218, + * otherwise it continues in func_8018AC00. + * + * §71 sibling-first: func_8018A090 (same TU, 0xC0 bytes earlier) is the + * initialiser for exactly these fields (+0xFC/+0xFE/+0x100/+0x104/+0x106, the + * +0x20 handle and the +0xDC slot index) and pins the widths/casts used here. + * D_801D34C8[] is the 5-entry slot table func_80189FD8 (same TU) claims from. + * + * Levers (all three were needed; each is byte-verified by removal): + * 1. §3-T4 branch polarity — the 0x6000 guard is written `>= 0x6000` with the + * CLAMP as the then-arm, which is what puts `slti/bnez` + the `j` over the + * ramp arm in the target order. Writing it `< 0x6000` gives `beqz` and the + * arms swapped. + * 2. Zero-byte `__asm__ __volatile__("" : : : "memory")` at the head of the + * ramp arm (§34 toolkit). Without it cse.c relates the guard's + * `lh 0xFE` to the ramp's `lhu 0xFE` — same MEM, sign- vs zero-extend — + * and rewrites the second as `move`+`andi 0xffff`. That also lands both + * arms' final store in $v0, which lets the post-reload jump pass CROSS-JUMP + * the two `sh 0xFE` tails (§5a) and eats the `j .L8018A1C4`. The clobber + * invalidates the MEM in the hash table so the real second load survives, + * the arms end in different registers, and the cross-jump cannot fire. + * 3. The +0x104 store is SUNK to immediately after the subtract, before the + * +0xFC accumulate. Both tail quantities are otherwise born in the same + * block, and local-alloc's QTY_CMP_PRI (n_refs*log2(n_refs)/live_length) + * then ranks the accumulator ABOVE the delta, handing it $v0 and swapping + * the whole block's register pair. Storing the delta early kills its live + * range at insn 3, which flips the priority back so the delta takes $v0. + * Purely a scheduling/priority dial — the emitted order is unchanged + * because reorg pulls `sh 0x104` back into the `bgez` delay slot. + * Also note the two tail blocks are BLOCK-SCOPED: sharing one function-scope + * pair across the 0xFE and 0xFC ramps makes them global allocnos (§76), which + * costs $a1 for the deltas and an extra 8 bytes of frame (0x20 vs 0x18). + */ + +extern void func_8012C218(void *a0); +extern void func_8018AC00(void *a0); + +void func_8018AB34(void *a0) +{ + + extern u8 D_801D34C8[]; + s32 p; + s32 v; + + p = *(s32 *)((s32)a0 + 0x20); + if (p != 0) { + v = *(u16 *)(p + 0x1A) - 0x100; + *(s16 *)(p + 0x1A) = v; + *(s16 *)(p + 0x18) = v; + if (*(s16 *)(p + 0x1A) < 0) { + *(s16 *)(p + 0x1A) = 0; + *(s16 *)(p + 0x18) = 0; + } + } + if (*(s16 *)((s32)a0 + 0xFE) >= 0x6000) { + *(s16 *)((s32)a0 + 0xFE) = 0x6000; + } else { + s32 dv, sv; + __asm__ __volatile__("" : : : "memory"); + dv = *(u16 *)((s32)a0 + 0x106) + 0x400; + sv = *(u16 *)((s32)a0 + 0xFE) + dv; + *(s16 *)((s32)a0 + 0x106) = dv; + *(s16 *)((s32)a0 + 0xFE) = sv; + } + { + s32 d = *(u16 *)((s32)a0 + 0x104) - 0x80; + s16 s; + + *(s16 *)((s32)a0 + 0x104) = d; + s = *(u16 *)((s32)a0 + 0xFC) + d; + *(s16 *)((s32)a0 + 0xFC) = s; + if (s < 0) { + D_801D34C8[*(s16 *)((s32)a0 + 0xDC)] = 0; + func_8012C218(a0); + } else { + func_8018AC00(a0); + } + } +} + + + + +void func_8018AC00(void *a0) { + typedef struct { u8 b[8]; } Blk8_8018AC00; + extern s32 func_80017DC4(void *a0, void *a1); + extern s16 func_8012A758(void); + extern void RotMatrixY(s32 a0, void *a1); + extern void func_80015978(s32 a0, s32 *a1); + extern void func_80017E68(void *a0, void *a1); + extern s32 func_80017758(void *a0, void *a1); + extern Blk8_8018AC00 D_801CC9D0, D_801CC9D8, D_801CC9E0, D_801CC9E8; + extern Blk8_8018AC00 D_801CC9F0, D_801CC9F8, D_801CCA00, D_801CCA08; + + u8 buf[0x60]; + u8 *p; + u8 *q; + u8 *vp; + s16 ang; + + *(s32 *)(buf + 0x30) = 0x50000000; + *(s32 *)(buf + 0x20) = 0x80; + *(s32 *)(buf + 0x24) = 0x80; + *(s32 *)(buf + 0x28) = 0; + *(s32 *)(buf + 0x2c) = 0; + + *(Blk8_8018AC00 *)(buf + 0x00) = D_801CC9D0; + *(Blk8_8018AC00 *)(buf + 0x08) = D_801CC9D8; + *(Blk8_8018AC00 *)(buf + 0x10) = D_801CC9E0; + *(Blk8_8018AC00 *)(buf + 0x18) = D_801CC9E8; + + p = buf + 0x38; + func_80017DC4((u8 *)a0 + 0xfc, p); + ang = func_8012A758(); + RotMatrixY(ang, p); + + q = buf + 0x58; + func_80015978((s32)((u8 *)a0 + 4), (s32 *)q); + func_80017E68(q, p); + + vp = buf + 0x00; + func_80017758(vp, p); + + *(s32 *)(buf + 0x30) = 0x60000000; + *(s32 *)(buf + 0x20) = 0x808080; + *(s32 *)(buf + 0x24) = 0x808080; + + *(Blk8_8018AC00 *)(buf + 0x00) = D_801CC9F0; + *(Blk8_8018AC00 *)(buf + 0x08) = D_801CC9F8; + *(Blk8_8018AC00 *)(buf + 0x10) = D_801CCA00; + *(Blk8_8018AC00 *)(buf + 0x18) = D_801CCA08; + + func_80017758(vp, p); +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018AE00); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018AE88); + + +extern void (*D_801D03D8[])(void); + +void func_8018AF0C(void *a0) { + D_801D03D8[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018AF48); + +typedef struct { s32 w[4]; } Blk16_8018B13C; + +extern s32 func_8004787C(s32 a0); +extern void func_80028620(s32, void *); +extern Blk16_8018B13C D_800A5EA8; +extern Blk16_8018B13C D_801D0320; +extern s32 D_800A5EB0; + +void func_8018B13C(s32 a0) { + Blk16_8018B13C *s1 = &D_800A5EA8; + + *s1 = D_801D0320; + D_800A5EB0 = func_8004787C(*(s16 *)(a0 + 0xFE)) * 10 / 4096 - 5; + *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; + func_80028620(2, s1); +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801884D8", func_8018B1EC); + +typedef struct { s32 w[4]; } Blk16_8018B29C; + +extern s32 func_8004787C(s32 a0); +extern void func_80028620(s32, void *); +extern Blk16_8018B29C D_800A5E88; +extern Blk16_8018B29C D_801D0370; +extern s32 D_800A5E90; + +void func_8018B29C(s32 a0) { + Blk16_8018B29C *s1 = &D_800A5E88; + + *s1 = D_801D0370; + D_800A5E90 = func_8004787C(*(s16 *)(a0 + 0xFE)) * 20 / 4096 - 10; + *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; + func_80028620(0, s1); +} + + +void func_8018B34C(void) { +} + + + +extern s32 func_8004787C(s32 a0); +extern void func_80028620(s32, void *); +extern Blk16_8018B29C D_800A5E88; +extern Blk16_8018B29C D_801D03A8; +extern s32 D_800A5E90; + +void func_8018B354(s32 a0) { + Blk16_8018B29C *s1 = &D_800A5E88; + + *s1 = D_801D03A8; + D_800A5E90 = func_8004787C(*(s16 *)(a0 + 0xFE)) / 512 + 8; + *(s16 *)(a0 + 0xFE) = (*(u16 *)(a0 + 0xFE) + 0x71) & 0xFFF; + func_80028620(0, s1); +} + + + + + + diff --git a/src/ov_SC06_020/ov_SC06_020_jr_8017C24C.c b/src/ov_SC06_020/ov_SC06_020_jr_8017C24C.c index 8a9e380e9d..72c1d13011 100644 --- a/src/ov_SC06_020/ov_SC06_020_jr_8017C24C.c +++ b/src/ov_SC06_020/ov_SC06_020_jr_8017C24C.c @@ -4222,1609 +4222,3 @@ INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80180A0 INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80180A4C); INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80180A98); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80180B04); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80180EF0); - -extern void func_80183FD0(s32 arg0, s32 arg1); - void func_80181044(void *arg0) { - func_80183FD0((s32)arg0, 0x9B7); - } - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181064); - - -extern void func_801811A8(void); -extern void func_80181654(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); - -void func_801810E8(s32 param_1) { - - extern s32 D_801B69A0; - u16 uVar1; - s32 iVar2; - - *(s16 *)(param_1 + 0x34) = 0; - if ((*(u32 *)(param_1 + 0xe0) & 8) == 0) { - func_801811A8(); - } else { - if ((*(u32 *)(param_1 + 0xe0) & 0x20) != 0) { - func_80181654(param_1, -0x8000); - } - *(s16 *)(param_1 + 2) = 0x22; - func_8012A828(param_1, &D_801B69A0); - } - iVar2 = *(s32 *)(param_1 + 0x20); - *(s16 *)(iVar2 + 0x14) = 0; - *(s16 *)(iVar2 + 0x10) = 0; - uVar1 = *(u16 *)(*(s32 *)(param_1 + 0x78) + 2); - *(u32 *)(param_1 + 0xe0) = (*(u32 *)(param_1 + 0xe0) & 0xffffffd5) | 0x400; - *(s16 *)(param_1 + 0x5e) = 0; - *(u16 *)(param_1 + 0xae) = *(u16 *)(param_1 + 0xae) & 0xfffe; - *(u32 *)(param_1 + 0xc4) = *(u32 *)(param_1 + 0xc4) & 0xfffffffb; - *(s16 *)(param_1 + 0x5c) = uVar1; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801811A8); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801812A0); - - - -extern s32 func_8012BCCC(s32 a0); -extern s32 func_8018353C(s32 a0, s32 a1); -extern void func_8012F214(s32, s32, s32); -extern s32 func_801833F4(void *a0, s32 a1, s32 a2); - -/* Two load-bearing constructs (do NOT "clean up"): - * 1. `goto ret0` / `goto store` with `ret0:` placed BEFORE the store block — cookbook L1344 - * shared-ret0 goto. A trailing `return 0` makes gcc sink the merged ret0 tail past the - * store block (7 mismatches: BRANCH-POLARITY + swapped tail). - * 2. `register s32 r __asm__("$2")` on the func_8018353C result + `return r`. Plain - * `return 0;` there emits `set v0,0; j epi`, which cross_jump (§5a) merges into the - * ret0 block, so the branch lands on ret0 instead of the epilogue. Pinning r to $v0 - * makes `return r` a self-copy that dies before jump2, leaving a bare `j epi` that - * jump.c collapses into `beqz $v0, .L8018730C`. (A plain `s32 r` does NOT work — cse2 - * const-folds `r` to 0 on the fall-through edge and the merge comes back.) */ -s32 func_801813C0(s32 p) { - - extern s32 D_80126B9C; - extern u8 D_8019E994[]; - s32 buf10[2]; - register s32 r __asm__("$2"); /* $v0 — see note 2 above */ - - if ((*(u32 *)(p + 0xE0) & 1) == 0) { - goto ret0; - } - if (*(u16 *)(p + 2) == 1) { - goto ret0; - } - if (*(u16 *)(p + 2) == 0xD) { - return 0; - } - if ((D_80126B9C & 2) == 0) { - return 0; - } - if (0x10000 < func_8012BCCC(p)) { - return 0; - } - r = func_8018353C(p, 0x380); - if (r == 0) { - return r; - } - ((void (*)(s32, void *, void *))func_8012F214)(p, D_8019E994, buf10); - if (func_801833F4(buf10, *(s16 *)(*(s32 *)(p + 0x20) + 0x12), 0x380) != 0) { - goto store; - } -ret0: - return 0; -store: - *(u16 *)(p + 2) = 0xC; - return 1; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181490); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181654); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801817CC); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_8018182C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181954); - - -/* func_801819B4 — line-of-sight / collision probe. - * - * Rotate the direction SVECTOR D_8019EBE4[dir] through the entity's matrix - * (*(0x20) + 0x34) into a scratch SVECTOR at sp+0x10, build the segment - * start (sp+0x18) = entity pos and end (sp+0x20) = entity pos + rotated - * vector, then hand the pair to func_8012CEB0 / func_800132BC. - * - * §71 sibling-first: DEFINE_func_80169408 / DEFINE_func_8016986C in - * src/shared/engine_core.h are the house shape for this ApplyMatrixSV + - * SVECTOR-local family — `s16 vNN[4]` locals declared in ASCENDING stack - * offset order (sp+0x10, sp+0x18, sp+0x20) and the entity position read as - * `*(u16 *)(s1 + 0x6 / 0xA / 0xE)` (which is what makes the loads `lhu`). - * - * The target stores each of sp+0x20/0x22/0x24 TWICE — a plain copy first, - * then the copy plus the rotated component — so the source assigns the - * position, then `+=` the delta as separate statements (the local's address - * is taken, so gcc-2.7.2 cannot kill the first store). - */ - -extern void ApplyMatrixSV(void *a0, void *a1, void *a2); -extern s32 func_8012CEB0(void *a0, void *a1, s32 a2); -extern s32 func_800132BC(void *a0, void *a1); - -s32 func_801819B4(s32 a0, s32 a1) { - - extern s16 D_8019EBE4[][4]; - extern s32 D_801BA730; - s32 s0 = a0; - s16 v10[4]; /* sp+0x10 SVECTOR — ApplyMatrixSV out */ - s16 v18[4]; /* sp+0x18 SVECTOR — segment start */ - s16 v20[4]; /* sp+0x20 SVECTOR — segment end */ - s32 r; - - ApplyMatrixSV((void *)(*(s32 *)(s0 + 0x20) + 0x34), D_8019EBE4[a1], v10); - v18[0] = *(u16 *)(s0 + 0x6); - v18[1] = *(u16 *)(s0 + 0xA); - v18[2] = *(u16 *)(s0 + 0xE); - v20[0] = *(u16 *)(s0 + 0x6); - v20[1] = *(u16 *)(s0 + 0xA); - v20[2] = *(u16 *)(s0 + 0xE); - v20[0] = v20[0] + v10[0]; - v20[1] = v20[1] + v10[1]; - v20[2] = v20[2] + v10[2]; - r = func_8012CEB0(v18, v20, 0); - D_801BA730 = func_800132BC(v18, v20); - return r != 0x2000; -} - - - -extern void (*D_8019EC24[])(void); - -void func_80181A94(void *a0) { - D_8019EC24[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181AD0); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80181C5C); - - -extern void func_8012C218(void *a0); -extern void func_8012E8A8(u8 *a0); - -/* §48-C2: lwl/lwr/swl/swr block copy == a plain struct assign of a 2-byte-aligned struct */ -typedef struct { u16 a, b, c, d, e, f; } UAlign12_80181F40; -typedef struct { u16 a, b, c, d; } UAlign8_80181F40; - -void func_80181F40(s32 param_1) -{ - s32 t1 = *(s32 *)(param_1 + 0x64); - s32 pad[2]; - - if (*(s16 *)(t1 + 0x36) != *(s16 *)(param_1 + 0x10A)) { - func_8012C218((void *)param_1); - return; - } - { - if ((*(u32 *)(t1 + 0xE0) & 4) != 0) { - func_8012E8A8((u8 *)param_1); - return; - } - { - s32 a2 = *(s32 *)(*(s32 *)(t1 + 0x20) + 0x20); - s32 a3 = param_1 + 0xFC; - - if (a2 != 0) { - if ((a2 & 0x1000000) != 0) { - s32 a1 = a2 & 0xFEFFFFFF; - register u32 v0 __asm__("$2"); - u32 a0; - u32 v1a; - u32 v1b; - u32 v0b; - u32 v1; - - *(u16 *)(param_1 + 0x102) = *(u16 *)(a1 + 0x66); - - v0 = *(u32 *)(a1 + 0x60); - a0 = *(u8 *)(a1 + 0x61); - v1a = (v0 & 0xF) << 8; - a0 = a0 | v1a; - v1b = ((s32)v0 >> 16) & 0xFF; - v0b = (v0 & 0xF0) << 4; - v1 = v1b | v0b; - *(u16 *)(param_1 + 0x104) = (u16)a0; - *(u16 *)(param_1 + 0x106) = (u16)v1; - - *(s16 *)(param_1 + 0xFC) = (s8)*(u8 *)(a1 + 0x63); - *(s16 *)(param_1 + 0xFE) = (s8)*(u8 *)(a1 + 0x64); - *(s16 *)(param_1 + 0x100) = (s8)*(u8 *)(a1 + 0x65); - } else { - *(UAlign12_80181F40 *)(param_1 + 0xFC) = *(UAlign12_80181F40 *)(a2 + 0x90); - } - *(s32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = a3; - } - - if ((*(u32 *)(t1 + 0xE0) & 0x80) != 0) { - if (*(u16 *)(param_1 + 0x34) == 0) { - s16 sVar2 = *(u16 *)(param_1 + 0x108) + 0x40; - *(s16 *)(param_1 + 0x108) = sVar2; - if (sVar2 > 0x200) { - *(u16 *)(param_1 + 0x108) = 0x200; - *(s16 *)(param_1 + 0x34) = *(s16 *)(param_1 + 0x34) + 1; - } - } else { - u16 uVar3 = *(u16 *)(param_1 + 0x108) - 0x80; - *(u16 *)(param_1 + 0x108) = uVar3; - if ((s16)uVar3 < 0) { - *(u16 *)(param_1 + 0x108) = 0; - *(u16 *)(param_1 + 0x34) = 0; - *(u32 *)(t1 + 0xE0) = *(u32 *)(t1 + 0xE0) & ~0x80; - } - } - } - - *(u16 *)(a3 + 6) = *(u16 *)(a3 + 6) + *(u16 *)(param_1 + 0x108); - - *(u32 *)(param_1 + 4) = *(u32 *)(t1 + 4); - *(u32 *)(param_1 + 8) = *(u32 *)(t1 + 8); - *(u32 *)(param_1 + 0xC) = *(u32 *)(t1 + 0xC); - - *(UAlign8_80181F40 *)(param_1 + 0x50) = *(UAlign8_80181F40 *)(t1 + 0x50); - - { - s32 dst = *(s32 *)(param_1 + 0x20); - s32 src = *(s32 *)(t1 + 0x20); - *(UAlign8_80181F40 *)(dst + 0x10) = *(UAlign8_80181F40 *)(src + 0x10); - } - { - s32 dst = *(s32 *)(param_1 + 0x20); - s32 src = *(s32 *)(t1 + 0x20); - *(UAlign8_80181F40 *)(dst + 0x18) = *(UAlign8_80181F40 *)(src + 0x18); - } - { - s32 src = *(s32 *)(t1 + 0x20); - s32 dst = *(s32 *)(param_1 + 0x20); - *(u32 *)(dst + 4) = *(u32 *)(src + 4); - } - { - s32 src = *(s32 *)(t1 + 0x20); - s32 dst = *(s32 *)(param_1 + 0x20); - *(u16 *)(dst + 0x2C) = *(u16 *)(src + 0x2C); - } - } - } -} - - - -extern void (*D_8019ED7C[])(void); - -void func_801821F8(void *a0) { - D_8019ED7C[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182234); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801823A4); - - -extern void func_8012C218(void *a0); -extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_80183170(s32 a0, s32 a1); -extern s32 func_8012B8E4(s32 a0, s32 a1); -extern s32 func_8012BEE8(s32 a0); -extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); -extern s32 func_8012CBF4(s32 a0); -extern void func_8012B178(s32 a0, s32 a1); -extern u8 *func_8012913C(s32 a0); -extern void func_8012F214(s32 a0, s32 a1, s32 a2); - - -void func_8018240C(s32 param_1) { - - extern u8 D_8019ECF4; - extern u8 D_8019EDA8[]; - extern u16 D_80126CB4; - extern u16 D_80126CB6; - extern u16 D_80126CB8; - u16 uVar1; - - if (0xf < *(s16 *)(param_1 + 0xA)) { - func_8012C218((void *)param_1); - return; - } - - { - s32 base = (s32)&D_8019ECF4; - s32 r = func_8012D5E4(param_1, base, base + 8, 0x78); - if (r == 1 || (*(u16 *)(param_1 + 0x5C) & 1) != 0) { - func_80183170(param_1, 1); - func_8012C218((void *)param_1); - return; - } - } - - uVar1 = *(u16 *)(param_1 + 0x34); - switch (uVar1) { - default: - return; - case 0: - { - s32 sVar3 = func_8012B608((s32)*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x10), 0, 0x18); - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + sVar3; - } - { - s32 r = func_8012CBF4(param_1); - if (r != 0) { - goto LAB_8018847c; - } - } - { - s32 r = func_8012BEE8(param_1); - if (r == 0) return; - } - *(u16 *)(param_1 + 0xF4) = D_80126CB4; - *(u16 *)(param_1 + 0xF6) = D_80126CB6; - { - u16 tmp = D_80126CB8; - *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; - *(s32 *)(param_1 + 0x1C) = 0x3C; - *(u16 *)(param_1 + 0xF8) = tmp; - } - return; - case 1: - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) += func_8012B8E4(param_1, 0x20); - { - s32 r = func_8012BEE8(param_1); - if (r != 0) { - *(s32 *)(param_1 + 0x1C) = 0x5A; - *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; - } - } - break; - case 2: - break; - } - - *(u16 *)(param_1 + 0xF2) = *(u16 *)(param_1 + 0xF2) - 0x100; - func_8012B178(param_1, 0xFFEC0000); - { - s32 r = func_8012CBF4(param_1); - if (r != 0) goto LAB_8018847c; - } - if (*(u16 *)(param_1 + 0x34) != 2) goto LAB_80188494; - { - s32 r = func_8012BEE8(param_1); - if (r != 1) goto LAB_80188494; - } -LAB_8018847c: - *(u16 *)(param_1 + 2) = 9; - func_80183170(param_1, 1); - return; -LAB_80188494: - { - s32 iv = (s32)func_8012913C(0x80); - if (iv == 0) return; - { - u16 out[4]; - ((void (*)(s32, void *, void *))func_8012F214)(param_1, D_8019EDA8, out); - *(u16 *)(iv + 6) = out[0]; - *(u16 *)(iv + 0xA) = out[1]; - *(u16 *)(iv + 0xE) = out[2]; - } - return; - } -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182664); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801826C4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801827FC); - - -// @class: struct -// @stuck: none — MATCH (276 ins, relocation-masked). Verified BOTH standalone (match_one) and -// spliced into src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c (whole-TU cc1 -O2 clean, -// masked structured_diff 0/276). -// Keys: (1) the first func_8012C218 call gets a NOP delay slot because reload_cse_regs deletes the -// redundant `move a0,s1` -- $a0 still holds the incoming param on the fall-through path -// (no CODE_LABEL between the prologue and the jal). The second call site is behind a -// label, so the move survives. Source is the natural `func_8012C218((void *)param_1)` at -// BOTH sites -- do NOT write a zero-arg call (it also breaks in-TU: the composite type -// from the earlier file-scope `extern void func_8012C218(void *a0);` rejects 0 args). -// (2) case 0's guard is an `||` with an early return -- that is what puts `beqz -> fail` then -// `beq -> ok` (an `&&` would emit `bne -> fail`). -// (3) `register s32 sVar2 __asm__("$2")` holds the p+0x34 reload in cases 1/2 so the two arms -// cross-jump into the shared .L80188928 tail. -// (4) `__asm__ __volatile__("")` after the func_8012C658 arm forces the `lw v1,0x1C(s1)` -// reload before the cross-jumped `li v0,9` (§21 zero-byte re-tie). -// (5) `-((iVar3 << 0x10) / 0x22)` reproduces the 0x78787879/sra-4 magic-divide by 34 + negu. -// (6) `*p * 0xc` then `>>4` with the manual `if (x<0) x+=0xf` is the /16 rounding form. - -extern void func_8012C218(void *a0); -extern void func_801834F0(s32, void*, void*, s32); -extern s32 func_80013328(s32 a0, s32 a1); -extern void func_8012B14C(s32 a0, s32 a1); -extern void func_8012CC64(s32 a0, s32 a1); /* fleet-canonical: void; $v0 used -> cast at use */ -extern s32 func_8012C658(s32, s32, s32); -extern s32 func_80143B6C(s32 a0, s32 a1); /* fleet-canonical */ -extern s32 func_8012BEE8(s32 a0); -extern void func_80016714(void*, s32); -extern void func_80183170(s32 a0, s32 a1); - - -void func_80182820(s32 param_1) { - - extern u8 D_801B6AA8; - extern u8 D_8019ED1C; - extern u8 D_8019ED24; - extern u8 D_8019ED14; - extern u8 D_80126B5C; - u16 uVar1; - register s32 sVar2 __asm__("$2"); - s32 iVar3; - s32 iVar4; - s32 iVar5; - u32 uVar4; - s32 psVar5; - u16 buf[8]; - s32 vec[3]; - - if (0xf < *(s16 *)(param_1 + 0xA)) { - func_8012C218((void *)param_1); - return; - } - uVar1 = *(u16 *)(param_1 + 0x34); - switch (uVar1) { - case 0: - psVar5 = *(s32 *)(param_1 + 0x64); - if ((*(u16 *)psVar5 == 0) || - (*(s32 *)(psVar5 + 0x90) != (s32)&D_801B6AA8)) { - func_8012C218((void *)param_1); - return; - } - if (*(s32 *)(psVar5 + 0x94) < 0x11) { - ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED1C, buf, 5); - *(s16 *)(param_1 + 6) = buf[0]; - *(s16 *)(param_1 + 0xA) = buf[1]; - *(s16 *)(param_1 + 0xE) = buf[2]; - return; - } - ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED24, buf, 4); - ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED24, &buf[4], 5); - *(s16 *)(param_1 + 6) = - (s16)((*(s16 *)&buf[0] + *(s16 *)&buf[4]) >> 1); - *(s16 *)(param_1 + 0xA) = - (s16)((*(s16 *)&buf[1] + *(s16 *)&buf[5]) >> 1); - *(s16 *)(param_1 + 0xE) = - (s16)((*(s16 *)&buf[2] + *(s16 *)&buf[6]) >> 1); - if (*(s32 *)(psVar5 + 0x94) != 0x19) { - return; - } - *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; - vec[0] = 0; - vec[1] = 0xfff40000; - iVar3 = func_80013328((s32)&D_80126B5C, param_1 + 4); - vec[2] = -((iVar3 << 0x10) / 0x22); - func_8012B14C(param_1, (s32)vec); - *(s32 *)(param_1 + 0x48) = 0xc000; - return; - case 1: - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + 0x80; - iVar3 = ((s32 (*)(s32, s32))func_8012CC64)(param_1, (s32)&D_8019ED14); - if (iVar3 == 0) { - return; - } - sVar2 = *(u16 *)(param_1 + 0x34); - *(s32 *)(param_1 + 0x1c) = 0; - *(u16 *)(param_1 + 0x34) = sVar2 + 1; - return; - case 2: - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + 0x40; - uVar4 = ((s32 (*)(s32, s32))func_8012CC64)(param_1, (s32)&D_8019ED14); - if ((uVar4 & 0x2000) == 0) { - return; - } - iVar4 = *(s32 *)(param_1 + 0x1c) + 1; - *(s32 *)(param_1 + 0x1c) = iVar4; - if (iVar4 >= 4) { - sVar2 = *(u16 *)(param_1 + 0x34); - *(s32 *)(param_1 + 0x1c) = 0x1e; - *(u16 *)(param_1 + 0x34) = sVar2 + 1; - return; - } - iVar3 = *(s32 *)(param_1 + 0x10) * 0xc; - if (iVar3 < 0) { - iVar3 = iVar3 + 0xf; - } - *(s32 *)(param_1 + 0x10) = iVar3 >> 4; - iVar5 = *(s32 *)(param_1 + 0x18) * 0xc; - if (iVar5 < 0) { - iVar5 = iVar5 + 0xf; - } - *(s32 *)(param_1 + 0x18) = iVar5 >> 4; - *(s32 *)(param_1 + 0x14) = -(0x80000 / *(s32 *)(param_1 + 0x1c)); - func_80143B6C(param_1, 1); - return; - case 3: - uVar4 = *(u32 *)(param_1 + 0x1c); - if ((uVar4 - 0xe < 0xb) && ((uVar4 & 1) == 0)) { - ((void (*)(s32, s32, s32))func_8012C658)(0x2a8, (s32)*(s16 *)(param_1 + 0x104), param_1); - *(u16 *)(param_1 + 0x104) = *(u16 *)(param_1 + 0x104) + 1; - __asm__ __volatile__(""); - uVar4 = *(u32 *)(param_1 + 0x1c); - } - if (uVar4 == 9) { - *(u32 *)(*(s32 *)(param_1 + 0xcc) + 4) = - *(u32 *)(*(s32 *)(param_1 + 0xcc) + 4) & 0x7fffffff; - *(s16 *)(*(s32 *)(param_1 + 0xcc) + 8) = *(u16 *)(param_1 + 6); - *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0xa) = - *(u16 *)(param_1 + 0xa) - 0x24; - *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0xc) = *(u16 *)(param_1 + 0xe); - } - if (*(s32 *)(param_1 + 0x1c) - 4U < 6) { - *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0x18) = - *(u16 *)(*(s32 *)(param_1 + 0xcc) + 0x18) + 0x200; - *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0x1a) = - *(u16 *)(*(s32 *)(param_1 + 0xcc) + 0x1a) + 0x200; - } - iVar3 = func_8012BEE8(param_1); - if (iVar3 != 1) { - return; - } - ((void (*)(s32, s32))func_80016714)(*(s32 *)(param_1 + 0xcc), 0x38); - *(s16 *)(param_1 + 2) = 9; - func_80183170(param_1, 0); - return; - } - return; -} - - - -extern void func_80049CAC(s32, s32); -extern void func_800484EC(s32, s32, s32); -extern void func_8012B260(u8 *a0); - -void func_80182C70(s32 p) { - s32 g10[4]; /* sp+0x10 */ - u16 g20[4]; /* sp+0x20 */ - s32 buf28[8]; /* sp+0x28 */ - u16 v; - - g10[2] = 0xFFF00000; - g10[1] = 0; - g10[0] = 0; - g20[0] = 0x10; - v = *(u16 *)(*(s32 *)(*(s32 *)(p + 0x64) + 0x20) + 0x12) + - *(u16 *)(p + 0xFC); - g20[1] = v; - *(u16 *)(p + 0xFE) = v; - g20[2] = 0; - ((void (*)(void *, void *))func_80049CAC)(g20, buf28); - ((void (*)(void *, void *, s32))func_800484EC)(buf28, g10, p + 0x10); - *(u16 *)(p + 2) = 8; - *(s32 *)(p + 0x1C) = 0x40; - ((void (*)(s32))func_8012B260)(p); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182D0C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182EC4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182F00); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80182F80); - - -extern s32 func_80132EF4(s32 a0, s32 a1); -extern void func_8012B0B4(unsigned int *p, int a1, int a2); -extern void func_80049CAC(s32, s32); -extern void func_800484EC(s32, s32, s32); -extern s32 func_8012C658(s32, s32, s32); -extern void func_80183FD0(s32 a0, s32 a1); -extern s32 rand(void); - -void func_80183170(s32 a0, s32 a1) { - s32 buf10[8]; /* sp+0x10 (0x20) - func_80049CAC out / func_800484EC in */ - s32 g40[4]; /* sp+0x30, only [0..2] used - func_800484EC vec3 arg */ - u16 g30[4]; /* sp+0x40, only [0..2] used - func_80049CAC vec3 arg */ - unsigned int buf48[2]; /* sp+0x48 (8) - func_8012B0B4 output */ - unsigned int *p48; - s32 i; - s32 baseY; - s32 e; - u32 uVar; - s32 scratch; - s32 tmp; - - i = 0; - p48 = buf48; - baseY = 0x100; - do { - e = func_80132EF4(a0, 0x23); - if (e != 0) { - *(s16 *)(e + 0x34) = rand() % 0x4000 + 0x1000; - *(u16 *)(*(s32 *)(e + 0x20) + 0x2c) = 0xc008; - - func_8012B0B4(p48, rand() % 0x1000, rand() % 0x58); - - tmp = *(s32 *)buf48; - *(s16 *)(e + 6) = *(s16 *)(e + 6) + (s16)tmp; - *(s16 *)(e + 0xe) = *(s16 *)(e + 0xe) + (s16)(tmp >> 16); - - tmp = rand(); - scratch = tmp % 0x80; - uVar = rand(); - g30[0] = (uVar & 1) == 0 ? -scratch + 0x400 : scratch + 0x400; - - scratch = rand() % 0xc0; - uVar = rand(); - g30[1] = (uVar & 1) != 0 ? baseY + scratch : baseY - scratch; - - g30[2] = 0; - g40[1] = 0; - g40[0] = 0; - g40[2] = (rand() % 4 + 3) << 16; - - ((void (*)(void *, void *))func_80049CAC)(g30, buf10); - ((void (*)(void *, void *, s32))func_800484EC)(buf10, g40, e + 0x10); - } - i++; - baseY += 0x200; - } while (i < 8); - - e = func_80132EF4(a0, 0x23); - if (e != 0) { - *(u16 *)(e + 0x34) = 0x7ff1; - *(u16 *)(*(s32 *)(e + 0x20) + 0x2c) = 0xc004; - *(s32 *)(e + 0x14) = 0xfffb0000; - } - - i = 0; - do { - func_8012C658(0x29d, (u16)a1, a0); - i++; - } while (i < 4); - - func_80183FD0(a0, 0x95e); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801833F4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_8018348C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801834F0); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_8018353C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_801835BC); - - -extern void (*D_8019EDB0[])(void); - -void func_80183624(void *a0) { - D_8019EDB0[*(u16 *)((s32)a0 + 0x2)](); -} - - - - -extern s32 rand(void); -extern void func_8012C1B8(void); -extern void func_8012CAE4(void*); -extern void func_8001C214(s32 a0, s32 a1); -extern void func_8012B2CC(s32 a0); -extern void func_8012B178(s32 a0, s32 a1); - -void func_80183660(s32 param_1) { - - extern u8 D_8019EDB8[]; - s32 unused[2]; /* dead 8-byte local — frame padding (cookbook idiom 6) */ - s32 obj; - s16 raw; - s32 r; - s32 sgn; - s32 v; - u8 *tbl; - s16 *p; - s32 q; - s32 w; - - obj = ((s32 (*)(void))func_8012C1B8)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - return; - } - *(s32 *)(param_1 + 0x20) = obj; - func_8001C214(obj, 0); - - raw = rand(); - r = raw; - *(u16 *)(obj + 0x2C) = *(u16 *)(obj + 0x2C) | 0x10; - v = r % 384 + 0x400; - *(s16 *)(obj + 0x1C) = v; - *(s16 *)(obj + 0x1A) = v; - *(s16 *)(obj + 0x18) = v; - sgn = -1; - if (raw & 1) { - sgn = 1; - } - *(s16 *)(obj + 0x10) = sgn * (r % 128) - 0x300; - *(s16 *)(obj + 0x12) = r % 4096; - *(s32 *)(param_1 + 0x48) = 0xC000; - *(u16 *)(param_1 + 0xA) = *(u16 *)(param_1 + 0xA) - 0x19; - func_8012B2CC(param_1); - func_8012B178(param_1, -0xC0000 - ((r % 8) << 16)); - *(s32 *)(param_1 + 0x1C) = 0x3C; - *(s16 *)(param_1 + 0xFE) = rand() & 0xF0; - *(s16 *)(param_1 + 0x100) = rand() & 0x1F0; - *(s16 *)(param_1 + 0x102) = rand() & 0x30; - tbl = &D_8019EDB8[(*(u16 *)(param_1 + 0x70) & 0xF) * 4]; - - p = (s16 *)(param_1 + 0xDC); - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q - 0x18; - } else { - w = q - 0x18; - } - p[0] = w; - p[1] = 0; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q - 0x18; - } else { - w = q - 0x18; - } - p[2] = w; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q + 0x18; - } else { - w = q + 0x18; - } - p[4] = w; - p[5] = 0; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q - 0x18; - } else { - w = q - 0x18; - } - p[6] = w; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q - 0x18; - } else { - w = q - 0x18; - } - p[8] = w; - p[9] = 0; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q + 0x18; - } else { - w = q + 0x18; - } - p[10] = w; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q + 0x18; - } else { - w = q + 0x18; - } - p[12] = w; - p[13] = 0; - - q = rand() % 12; - if ((rand() & 1) == 0) { - w = -q + 0x18; - } else { - w = q + 0x18; - } - p[14] = w; - - *((u8 *)p + 0x20) = tbl[0]; - *((u8 *)p + 0x21) = tbl[1]; - *((u8 *)p + 0x22) = tbl[2]; - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - - -extern s32 func_8012CBF4(s32 a0); -extern s32 func_8012BEE8(s32 a0); -extern void func_8012C218(void *a0); /* TU-canonical (ov_SC06_018_jr_8017C24C L5455) */ -extern void func_80017274(s32 a0, s32 a1); - -void func_80183AC4(s32 param_1) { - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + *(u16 *)(param_1 + 0xFE); - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) + *(u16 *)(param_1 + 0x100); - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) = - *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) + *(u16 *)(param_1 + 0x102); - - if (func_8012CBF4(param_1) != 0 || func_8012BEE8(param_1) != 0) { - func_8012C218((void *)param_1); - } else { - func_80017274(param_1 + 0xDC, *(s32 *)(param_1 + 0x20) + 0x34); - } -} - - - -extern void (*D_8019EDD0[])(void); - -void func_80183B68(void *a0) { - D_8019EDD0[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80183BA4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80183D98); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80183ED4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8017C24C", func_80183FD0); - - -extern void (*D_8019EDDC[])(void); - -void func_8018413C(void *a0) { - D_8019EDDC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80184178(s32 param_1) { - - extern u8 D_800D387C[]; - extern u8 D_800D3888[]; - s32 t; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x50000000; - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - t = *(s32 *)(param_1 + 0x20); - *(u16 *)(t + 0x1a) = 0x2000; - *(u16 *)(t + 0x18) = 0x2000; - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x24) = 0xff; - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x25) = 0; - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x26) = 0; - - func_80128EA8(*(s32 *)(param_1 + 0x20), param_1 + 0x24, (s32)&D_800D3888); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - - -extern void func_8012931C(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_801292C8(s32 a0); - -void func_80184228(s32 param_1) { - s32 q; - u8 a; - u8 b; - u16 h; - - q = *(s32 *)(param_1 + 0x20); - - a = *(u8 *)(q + 0x24) - 0x20; - *(u8 *)(q + 0x24) = a; - if (a < 0x80) { - *(u8 *)(q + 0x24) = 0x80; - } - - b = *(u8 *)(q + 0x25) + 0x20; - *(u8 *)(q + 0x25) = b; - if (b > 0x80) { - *(u8 *)(q + 0x25) = 0x80; - } - - h = *(u16 *)(q + 0x1A) + 0x400; - *(u8 *)(q + 0x26) = *(u8 *)(q + 0x25); - *(u16 *)(q + 0x1A) = h; - *(u16 *)(q + 0x18) = h; - - func_8012931C(param_1); - - if (func_80128ED8((void *)q, (void *)(param_1 + 0x24)) != 0) { - func_801292C8(param_1); - } -} - - - -extern s32 D_801BA878; -extern s32 func_8012C588(s32 a0, s32 a1); - -s32 func_801842E0(s32 a0, s32 a1) { - D_801BA878 = a1; - return func_8012C588(0x85, a0); -} - - -extern u8 D_801152A8[]; -extern s32 D_801BA878; -extern s32 func_80017DC4(void *a0, void *a1); -extern void func_80017E68(void *a0, void *a1); -extern void func_800D20C0(void *a0, void *a1, s32 a2); -extern void func_800D23D0(void *a0); -extern void func_8012A828(s32 a0, void *a1); -extern void func_8012C218(void *a0); -extern void func_8012F14C(s32); -extern s32 func_80134510(s32 arg); - -// @class: regalloc-order -// @stuck: none — MATCH (145/145 ins, match_one confirmed) - - - - -s32 func_80184310(s32 param_1) { - - extern M2C_UNK D_80185388; - extern s32 func_8012C354(s32 a0, s32 a1); - extern void RotMatrixZ(s32, void *); - extern void MulMatrix0(s32, void *, s32); - extern s32 D_801B6BE4; - extern char * D_801B6C18; - extern char D_801BA858[]; - - S8_80184F08 s60; - SVECTOR_80184F08 sStack_58; - S8_80184F08 s50; - int auStack_48[8]; - s32 iVar5, iVar8; - char *puVar2, *puVar4; - u16 uVar3; - - if (((s32 (*)(s32, void *))func_8012C354)(param_1, &D_801B6BE4) == 0) { - ((void (*)(s32))func_8012C218)(param_1); - } - ((void(*)(s32, void *))func_8012A828)(param_1, &(*(s32 *)&D_80185388)); - iVar5 = *(s32 *)(param_1 + 0x20); - *(s16 *)(param_1 + 0x70) = 0x80; - *(s32 *)(iVar5 + 4) |= 0x50000040; - *(u16 *)(iVar5 + 0x2c) |= 1; - iVar8 = *(s32 *)(*(s32 *)(param_1 + 0x64) + 0x20) + 0x34; - ((void (*)(s32, s32, void *))func_8012F14C)(iVar8, D_801BA878, &s60); - s50 = s60; - sStack_58.vz = 0x1800; - sStack_58.vy = 0x1800; - sStack_58.vx = 0x1800; - ((void (*)(void *, void *))func_80017DC4)(&sStack_58, auStack_48); - RotMatrixZ(rand() & 0xfff, auStack_48); - MulMatrix0(iVar8, auStack_48, iVar5 + 0x34); - ((void (*)(void *, s32))func_80017E68)(&s50, iVar5 + 0x34); - - /* pool-alloc: gcc routes the loaded pointer through a caller-saved reg ($v0) - before the callee-saved home ($s1) — pin it to reproduce the extra move. */ - { - register char *tmp __asm__("$2"); - tmp = D_801B6C18; - puVar2 = tmp; - } - puVar4 = puVar2 + 0x20; - D_801B6C18 = puVar4; - *(char **)(param_1 + 0xcc) = puVar2; - if (D_801BA858 < puVar4) { - D_801B6C18 = D_801BA858 - 0x120; - } - func_800D20C0(&s60, &sStack_58, 7); - func_800D23D0(&sStack_58); - ((void(*)(void *, void *))RotMatrixYXZ)(&sStack_58, puVar2); - ((void (*)(void *, s32))func_80017E68)(&s60, (s32)puVar2); - - uVar3 = *(u16 *)((char *)&s50 + 2); - if (((s32 (*)(void *))func_80134510)(&s50) != 0 && - (s32)(s16)uVar3 - (s32)*(s16 *)((char *)&s50 + 2) < 0x80) { - *(s16 *)((char *)&s50 + 2) = *(s16 *)((char *)&s50 + 2) - 4; - { - register char *tmp __asm__("$3"); - tmp = D_801B6C18; - puVar2 = tmp; - } - puVar4 = puVar2 + 0x20; - D_801B6C18 = puVar4; - *(char **)(param_1 + 0xd0) = puVar2; - if (D_801BA858 < puVar4) { - D_801B6C18 = D_801BA858 - 0x120; - } - func_800D23D0(&(*(s32 *)&D_801152A8)); - ((void(*)(void *, void *))RotMatrixYXZ)(&(*(s32 *)&D_801152A8), puVar2); - ((void (*)(void *, s32))func_80017E68)(&s50, (s32)puVar2); - } - *(s16 *)(param_1 + 2) = *(s16 *)(param_1 + 2) + 1; -} - - -extern s32 func_80017758(void *a0, void *a1); -extern void func_8012C218(void *a0); - - -// @class: regalloc-order -// @stuck: none — MATCH (168 ins). Keys: (1) pin param->$s1 via `register int self __asm__("$17")=param_1` -// (natural alloc put the short loop-counter in $s1); (2) block2's guarded dest via a test-temp -// `td=load; if(td){dest=td; ...}` forces the range-split `lw $a1; addu $s3,$a1,$0` the target has; -// (3) counter is `short i` do-while (keeps the `addu $s2,$v0,$0` raw-copy + sll16/sra16 compare); -// (4) gcc-2.7.2 loads s8/s16 via lbu/lhu+shift-extend (not lb/lh) so `signed char *p; *(s16*)buf=*p++` -// emits lbu;sll24;sra24;sh; (5) else-branch zero-byte asm barrier forces `addu $a0,$s1,$0` (else gcc -// reuses the still-live incoming $a0 with a nop delay slot). - -s32 func_80184554(s32 param_1) { - - extern signed char D_801B6BD0[]; - register int self __asm__("$17") = ((int)param_1); - int iVar6; - int iVar1; - unsigned char buf[0x34]; - signed char *p; - short i; - int dest; - int td; - unsigned short t; - - iVar1 = *(int *)(self + 0x1c); - iVar6 = *(int *)(self + 0x20); - *(int *)(self + 0x1c) = iVar1 + 1; - if (iVar1 < 2) { - p = D_801B6BD0; - i = 0; - dest = *(int *)(self + 0xcc); - t = *(unsigned short *)(self + 0x70); - *(short *)(buf + 0x0c) = 0; - *(short *)(buf + 0x0a) = 0; - *(short *)(buf + 0x08) = 0; - *(short *)(buf + 0x1c) = 0; - *(short *)(buf + 0x14) = 0; - *(short *)(buf + 0x04) = 0; - buf[0x22] = 0; - buf[0x21] = 0; - buf[0x20] = 0; - buf[0x2a] = 0; - buf[0x29] = 0; - buf[0x28] = 0; - buf[0x2e] = 0; - buf[0x2d] = 0; - buf[0x2c] = 0; - *(int *)(buf + 0x30) = 0x50000000; - buf[0x25] = t; - buf[0x26] = t; - buf[0x24] = t; - do { - *(short *)(buf + 0x00) = *p++; - *(short *)(buf + 0x02) = *p++; - *(short *)(buf + 0x10) = *p++; - *(short *)(buf + 0x12) = *p++; - *(short *)(buf + 0x18) = *p++; - *(short *)(buf + 0x1a) = *p--; - func_80017758(buf, (void *)dest); - i++; - } while (i < 4); - - td = *(int *)(self + 0xd0); - if (td != 0) { - dest = td; - p = D_801B6BD0; - i = 0; - t = *(unsigned short *)(self + 0x70); - *(short *)(buf + 0x0c) = 0; - *(short *)(buf + 0x0a) = 0; - *(short *)(buf + 0x08) = 0; - *(short *)(buf + 0x1c) = 0; - *(short *)(buf + 0x14) = 0; - *(short *)(buf + 0x04) = 0; - buf[0x22] = 0; - buf[0x21] = 0; - buf[0x20] = 0; - buf[0x2a] = 0; - buf[0x29] = 0; - buf[0x28] = 0; - buf[0x2e] = 0; - buf[0x2d] = 0; - buf[0x2c] = 0; - *(int *)(buf + 0x30) = 0x50000000; - buf[0x25] = t; - buf[0x26] = t; - buf[0x24] = t; - do { - *(short *)(buf + 0x00) = *p++; - *(short *)(buf + 0x02) = *p++; - *(short *)(buf + 0x10) = *p++; - *(short *)(buf + 0x12) = *p++; - *(short *)(buf + 0x18) = *p++; - *(short *)(buf + 0x1a) = *p--; - func_80017758(buf, (void *)dest); - i++; - } while (i < 4); - } - *(short *)(self + 0x70) = *(short *)(self + 0x70) >> 1; - *(unsigned short *)(iVar6 + 0x2c) |= 1; - } else { - __asm__ __volatile__("" : "=r"(self) : "0"(self)); - func_8012C218((void *)self); - } -} - - - -extern void (*D_801B6C1C[])(void); - -void func_801847F4(void *a0) { - D_801B6C1C[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801B7524[])(void); - -void func_80184830(void *a0) { - D_801B7524[*(u16 *)((s32)a0 + 0x2)](); -} - - - - -/* Declarations conform VERBATIM to the ones already present in - * src/ov_SC03_014/ov_SC03_014_jr_801848E4.c (lines 58, 2524, 2527, 3139, - * 3222, 3244, 3245). Type mismatches are resolved by casting AT THE USE. */ -extern s32 func_8012C354(s32 a0, s32 a1); -extern s32 func_80029178(s32 arg); -extern s32 func_801788B8(s32 arg0, s32 arg1); -extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); -extern void func_8012CAE4(void *a0); -extern void func_8012A828(s32 a0, void *a1); -/* not declared anywhere in the TU */ -extern void func_80184F18(void); - -void func_8018486C(void *a0) { - - extern s32 D_801B727C[]; - extern u8 D_801B7214[]; - extern u8 D_80185388[]; - s32 res1, res2, arr_elem; - void *ptr; - u16 idx; - s16 val; - - res1 = func_8012C354((s32)a0, (s32)D_801B7214); - if (res1 == 0) { - return; - } - - ptr = *(void **)((s32)a0 + 0xDC); - idx = *(u16 *)((s32)ptr + 0xA); - arr_elem = D_801B727C[idx]; - - res1 = func_80029178(arr_elem); - - if ((res1 & 0xFF) == 0) { - res2 = func_801788B8((s32)a0, (s32)func_80184F18); - *(s32 *)((s32)a0 + 0xCC) = res2; - } else { - val = *(s16 *)((s32)a0 + 0x70); - val |= 0x4000; - *(s16 *)((s32)a0 + 0x70) = val; - } - - res2 = func_8012C658(0x8F, *(s16 *)((s32)a0 + 0x70), (s32)a0); - *(s32 *)((s32)a0 + 0x6C) = res2; - - if (res2 == 0) { - func_8012CAE4(a0); - } else { - func_8012A828((s32)a0, D_80185388); - *(u16 *)((s32)a0 + 0x2) = 1; - } -} - - - - -s32 func_80184940(void *a0) { - void *p1, *p2; - u16 val; - long x; - - p1 = *(void **)(a0 + 0x20); - p2 = *(void **)(a0 + 0x6C); - val = *(u16 *)(p1 + 0x12); - p2 = *(void **)(p2 + 0x20); - val += 0x800; - val &= 0xFFF; - *(u16 *)(p2 + 0x12) = val; - x = 2; - *(u16 *)(a0 + 0x2) = x; - return x; -} - - -void func_80184968(void) { -} - - -/* Declarations copied VERBATIM from src/ov_SC03_014/ov_SC03_014_jr_801848E4.c - * (func_80029178 @ line 58/3176, func_80029124 @ line 43/3253, - * func_80178CBC @ line 2537). The D_801E3* globals are not declared - * anywhere in the TU. */ -extern s32 func_80029178(s32 arg); -extern void func_80029124(s32 a0, s32 a1); -extern void func_80178CBC(s32 arg0, s32 arg1); - -void func_80184970(void *a0) { - - extern s32 D_801B7460; - extern s32 D_801B744C; - extern s32 D_801B7448; - extern s32 D_801B74E0; - extern s32 D_801B7474; - extern s32 D_801B7340[]; - extern s32 D_801B73C4[]; - s32 *s0; - s32 *p; - u16 v0; - - s0 = *(s32 **)((char *)a0 + 0xDC); - v0 = *(u16 *)((char *)s0 + 0x8); - - if (!(v0 & 0x8000)) { - v0 = (func_80029178(0x1D)) & 0xFF; - - if (v0 != 0) { - u16 flags2; - D_801B7460 = *(s32 *)((char *)s0 + 0x4); - flags2 = *(u16 *)((char *)s0 + 0x8); - - if (!(flags2 & 0x4000)) { - v0 = *(u16 *)((char *)s0 + 0xC); - D_801B7448 = 0; - D_801B744C = D_801B73C4[v0]; - } else { - D_801B744C = 0; - v0 = *(u16 *)((char *)s0 + 0xC); - func_80029124(D_801B73C4[v0], 1); - D_801B7448 = 2; - } - } else { - D_801B7460 = *(s32 *)((char *)s0 + 0x0); - v0 = *(u16 *)((char *)s0 + 0xC); - D_801B7448 = 0; - D_801B744C = D_801B7340[v0]; - } - - func_80178CBC((s32)a0, (s32)&D_801B7474); - } else { - p = &D_801B74E0; - *p = *(s32 *)((char *)s0 + 0x0); - func_80178CBC((s32)a0, (s32)(p - 7)); - } - - *(u16 *)(a0 + 0x2) = 4; - *(u16 *)(a0 + 0x70) |= 0x8000; -} - - - - -/* Declarations copied VERBATIM from src/ov_SC03_014/ov_SC03_014_jr_801848E4.c - * (lines 43, 45, 58, 65, 2528, 2538, 2712, 3177, 3282). - * Type mismatches resolved by casting AT THE USE (func_80178D18). */ -extern s32 func_801789AC(s32 arg0); -extern void func_80178D18(void); -extern s32 func_80029178(s32 arg); -extern void func_80029514(s32); -extern void func_80029124(s32, s32); -extern void func_80145EE8(s32 param_1); -extern void func_8012C218(void *a0); -extern s32 func_80184CC0(void); - -void func_80184ABC(void *arg0) { - - extern s32 D_801B727C[]; - extern void func_8002AC00(s32 arg0); /* not declared anywhere in the TU */ - s32 ptr; - - ptr = *(s32 *)((s32)arg0 + 0xDC); - - if (func_801789AC((s32)arg0) != 0) { - ((void (*)(void *))func_80178D18)(arg0); - - if ((u8)func_80029178(D_801B727C[*(u16 *)(ptr + 0xA)]) != 0) { - if (D_801B727C[*(u16 *)(ptr + 0xA)] == 0x54) { - func_80029514(0x5A); - func_80029124(0xEA, 1); - } - - if ((*(u16 *)(ptr + 0x8) & 0x4000) != 0) { - if ((u8)func_80029178(0x1D) != 0) { - func_80145EE8(0); - } - } - - if (func_80184CC0() == 1) { - func_8002AC00(0x26); - } - - *(u16 *)((s32)arg0 + 0x70) &= 0x8000; - func_8012C218(*(void **)((s32)arg0 + 0xCC)); - } - - *(u16 *)((s32)arg0 + 0x2) = 2; - } -} - - -extern void func_8012C218(void *a0); - void func_80184BDC(void * arg0) { - *(short *)((char *)arg0 + 0x2) = 2; - ((void (*)(s32 *))func_8012C218)(*(s32 **)((char *)arg0 + 0xcc)); - } - - -void func_80184C08(void *a0) { - *(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 1; - } - - -void func_80184C18(void *a0) { - *(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 2; - } - - - - -extern void func_80029124(s32, s32); - -void func_80184C28(void *a0) { - - extern s32 D_801B727C[]; - u16 idx = *(u16 *)(*(s32 *)(a0 + 0xDC) + 0xA); - func_80029124(D_801B727C[idx], 1); -} - - - -extern s32 D_80126B58; -extern void func_8014ADA8(s32 a0, s32 a1); - -void func_80184C68(void * arg0) { - s32 temp_v0; - - temp_v0 = *(s32 *)((s32)arg0 + 0xdc); - ((void (*)(s32 *, s32))func_8014ADA8)((s32 *)&D_80126B58, *(u16 *)(temp_v0 + 0xc)); -} - - -extern s16 func_80174764(void); -s32 func_80184C9C(void) { - return ((s32 (*)(void))func_80174764)() == 1; -} - - - - -extern s32 func_80029178(s32 arg); - -s32 func_80184CC0(void) { - - extern s32 D_801B727C[]; - s32 i; - - for (i = 0; i < 0x26; i++) { - if ((u8)func_80029178(D_801B727C[i]) == 0) { - return 0; - } - } - return 1; -} - - - -extern void (*D_801B754C[])(void); - -void func_80184D24(void *a0) { - D_801B754C[*(u16 *)((s32)a0 + 0x2)](); -} - - - - -extern s32 func_8012C354(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); - -void func_80184D60(void *a0) { - - extern u8 D_801B7248[]; - extern u8 D_801B7C0C[]; - extern u8 D_801B79EC[]; - s32 ptr; - unsigned short v1; - unsigned short v0; - - if (func_8012C354((s32)a0, (s32)D_801B7248) == 0) { - return; - } - - ptr = *(s32 *)((s32)a0 + 0x64); - v1 = *(unsigned short *)(ptr + 0x36); - v0 = *(unsigned short *)((s32)a0 + 0x70); - *(unsigned short *)((s32)a0 + 0xFC) = v1; - - if (v0 & 0x4000) { - func_8012A828((s32)a0, D_801B7C0C); - *(unsigned short *)((s32)a0 + 0x5C) = 0; - } else { - func_8012A828((s32)a0, D_801B79EC); - } - - *(unsigned short *)((s32)a0 + 0x2) = 1; -} - - - - -extern void func_8012C218(void *a0); -extern void func_8012A828(s32 a0, void *a1); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80184DE8(void *a0) { - - extern u8 D_801B79FC[]; - extern u8 D_801B7B04[]; - s16 mode; - - if (*(s16 *)((s32)a0 + 0xFC) != *(s16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36)) { - ((void (*)(void))func_8012C218)(); - return; - } - - mode = *(s16 *)((s32)a0 + 0xFE); - if (mode == 1) { - *(s16 *)((s32)a0 + 0x2) = 2; - *(s32 *)((s32)a0 + 0x1C) = 0x20; - func_8012A828((s32)a0, D_801B79FC); - *(s16 *)((s32)a0 + 0x5C) = 0; - func_8002D4C8(0x5BF, 0); - } else if (mode == 2) { - *(s16 *)((s32)a0 + 0x2) = 2; - *(s32 *)((s32)a0 + 0x1C) = 0x20; - func_8012A828((s32)a0, D_801B7B04); - *(u16 *)((s32)a0 + 0x5C) = 0x8C00; - } -} - - - -/* func_80184EA8 — guarded state-kick: if the s16 at 0x98 is clear, set the - * state word at 0x02 to 1, hand the entity to func_8012A828 with one of two - * script tables selected by the s16 flag at 0xFE (== 1 -> D_801B7C0C, else - * D_801B79EC), then clear that flag. - * - * §71 sibling-first: func_8018A06C (same TU, 0x148 bytes earlier) is the same - * two-arm `func_8012A828(entity, D_801B7C0C / D_801B79EC)` selector and pins - * the widths: `lh` at 0x98/0xFE, `sh` at 0x02. - */ - -extern void func_8012A828(s32 a0, void *a1); - -void func_80184EA8(void *a0) { - - extern u8 D_801B7C0C[]; - extern u8 D_801B79EC[]; - if (*(s16 *)((s32)a0 + 0x98) == 0) { - *(s16 *)((s32)a0 + 0x2) = 1; - if (*(s16 *)((s32)a0 + 0xFE) == 1) { - func_8012A828((s32)a0, D_801B7C0C); - } else { - func_8012A828((s32)a0, D_801B79EC); - } - *(s16 *)((s32)a0 + 0xFE) = 0; - } -} - - -extern s32 *D_80126B78; -extern u8 D_801B753C[]; -extern s32 func_8012BDBC(s32 a0, s32 a1); -extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_80172710(void); -extern s32 func_80178BF8(); -#define gte_SetRotMatrix(r0) __asm__ volatile ( \ - "lw $12, 0( %0 );" \ - "lw $13, 4( %0 );" \ - "ctc2 $12, $0;" \ - "ctc2 $13, $1;" \ - "lw $12, 8( %0 );" \ - "lw $13, 12( %0 );" \ - "lw $14, 16( %0 );" \ - "ctc2 $12, $2;" \ - "ctc2 $13, $3;" \ - "ctc2 $14, $4" \ - : \ - : "r"( r0 ) \ - : "$12", "$13", "$14" ) -#define gte_SetTransMatrix(r0) __asm__ volatile ( \ - "lw $12, 20( %0 );" \ - "lw $13, 24( %0 );" \ - "ctc2 $12, $5;" \ - "lw $14, 28( %0 );" \ - "ctc2 $13, $6;" \ - "ctc2 $14, $7" \ - : \ - : "r"( r0 ) \ - : "$12", "$13", "$14" ) - -s32 aF8018A224() __asm__("func_80184F18"); - -s32 aF8018A224(param_1) - void *param_1; -{ - s32 *m; - s32 obj; - s32 sv0[2]; - s32 sv1[2]; - s32 flag; - - m = (s32 *)((u8 *)D_80126B78 + 0x34); - obj = *(s32 *)((s32)param_1 + 0x64); - - gte_SetRotMatrix(m); - gte_SetTransMatrix(m); - - RotTransSV(D_801B753C, sv0, &flag); - RotTransSV(D_801B753C + 8, sv1, &flag); - - if (func_80135888(*(s32 *)(obj + 0x20), *(s32 *)(obj + 0x58), (s32)sv0, (s32)sv1) == 0) { - return 0; - } - if (func_8012BDBC(obj, 0x300) == 0) { - return 0; - } - *(s16 *)(obj + 0x2) = 3; - func_80178BF8(); - return (s32)func_80172710; -} - - - - - diff --git a/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c b/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c new file mode 100644 index 0000000000..7b5ed316bf --- /dev/null +++ b/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c @@ -0,0 +1,4508 @@ +#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 { + SVECTOR_8016E7C8 v[4]; /* 0x00 */ + s32 f0, f1, f2, f3, f4, f5; /* 0x20..0x37 */ + u8 f6; /* 0x38 */ + u8 pad[7]; /* -> 0x40 */ +} Prim_8016E7C8; +typedef void (*Handler)(struct Entry_8016E95C *); +typedef struct { + u8 pad0[6]; + u16 f6; /* 0x06 -> D_80126B5E */ + u8 pad8[2]; + u16 fa; /* 0x0A -> D_80126B62 */ + u8 padc[2]; + u16 fe; /* 0x0E -> D_80126B66 */ +} StructB58_8017FAFC; +extern void func_801458E0(void); +extern s32 D_800AE6AC; +extern s32 D_800AE6B0; +extern s16 D_800B9A0A; +extern u8 D_80078E50; +extern void func_800D185C(u8 *a0); +extern void func_801458E8(void); +extern s32 func_80029504(void); +extern void func_80145B24(void); +extern u8 D_80187594; +extern u8 D_80187504; +extern u8 D_801874E0; +extern u8 D_801874BC; +extern u8 D_80187570; +extern u8 D_8018754C; +extern u8 D_80187528; +extern u8 D_80187498; +extern void func_80145934(void); +extern u8 D_80187624; +extern u8 D_80187600; +extern u8 D_801875DC; +extern u8 D_801875B8; +extern void func_80145A2C(void); +extern s32 func_800291DC(s32); +extern void func_800291C8(s32, s32); +extern void func_80162120(void); +extern void func_80029124(s32, s32); +extern s32 func_80165A50(s32); +extern void func_80029514(s32); +extern u8 D_800AF630[]; +extern u8 D_80078EC0; +extern s32 D_80126B58; +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80145BF8(void); +extern s32 func_800291B4(s32 arg); +extern void func_800291A0(s32, s32); +extern void func_80145C54(void); +extern s32 func_80145CEC(); +extern s32 func_80029178(s32 arg); +extern void func_80146014(s32 a0); +extern unsigned char D_80186A1C[]; +extern unsigned char D_80186A4C[]; +extern unsigned char D_80186A9C[]; +extern unsigned char D_80186ACC[]; +extern unsigned char D_80186AFC[]; +extern void func_80145EE8(s32 param_1); +extern void MoveImage(void *a0, s32 a1, s32 a2); +extern void func_80146074(void); +extern s32 func_80146128(void); +extern void func_80146360(void); +extern void func_801463A0(); +extern void func_8014607C(void); +extern u8 D_80078EC1; +extern s32 D_80078EC8; +extern s32 D_8011F730; +extern u16 D_801152B8; +extern u16 D_8012693A; +extern u8 D_80126BE0[]; +extern u8 D_801150F0[]; +extern void *memcpy(void *dst, const void *src, u32 n); +extern void func_80146FC4(s32 a0); +extern void func_80150A70(s32 a0); +extern void func_80147098(s32 *a0); +extern void func_8014A638(s32 arg0); +extern s32 func_80155458(s32 a0); +extern s32 func_80029104(void); +extern void func_80029344(void); +extern void func_8014ADE0(s32 a0); +extern void func_8014B350(s32 a0); +extern void func_8014B7A4(s16 *param_1); +extern s32 func_80161D58(s32 a0); +extern void func_80161A90(s32 a0); +extern void func_8014B504(u16 *a0); +extern void func_80149BEC(s32 a0); +extern void func_8014B5D0(s32 *a0); +extern void func_8014C99C(u8 *a0); +extern void func_8014B190(s32 s0); +extern void func_80148648(s32 a0, s32 a1); +extern s32 func_80149228(s32 a0); +extern void func_8014A59C(s32 a0); +extern void func_8016F14C(void *a0); +extern void func_80154418(void *a0); +extern void func_80154BE4(s32 a0); +extern void func_80165694(s32 arg0); +extern void func_801654A8(s32 a0); +extern void func_8014A680(s32 a0); +extern void func_8014A6A8(s32 a0); +extern void func_8014A71C(s32 a0); +extern void func_80172588(s32 *a0); +extern void func_801473DC(s32 *a0); +extern void func_80015978(s32 a0, s32 *a1); +extern void (*D_80186B4C[])(void *); +extern u8 D_80126BA4; +extern s32 D_80127098; +extern s32 D_80127094; +extern s32 D_80127090; +extern void func_80146534(void); +extern void func_8001D074(s32 a0, s32 a1); +extern void func_80146554(void); +extern void func_80146578(void); +extern void func_8001CFDC(s32, s32); +extern void func_8014659C(void); +extern void func_8001D074(s32, s32); +extern void func_801465C0(void); +extern void func_801465E4(void); +extern void func_801466F0(s32 a0, s32 a1, s32 a2, s32 a3, s32 sp5, s32 sp6, s32 sp7, s32 sp8); +extern s32 D_8011F9D0; +extern s32 func_80146608(s32 a0, s32 a1, s32 a2, s32 a3, s16 arg9, s32 arg10, s32 arg11, s32 arg12, s32 arg13); +extern void func_801466B4(u16 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 D_8011F750; +extern s32 D_8011F754; +extern u8 * func_801468C8(s32 arg0, u8 arg1); +extern s32 D_8011D030; +extern s32 func_80146994(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80146924(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern s32 func_80146994(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_801469C8(int a0, void *a1, int a2, int a3, u16 arg5, int arg6, int arg7, int arg8); +extern s32 func_80146B9C(void *a0); +extern void func_80146AB4(s16 a0, s32 a1, s16 a2, s16 a3, u16 a4, s32 a5, s32 a6); +extern u16 D_8011DA28; +extern s32 func_80146B9C(void * arg0); +extern void func_80146C98(s32 *a0, s16 a1); +extern void func_80146CA0(void *a0); +extern void func_80146CB4(void *a0); +extern void func_80146CC8(s32 a0); +extern void func_80146D30(s32 a0); +extern void func_80146D80(s32 *a0); +extern void func_80146DE8(s32 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80146D90(s32 a0); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80146DF8(s32 *a0, s32 a1, s32 a2, s32 a3, s32 t0); +extern void func_80146E90(s32 *a0, s32 a1); +extern s32 func_80146E98(s32 a0); +extern void func_80015954(s32 a0, s32 a1); +extern void func_80149374(s32 a0, s32 a1); +extern void func_80146F58(s32 a0, s32 a1); +extern void func_80146EC0(s32 a0, s32 a1, s32 a2, s32 a3); +extern s16 func_8012A68C(void); +extern s16 func_8012A758(void); +extern void func_8004978C(s16 *a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern u8 D_80126DB0[]; +extern u16 D_80126DB6; +extern void func_8014704C(s32 *a0); +extern s32 func_80147054(void *a0); +extern void func_80147060(u8 * a0); +extern void func_8014706C(void *arg0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80147084(s32 *a0); +extern void func_8014708C(void *arg0); +extern s32 func_801470A0(void *a0); +extern void func_801470AC(s32 *a0); +extern void func_801470B4(s32 arg0); +extern void func_801470C0(s32 a0); +extern void func_80147118(s32 a0); +extern s16 D_80126BB8; +extern s16 D_80126BBA; +extern s16 D_80126BBC; +extern void func_80147264(s32 a0); +extern void func_80147290(void); +extern void func_801472B4(void *a0); +extern s32 func_801472C8(struct S *a0); +extern void *D_8012707C; +extern void func_801472DC(void); +extern void func_801472F0(void *a0); +extern void func_80147364(u16, s32); +extern void func_80147300(u16 arg0); +extern void func_80147324(s32 arg0); +extern void func_801473EC(s32 *a0); +extern void func_80147460(s32 a0); +extern void func_80147514(); +extern void func_80147628(s32 a0); +extern void func_80147478(s32 a0); +extern void func_801474D8(s32 *a0); +extern void func_801474EC(s32 *a0); +extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2); +extern s32 func_800129CC(s32 a0, s32 a1); +extern void func_80147514(s32 arg0); +extern void func_80013F3C(s32 a0); +extern void func_80012558(s32 a0, s32 a1); +extern void func_800126C4(s32 a0, s32 a1); +extern void func_800123F0(s32 a0, s32 a1); +extern void func_80147718(s32 a0); +extern void func_80147788(void *a0, s32 a1); +extern void func_801477A8(void *a0, s32 a1); +extern void func_801477C8(void *a0, s32 a1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80147814(s32 a0, s32 a1); +extern void func_80147928(int a0, int a1); +extern void func_8014799C(int a0, int a1); +extern void func_80147A10(int a0, int a1); +extern void func_80147860(int a0, int a1, int a2, int a3); +extern void func_80147948(s32 a0, s32 a1, s32 a2); +extern void func_801479BC(s32 a0, s32 a1, s32 a2); +extern void func_80147A30(s32 a0, s32 a1, s32 a2); +extern void func_801478B8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147948(int a0, int a1, int a2); +extern void func_801479BC(int a0, int a1, int a2); +extern void func_80147A30(int a0, int a1, int a2); +extern void func_80147AD4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147A84(s32 arg0); +extern void func_80147C30(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147AAC(s32 arg0); +extern void func_80147CC8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80147B5C(s32 a0, void *a1); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern void func_80147B18(s32 a0); +extern void func_80147B5C(s32 arg0, void *arg1); +extern void func_80147C30(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147DC0(s32 a0, s32 a1); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void * a4); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_80147E44(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147F78(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147F50(s32 arg0); +extern void func_80148038(s32 a0, s32 a1); +extern s32 ratan2(s32 a0, s32 a1); +extern s32 csqrt(s32 a0); +extern s32 func_80012A60(s32 a0, s32 a1); +extern void func_80148094(int param_1, short *param_2, int *param_3); +extern void func_801485B8(s32 a0, s32 a1, s32 a2); +extern void func_801484B0(s32 a0, s32 a1); +extern s32 func_80154358(void *a0); +extern void func_801484E8(s32 a0, s32 a1); +extern void func_80148534(s32 a0, s32 a1); +extern void func_8014856C(s32 a0, s32 a1); +extern void func_801485B8(s32 arg0, s32 arg1, s32 arg2); +extern void func_80148634(void *a0); +extern u8 D_800B9A64; +extern s32 func_80014DC0(); +extern s32 func_80014D68(); +extern s32 func_80014D94(); +extern s32 func_80014CF8(); +extern void func_800120DC(); +extern s32 func_800CF8B4(); +extern u16 func_801487F4(s32 *a0); +extern u16 func_80148800(s32 *a0); +extern u8 func_8014880C(s32 *a0); +extern u16 func_80148818(s32 *a0); +extern s32 func_80047D3C(s32 a0); +extern s32 func_80148824(void *arg0); +extern s32 func_801488A8(u8 *a0); +extern s32 func_8014891C(s32 a0); +extern s32 func_80148980(u8 *a0); +extern s32 func_801489E8(s32 a0); +extern s32 func_80148A48(s32 a0); +extern int func_80148AFC(void *a0); +extern void func_80148AAC(u8 *a0); +extern s32 func_80148C18(void); +extern s32 func_80148C20(s32 a0, s16 a1); +extern s32 func_80148C34(s32 a0, s32 a1); +extern s32 func_80148C4C(s32 a0, s32 a1); +extern s32 func_80148C64(s32 a0, s32 a1); +extern s32 func_80148C7C(void); +extern s32 func_80148C84(s32 a0, s32 a1); +extern s32 func_80148C9C(s32 a0, s32 a1); +extern s32 func_80148CB4(s32 a0, s32 a1); +extern s32 func_80148CCC(s32 a0, s32 a1); +extern s32 func_80148CE4(void); +extern s32 func_80148CEC(void); +extern s32 func_80148CF4(s32 a0, s32 a1); +extern s32 func_80148D0C(s32 a0, s32 a1); +extern s32 func_80148D24(void *a0, int a1); +extern s32 func_80148D3C(void); +extern s32 func_80148F60(void); +extern s32 func_80148F68(s32 a0); +extern s32 func_80148F74(s32 a0); +extern s32 func_80148F80(s32 a0); +extern s32 func_80148F8C(s32 a0); +extern s32 func_80148F98(void); +extern s32 func_80148FA0(s32 a0); +extern s32 func_80148FAC(s32 a0); +extern s32 func_80148FB8(s32 a0); +extern s32 func_80148FC4(s32 a0); +extern s32 func_80148FD0(void); +extern s32 func_80148FD8(void); +extern s32 func_80148FE0(s32 a0); +extern s32 func_80148FEC(s32 a0); +extern s32 func_80148FF8(s32 a0); +extern s32 func_80149004(void); +extern void func_8014900C(s32 *a0); +extern void func_80149020(s32 *a0); +extern void func_80149034(s32 *a0); +extern void func_80149048(s32 *a0); +extern void func_8014905C(u8 *a0); +extern void func_801490E0(s32 *a0, s16 a1); +extern void func_801490E8(s32 *a0, s16 a1); +extern void func_801490F0(s32 *a0, s16 a1); +extern void func_80149078(s32 *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80012B04(s32 a0, s32 a1, s32 a2); +extern void func_801490F8(s32 a0, s32 a1); +extern s32 func_801491C4(s32 a0); +extern s32 func_80149184(s32 a0); +extern s32 D_801151D4; +extern void func_80149204(s32 *a0); +extern void func_80149210(s32 a0, s32 a1); +extern s32 func_80149284(s32 *a0, s32 a1); +extern void func_80149350(s32 arg0); +extern void func_80149290(s32 a0); +extern void func_8012F14C(s32); +extern void func_80149374(s32 arg0, s32 arg1); +extern void func_801493D0(s32 param_1, s32 param_2, s32 param_3); +extern void func_8012F038(s32); +extern void func_8014942C(s32 arg0); +extern void func_8012EF70(s32 a0, s32 a1); +extern void func_80149544(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012EFB8(s32 a0); +extern void func_80149584(s32 arg0, s32 arg1, s32 arg2); +extern void func_8014964C(s32 param_1, s32 param_2); +extern s32 func_801496D4(void *a0); +extern void func_8015AD08(); +extern void func_80149704(void); +extern void func_8015ACC4(); +extern void func_80149724(void); +extern u8 D_80078EBF; +extern s32 func_80149744(struct S_80149744 *a0); +extern void func_8015F7A0(); +extern void func_80149788(void); +extern void func_801653B8(); +extern void func_80149864(void); +extern s16 currentLocationId; +extern s32 func_8016F1AC(void); +extern s32 func_80149884(void); +extern void func_80160B00(); +extern void func_801498C0(void); +extern s32 func_80149AA8(s32 *a0); +extern s32 func_80149B54(s32 *a0); +extern void func_80146750(void *a0); +extern s32 func_801498E0(s32 *a0); +extern s32 func_8012E5CC(s32 a0, s32 a1, s32 a2); +extern void func_80147364(u16 a0, s32 a1); +extern s32 func_800CCF28(s32 a0); +extern s32 func_80149954(s32 s0); +extern s32 func_80149A64(s32 *a0); +extern void func_8015DAC4(s32 *a0); +extern void func_8015554C(s32 *a0); +extern void func_80149AD4(s32 *a0); +extern void func_80149B14(s32 *a0); +extern u8 func_8014BEF8(void); +extern s32 func_80149B54(s32 * arg0); +extern void func_8015DE24(s32 *a0); +extern void func_80157510(s32 *a0); +extern void func_80149BAC(s32 *a0); +extern s32 func_80029178(s32 a0); +extern s32 func_80149C08(s32 arg0); +extern void func_801577C8(); +extern void func_80149C94(void); +extern void func_80157D20(void); +extern void func_80149CB4(void); +extern s32 func_80149CD4(s32 a0); +extern u8 func_8014B5B8(s32 *a0); +extern s32 func_80149D10(s32 a0); +extern s32 func_80149E94(s32 a0); +extern s32 func_80149DD8(s32 a0); +extern s32 func_80149D9C(s32 a0); +extern u8 D_801202A0[]; +extern s32 func_80149F2C(s32 a0, s32 a1); +extern s32 func_80149E94(s32 arg0); +extern void func_80149FA8(void); +extern s32 D_80186C14[]; +extern u8 D_80078E78[]; +extern s32 func_80149FB0(s32 a0); +extern s32 func_80135260(s32 arg0, s32 arg1, s16 *arg2, s16 *arg3); +extern void func_8014A1B0(s32 a0, s32 a1); +extern s32 func_8014A048(s32 param_1); +extern u16 func_80156370(u16 a0); +extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4); +extern void func_8015D4B4(); +extern void func_8014A218(void); +extern s32 func_8014C278(s32 a0, s32 a1, s32 a2); +extern s32 func_8014C2B0(void *a0, void *a1, s32 a2); +extern s32 func_8014A238(s32 arg0); +extern s32 func_8014A2E4(s32 a0); +extern void func_8014A380(s32 a0, s32 a1); +extern s16 D_801152B0; +extern s16 D_801152B4; +extern s32 func_8014A3E0(struct S_8014A3E0 *a0); +extern s32 func_8014A454(s32 a0); +extern s32 func_8014A4B4(void *a0); +extern void func_8015EDD4(); +extern void func_8014A4FC(void); +extern s32 func_8014A674(s32 *a0); +extern s32 func_8014A69C(s32 *a0); +extern s32 func_8014A6C4(s32 a0); +extern void func_8015E184(); +extern void func_8014A830(void); +extern s32 func_80029AF4(void); +extern s32 func_8014A850(s32 param_1); +extern void func_8014AA04(s32 a0); +extern void func_801599A4(void *a0); +extern void func_80159B3C(void *a0); +extern s32 func_80165A20(s32 a0); +extern void func_8014AB7C(); +extern void func_8014AC10(); +extern void func_8014AA28(void); +extern void func_8014AB5C(void); +extern void func_80162CCC(void); +extern void func_8014AB7C(s32 arg0); +extern void func_8014ABF0(void); +extern void func_80016714(void *a0, s32 a1); +extern void func_8014AC10(s32 arg0); +extern void func_8014ACC0(s32 a0, s32 a1); +extern void func_8014AD30(s32 a0, u16 *a1, s32 a2, s32 a3); +extern void func_8014ACE8(void *a0, s32 a1, s32 a2); +extern void func_80146AFC(void *a0); +extern void func_8014ADA8(s32 a0, s32 a1); +extern void func_8014AD7C(s32 a0); +extern s32 D_80078E8C; +extern void func_8014B034(s32 arg0); +extern void func_8014B00C(s32 arg0); +extern void func_8014B084(void); +extern s16 D_80078E90; +extern void func_8014B034(s32 a0); +extern u16 D_80078EAC; +extern u8 D_80078EBA; +extern void func_800D10EC(void); +extern void func_8002AC98(void); +extern s32 func_8014B154(s32 *a0); +extern void func_8014B12C(void); +extern void func_8014B2F8(void); +extern void func_8014B4C4(void); +extern void func_8014B160(s32 a0); +extern s32 func_8016F1C4(void); +extern s16 D_80078E96; +extern s16 D_80078EB8; +extern u16 D_80078EA6; +extern void func_8014B2A8(void); +extern void func_8014B310(void); +extern void func_8014B2D0(void); +extern s32 D_80078E94; +extern s32 D_80078ECC; +extern void func_8014B33C(void); +extern u8 D_80062BF4[]; +extern void func_8014BC80(s32 a0, s32 a1); +extern void func_80019064(void *a0); +extern s32 D_80078E98; +extern void func_80166244(); +extern void func_8014B4D4(void *a0); +extern s16 D_80078E9A; +extern u8 D_80126D1C; +extern s32 D_80126D74; +extern void func_8014B598(s32 a0, s32 a1); +extern void func_8014B5B0(s32 *a0); +extern void func_8014B5C4(s32 *a0, s32 a1, s32 a2); +extern void func_8014B5D8(s32 s1); +extern s32 D_80078E9C; +extern s32 D_80078ED0; +extern void func_8014B6F0(s32 a0, s32 a1); +extern void func_8014B768(s32 a0, s32 a1); +extern void func_8014B944(s32 a0, s32 a1, s32 a2); +extern s32 D_80078EA4; +extern u16 D_80078EB2; +extern s16 D_80078EB4; +extern void func_8014BB0C(void); +extern void func_8014BB24(s32 a0, s32 a1, s32 a2); +extern void func_8014BC0C(s32 a0, s32 a1); +extern void func_8014BC44(s32 a0, s32 a1); +extern u8 D_800B9A17; +extern void func_8014BCC0(s32 a0, s32 a1); +extern u16 D_80078EB6; +extern s32 func_8014BCEC(s32 a0, s32 a1); +extern void func_8014BD24(s32 a0, s32 a1); +extern void func_8014BD60(s32 param_1, s32 param_2); +extern void func_8014BD98(s32 a0, u16 a1); +extern void func_8014BDC8(void); +extern void func_8014BDE0(void); +extern s32 func_8017267C(s32 *a0); +extern s32 func_80013294(void *a0, void *a1); +extern void func_80029ED4(s32 a0); +extern void func_8014BDE8(s32 a0); +extern void func_8014BE78(void); +extern void func_8014BE9C(void); +extern void func_80029124(s32 a0, s32 a1); +extern void func_8014BEC0(void); +extern void func_8014BF18(s32 a0); +extern void func_8014BF48(void); +extern u8 func_8014BF6C(void); +extern void func_8014BF8C(u8 arg0); +extern void func_8014BFB0(void); +extern u8 func_8014BFD4(void); +extern void func_8014BFF4(s32 a0, s32 a1); +extern void func_8014C010(s32 a0, s32 a1); +extern s32 func_8014C050(s32 a0, s32 a1); +extern s32 func_8014C088(s32 a0, s32 a1); +extern s32 func_8014C0C8(s32 a0_unused, s32 a1, s32 a2); +extern s32 func_8014C118(void * a0, s32 a1, s32 a2); +extern s32 func_8014C168(s32 * param_1, s32 param_2); +extern void func_8014C1C8(s32 arg0, s32 arg1, void *arg2); +extern u8 D_80186C9C[]; +extern void func_8014C1A0(s32 arg0, s32 arg1); +extern s32 func_80013328(s32 a0, s32 a1); +extern s32 func_8014C59C(void *a0, void *a1); +extern s32 func_8014C308(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8014C43C(void *a0, s32 a1, s32 a2, s32 a3, s16 a5); +extern s32 func_8014C3A4(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C3D0(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C43C(void * a0, s32 a1, s32 a2, s32 a3, s16 a4); +extern s32 ratan2(s32 dx, s32 dy); +extern u8 D_80186CA4; +extern s32 func_8014C5FC(s32 a0, s32 a1, void *a2); +extern s16 func_8014C5D0(s32 a0, s32 a1); +extern s32 func_8014C5FC(s32 a0, s32 a1, void * a2); +extern u8 D_80126D17; +extern void func_8014C6AC(void); +extern void func_8014C6C0(void); +extern u8 D_80126D1E; +extern void func_8014C6D0(void); +extern void func_8014C6E0(void); +extern s32 func_8014C860(s32 a0, s32 a1); +extern void func_8014C8C8(s32 a0, s32 *a1); +extern void func_8014C88C(s32 a0); +extern void func_8014C8C8(s32 dst, s32 * src); +extern void func_8014C8F0(s32 arg0); +extern u8 D_801151F0[]; +extern s32 func_8014C918(s32 a0, s32 a1); +extern s32 D_80126B50; +extern void func_8014C968(void); +extern void func_8014C978(void); +extern s32 func_8014C98C(void); +extern void func_80139914(s32 a0); +extern s32 func_8014CA00(s32 a0); +extern u16 func_8014CA70(s32 a0, s32 a1); +extern s32 func_8014CA14(s32 a0, s32 a1); +extern u16 func_8014CAE4(s32 *a0, s32 a1); +extern s32 func_8014CA88(s32 *a0, s32 a1); +extern s32 func_8014CAFC(void); +extern s32 func_8014CB0C(void); +extern s32 func_8014CB1C(void); +extern u8 D_80126D1F; +extern s32 func_8014CB2C(void); +extern s32 func_8014CB58(void); +extern u8 D_80126D1D; +extern void func_8014CB68(void); +extern s32 func_8014CB7C(void); +extern s32 func_8014CB8C(void); +extern short D_80126C9E; +extern void func_8014CB9C(struct Packed8 *a0); +extern s32 D_80126CDC; +extern void func_8014CBD8(void); +extern s16 D_80126CC4; +extern void func_8014CBE8(void); +extern void func_8014CBF8(void *a0); +extern void func_8014D3E0(s32 a0); +extern void func_8014D04C(void); +extern void func_8014CCB4(void); +extern void func_8014CC28(s32 a0); +extern void func_8014CD0C(u8 *a0); +extern s32 func_8014CF04(s32 a0, s32 a1, void *a2); +extern void func_8014CD80(s32 a0, void *a1, void *a2); +extern void func_8014D0A4(s32 a0); +extern s32 func_8014D2A0(s32 a0, void *a1, void *a2); +extern s32 func_8014D12C(s32 a0, void *a1, void *a2); +extern void func_8014D438(s32 a0); +extern void func_8014D3E0(s32 _arg0); +extern void func_8014D610(s32 a0, void *a1, void *a2); +extern s32 func_8014D4C0(s32 a0, void *a1, void *a2); +extern void func_8014D790(s32 a0); +extern void func_8014D738(void); +extern s32 func_8014DD8C(s32 a0, void *a1, void *a2); +extern s32 func_8014D820(s32 a0, u16 *a1, u16 *a2); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014DCE0(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_8014DD8C(s32 arg0, void *arg1, void *arg2); +extern void func_8014DF94(s32 arg0); +extern void func_8014DF3C(void); +extern s32 func_8014E284(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E048(s32 a0, u16 *a1, u16 *a2); /* u16*: def lhu semantics (T5b reconcile; ptr param type codegen-neutral for the caller) */ +extern s32 func_80135A4C(s32 a0, s32 a1, s32 *a2, s32 a3); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern u8 D_801152A8[]; /* canonical TU type (engine_core) — read via *(u16*) cast */ +extern s16 D_801152AC; +extern s32 func_8014E048(s32 param_1, u16 * param_2, u16 * param_3); +extern void func_8014E48C(s32 a0); +extern void func_8014E434(void); +extern void func_8014E5B4(s32 a0, void *a1, void *a2); +extern s32 func_8014E514(u8 *a0, s32 a1, s32 a2); +extern void func_8014E6F8(struct SubE6F8 *a0); +extern void func_8014E6A0(void); +extern s32 func_8014E83C(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014E83C(s32 arg0, s16 * arg1, s16 * arg2); +extern void func_8014E934(s32 _arg0); +extern s32 func_8014EA4C(void *a0, void *a1, void *a2, s32 a3); +extern s32 func_8014E98C(void *a0); +extern s32 D_801150D8; +extern s16 D_801152AA; +extern u8 D_80126720[]; +extern s16 D_80126724; +extern s32 func_8014EA4C(void * a0, void * a1, void * a2, s32 _arg3); +extern s32 func_8014ED80(struct SubED80 *a0); +extern int D_801B9588; +extern void func_8014ED28(s32 _arg0); +extern s32 func_8014EE14(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014EE14(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F24C(struct SubF24C *a0); +extern void func_8014F1F4(void); +extern s32 func_8014F2E0(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014F2E0(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F4C0(); +extern s32 func_8014F468(void); +extern int func_8014F74C(); +extern int func_8014F6F4(void); +extern u8 D_800D3918[]; +extern u8 D_801152A8[]; +extern s32 D_801152BC; +extern int func_8014F74C(s32 arg0); +extern s32 func_8014FA70(s32 a0); +extern s32 D_801B958C; +extern void func_8014FA04(s32 a0); +extern s32 func_8014FBC0(); +extern s32 func_8014FC18(u8 *self); +extern int func_8014FD54(int param_1); +extern void func_8014FCFC(void); +extern void func_80150170(void *a0); +extern s32 func_8014FE60(void *a0); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_8014FE60(void *e); +extern s32 func_80134510(s32 arg); +extern s32 func_80150150(s32 a, s32 b); +extern s32 func_80150460(s32 a, s32 b); +extern void func_801504D8(u16 *a0); +extern s32 func_80150480(s32 _arg0); +extern s32 func_80150528(void *a0, void *a1, void *a2); +extern s32 func_80150528(void *arg0, void *arg1, void *arg2); +extern s32 func_801506A4(s32 a0, s32 a1); +extern s32 func_801505FC(s32 a0); +extern s32 func_801506A4(s32 arg0, s32 arg1); +extern void func_80150820(s32 a0, s32 a1); +extern void func_8015086C(int param_1); +extern s32 func_801508B4(s32 a0); +extern s32 func_8015094C(s32 a0); +extern short func_801508F8(s32 a0); +extern s32 D_80186CD4; +extern s32 D_80126990; +extern s32 D_80126994; +extern s32 func_80021174(s32 a0, s32 a1); +extern s32 func_8015094C(s32 param_1); +extern void func_80150B9C(void); +extern s32 func_80151184(s32 a0, s32 a1, s32 a2); +extern s32 func_80150BA4(s32 a0); +extern s32 func_801619D0(void *a0); +extern void func_80150BC8(s32 *a0); +extern s32 func_80150480(s32 a0); +extern u16 D_800AE6DC; +extern void func_80150C48(s32 a0); +extern int func_80151184(int arg, int a1, int a2); +extern int func_80150CA0(int arg); +extern void func_80150EC4(s32 a, s32 b); +extern void func_80150CC4(s32 a); +extern void func_80150CE4(s32 a); +extern void func_80150D04(s32 a); +extern void func_80150D24(s32 a); +extern void func_80150D44(s32 a); +extern void func_80150D64(s32 a); +extern void func_80150D84(s32 a); +extern void func_80150DA4(s32 a); +extern void func_80150DC4(s32 a); +extern void func_80150DE4(s32 a); +extern void func_80150E04(s32 a); +extern void func_80150E24(s32 a); +extern void func_80150E44(s32 a); +extern void func_80150EC4(s32 a0, s32 a1); +extern void func_80150E64(s32 a0); +extern void func_80150E84(s32 a0); +extern void func_80150EA4(s32 a0); +extern u8 D_800AE6C0; +extern s16 D_800AE6C8; +extern s16 D_800AE6CA; +extern s16 D_800AE6CC; +extern s32 D_800AE6C4; +extern s16 D_800AE6CE; +extern u8 D_800AE6BE; +extern u8 D_801201F8[]; +extern void func_80150F78(void); +extern void func_80150F80(s32 a0); +extern int func_80150FB4(int arg); +extern void func_80150FD8(s32 a0); +extern int func_80151014(int arg); +extern void func_80151038(s32 a0); +extern int func_80151070(int arg); +extern int func_80151094(int arg); +extern void func_801510B8(void); +extern void func_801510C0(void); +extern int func_801510C8(int arg); +extern int func_801510EC(int arg); +extern s32 func_8012DB84(void); +extern s32 func_80151110(void); +extern void func_80151130(void); +extern int func_80151138(int arg); +extern void func_8015115C(s32 *a0, s16 a1); +extern s32 func_80151164(s32 a0, s32 a1); +extern s32 func_80151184(s32 arg0, s32 arg1, s32 arg2); +extern void func_801511A8(u8 *a0); +extern void func_801511C4(u8 *a0); +extern int func_80151204(int arg, int a1); +extern int func_801511E0(int arg); +extern int func_80151204(int a0, int a1); +extern void func_80151238(void *a0); +extern void func_8015126C(u16 *p); +extern void func_80151780(s32 a0); +extern void func_801516F0(s32 *a0); +extern void func_8015173C(s32 *a0); +extern s16 D_8011DB1A; +extern s32 D_80127518; +extern s32 D_801151FC; +extern s32 func_801725CC(u8 *a0); +extern s32 func_80029D3C(void); +extern void func_80151878(void); +extern void func_80153B58(s32 *a0); +extern s32 func_80151880(s32 a0); +extern s32 func_801518D8(s32 a0); +extern s32 func_80151944(void); +extern s32 func_80151924(void); +extern void func_8014E934(s32 a0); +extern s32 func_8014F3E8(s32 a0); +extern void func_801519C8(s32 a0); +extern void func_80151980(s32 a0); +extern M2C_UNK D_800D5880; +extern s32 D_800D58AC; +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_801519C8(s32 arg0); +extern void func_80151C54(s32 a0); +extern void func_801542DC(s32 *a0, s32 a1); +extern void func_8015BDD0(s32 *a0); +extern void func_80165718(s32 a0); +extern u8 D_800D46E4[]; +extern void func_80151AE4(s32 arg0); +extern void (*D_80186D7C[])(void); +extern void func_80151D24(void *a0); +extern void func_80151DB0(s32 a0); +extern void func_80151D60(void *a0); +extern s32 func_80172630(u8 *a0); +extern s32 D_80062C14; +extern void func_80151DB0(s32 param_1); +extern void func_80151E78(s32 *a0); +extern void func_80151ECC(struct S80151ECC *a0); +extern void func_80151FB4(s32 a0); +extern void func_80151F38(s32 *a0); +extern void func_801553C0(s32 a0); +extern void func_80153C18(); +extern void (*D_80186DA0[])(void); +extern void func_80152058(void *a0); +extern void func_801520DC(s32 a0); +extern void func_80152094(s32 a0); +extern void func_80147324(s32 a0); +extern u8 D_80062C04[]; +extern M2C_UNK D_80186D90; +extern void func_801520DC(s32 arg0); +extern void func_801470B4(s32 a0); +extern void func_8015369C(s32 a0); +extern void func_80152194(s32 *a0); +extern s32 func_801536DC(s32 a0); +extern void func_8015220C(s32 a0); +extern s32 func_80153800(s32 a0); +extern void func_801522CC(s32 a0); +extern void func_80152254(s32 *a0); +extern void (*D_80186DB4[])(void); +extern void func_80152370(void *a0); +extern void func_801523F4(s32 a0); +extern void func_801523AC(s32 a0); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern u8 D_80186DC0[]; +extern void func_801523F4(s32 arg0); +extern void func_801525F4(int); +extern s32 func_801535F4(void *arg0); +extern void func_8015BF48(s32 *a0); +extern void func_80152500(int param_1); +extern void func_801525F4(s32 a0); +extern void (*D_80186DD0[])(void); +extern void func_80152698(void *a0); +extern void func_80152714(s32 a0); +extern void func_801526D4(s32 a0); +extern void func_80152790(s32 a0); +extern void (*D_80186DE8[])(void); +extern void func_8015282C(void *a0); +extern void func_801528B0(s32 a0); +extern void func_80152868(s32 a0); +extern M2C_UNK D_80186DD8; +extern void func_801528B0(s32 arg0); +extern void func_8015294C(s32 a0); +extern void func_80152A08(s32 a0); +extern void func_80152AC8(s32 a0); +extern void func_80152A50(s32 *a0); +extern void (*D_80186DFC[])(void); +extern void func_80152B6C(void *a0); +extern void func_80152BF0(s32 a0); +extern void func_80152BA8(s32 a0); +extern void func_80152C80(s32 *a0); +extern void func_80152C40(s32 *a0); +extern void (*D_80186E18[])(void); +extern void func_80152D24(void *a0); +extern void func_80152DA8(s32 a0); +extern void func_80152D60(s32 a0); +extern M2C_UNK D_80186E08; +extern void func_80152DA8(s32 arg0); +extern void func_80152E4C(s32 a0); +extern void func_80152EFC(s32 a0); +extern void func_80152FBC(s32 a0); +extern void func_80152F44(s32 *a0); +extern void (*D_80186E2C[])(void); +extern void func_80153060(void *a0); +extern void func_801530E4(s32 a0); +extern void func_8015309C(s32 a0); +extern void func_80155440(s32 *a0); +extern void func_801530E4(s32 arg0); +extern void func_80153150(struct S80153150 *a0); +extern void func_801531BC(s32 a0); +extern void func_8015327C(s32 a0); +extern void func_80153204(s32 *a0); +extern void (*D_80186E40[])(void); +extern void func_80153320(void *a0); +extern void func_801533A4(s32 a0); +extern void func_8015335C(s32 a0); +extern void func_80153410(s32 *a0); +extern void func_80153490(s32 a0); +extern void func_80153550(s32 a0); +extern void func_801534D8(s32 *a0); +extern void (*D_8011DB28)(s32 a0); +extern s32 func_801536DC(s32 param_1); +extern void func_800139C8(s32 a0, void *a1, void *a2); +extern s32 func_80153978(s32 a0, u16 *src); +extern s32 func_80133784(s32 a0, void *src, s32 dst); +extern s32 func_801539F8(s32 a0, void *a1); +extern s32 func_801539F8(s32 a0, void * a1); +extern s32 func_8016DA04(s32 a0); +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); +extern void func_80153C18(void); +extern u16 D_8011F748; +extern void func_80153C30(void); +extern void func_80153C74(s16 a0, s16 a1); +extern s16 D_8011DB18; +extern void func_80153C44(int a0, int a1, s16 a2); +extern s16 D_8011DB0C; +extern s32 D_80115210; +extern void func_80153C8C(void); +extern void func_80153C9C(void); +extern s32 func_80153CBC(void); +extern s32 D_80186E54; +extern void (*D_80186E7C[])(void *a0); +extern void func_80153CCC(S80153CCC *a0); +extern void func_80153D7C(s32 a0); +extern void func_80153D34(s32 a0); +extern u8 D_80186E5C; +extern void func_80153D7C(s32 param_1); +extern void func_8015410C(void); +extern void func_80153E00(s32 param_1); +extern void func_80151664(void); +extern void func_80154134(u8 *a0); +extern void func_80154190(u8 *a0, s32 a1); +extern void func_80154150(s32 a0, s32 a1); +extern void func_80154218(u8 *a0, s32 a1, s32 a2); +extern void func_801541D8(u8 *a0, s32 a1, s32 a2); +extern s32 func_801549F8(s32 a0, s32 a1, s32 a2); +extern void func_801542A4(); +extern void func_801542A4(s32 *a0, s32 a1); +extern void func_8015430C(); +extern void func_8015430C(u8 *arg0, s32 arg1, s32 arg2); +extern void func_8015444C(void *a0, s32 *a1, s32 *a2, s32 *a3); +extern s32 func_80154358(void * arg0); +extern void func_80154AB4(s32 a0, s32 a1); +extern void func_80154B20(s32 a0, s32 a1, s32 a2); +extern void func_80154AE0(s32 a0, s32 a1, s32 a2); +extern void func_80154B7C(u8 *a0, s32 a1); +extern void func_80154B4C(u8 *a0, s32 a1); +extern void func_80154BC8(void *a0, s32 a1, s32 a2); +extern void func_80154B98(void *a0, s32 a1, s32 a2); +extern u8 D_800D8D10[]; +extern s16 D_80078E9E; +extern void func_801550FC(s32 a0); +extern void func_80154ED8(s32 a0, s32 a1); +extern void func_80154F9C(s32 a0); +extern void func_800183E0(s32 a0); +extern void func_801550FC(s32 arg0); +extern void func_8001D150(s32, s32); +extern void func_8001D130(int, int); +extern void func_80155150(int param_1); +extern s32 D_800DE2A4[]; +extern void func_801552F4(s32 a0); +extern void func_80155344(s32 a0); +extern s32 func_80155394(s32 *a0); +extern void func_801553A8(s32 *a0); +extern s32 func_80029178(s32); +extern int (*D_80186EC8[])(void); +extern s32 func_80155458(s32 param_1); +extern s32 func_801659DC(u8 *a0); +extern s32 func_801554B8(void *arg0); +extern void func_801555F4(void *a0); +extern void func_80155518(s32 *a0); +extern void func_80155580(void *a0); +extern void (*D_80186ECC[])(void); +extern s32 func_80161104(void); +extern void func_801555F4(void *); +extern void func_801555BC(void *a0); +extern int func_80155A44(int param_1); +extern int func_80161208(); +extern u8 D_800D4DA8[]; +extern void func_80155B20(s32 *a0); +extern s32 D_800D4DB4; +extern void func_80155B9C(s32 a0); +extern u8 D_800D4DD4[]; +extern void func_80155C0C(s32 *a0); +extern void func_8014ED28(s32 a0); +extern int func_80155FF8(int arg, int a1); +extern s32 D_800D4DF4; +extern void func_80155C64(s32 a0); +extern void func_8015E880(s32 *a0); +extern void func_80155D70(s32 param_1); +extern void func_80155E30(void *a0); +extern s32 func_80161208(); +extern void func_80155EA4(void *arg0); +extern void func_80155F58(void); +extern s32 func_80155F80(); +extern s32 func_80155F60(void); +extern s32 func_80155F80(s32 a0); +extern int func_80155FB0(int arg, int a1); +extern int func_80155FD4(int arg, int a1); +extern int func_80156044(int arg, int a1); +extern s32 func_80029B4C(s32 a0, s32 a1); +extern s32 func_80029BC8(s32 a0, s32 a1); +extern s32 func_80029C44(s32 a0, s32 a1); +extern s32 func_8015640C(s32 a0, s32 a1); +extern s32 rand(void); +extern u32 func_8015616C(s32 param_1, u16 param_2); +extern u16 func_80156370(u16 param_1); +extern s32 func_801564B0(s32 a0); +extern s32 func_8002A1B4(void); +extern s32 func_8002A400(void); +extern s32 func_8002A670(void); +extern s32 func_8002A8E0(void); +extern s32 D_801151E0[]; +extern s32 func_801565C0(void); +extern void func_80156A14(s32 *a0); +extern void func_80156648(s32 *a0); +extern u8 D_8011DAD8[]; +extern s32 func_8014C568(void *a0); +extern void func_801567BC(s32 a0); +extern u8 D_80126730[]; +extern void func_80156848(s32 param_1, s32 param_2); +extern unsigned char D_8011520C[]; +extern unsigned short D_80187330[]; +extern void func_80156A1C(s32 param_1, s32 param_2); +extern s32 D_801150E0[]; +extern void func_80156A88(s32 a0, s32 a1); +extern void func_80156B74(s32 param_1, u32 param_2, u8 *param_3); +extern void func_80156ECC(int param_1, int param_2, int param_3, int param_4, int param_5); +extern void func_80156FA8(s16 *param_1, s16 *param_2, s16 *param_3); +extern void func_80157158(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern s32 func_80135004(s32 a0, void *a1, s32 a2); +extern u32 func_801571C4(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801575E4(void *a0); +extern void func_801574DC(s32 *a0); +extern void func_80157544(void *a0); +extern void (*D_80187340[])(void); +extern void func_8014CC28(s32 a0); /* defined */ +extern s32 func_8014F3E8(s32 a0); /* declared */ +extern void func_8015BDD0(s32 *a0); /* defined */ +extern void func_801575E4(void *a0); /* defined */ +extern void func_80157580(s32 arg0); +extern u8 D_800D4F14[]; +extern void func_801576A8(void *arg0); +extern s32 func_8015773C(u8 *a0); +extern s32 func_8015771C(u8 *a0); +extern s32 func_8015773C(u8 * arg0); +extern int D_801B95C0; +extern void func_801578C0(s32 a0); +extern void func_80157788(int param_1); +extern void func_801577C8(s32 arg0); +extern void (*D_80187368[])(void); +extern void func_80157808(void *param_1); +extern void func_80157880(s32 a0); +extern s32 func_801725A4(u8 *a0); +extern u8 D_800D5128; +extern u8 D_80187348; +extern void func_801578C0(s32 param_1); +extern void func_80147A84(int); +extern void func_80148038(int, int); +extern void func_80147460(int); +extern void func_80146D90(int); +extern void func_80161450(void *a0); +extern void func_80157A8C(int); +extern void func_80154A74(int, int); +extern unsigned char D_800D5178; +extern unsigned char D_80187358; +extern void func_8015795C(int param_1); +extern void func_80161D20(s32 a0, s32 a1); +extern void func_80157A8C(s32 a0); +extern void func_8016706C(s32 a0); +extern u8 D_800D51AC[]; +extern void func_80157AC8(s32 param_1); +extern void func_80157B74(int param_1); +extern void func_8016158C(void *a0); +extern void func_8015BE04(s32 *a0); +extern void func_80157BC8(s32 a0); +extern void func_80157CCC(s32 a0); +extern void func_80157DC4(void *a0); +extern void func_80157FC4(void *a0); +extern void func_80157D74(u16 *a0); +extern void (*D_801873A8[])(void); +extern void func_80157E38(void *); +extern void func_80157E00(void *a0); +extern void func_80157E38(void * a0); +extern s32 func_80157F64(s32 *a0); +extern s32 func_80156600(void *a0); +extern void func_80157EA4(void *a0); +extern void (*D_801873B0[])(void); +extern void func_80158038(void *); +extern void func_80158000(void *a0); +extern s32 D_800D51E0; +extern s32 D_8018737C; +extern void func_80158038(void * param); +extern u8 D_800D524C[]; +extern void func_80161418(void *a0); +extern void func_801580B4(s32 a0); +extern void func_801581AC(s32 a0); +extern void (*D_801873BC[])(void); +extern void func_8015824C(void *a0); +extern void func_801582C0(void *); +extern void func_80158288(void *a0); +extern u8 D_800D52A8[]; +extern void func_801585A4(s32 *a0); +extern void func_801582C0(void *a0); +extern s32 func_801585AC(s32 *a0); +extern u8 D_800D52E8[]; +extern void func_80158344(s32 *a0); +extern s32 func_801615C4(void *a0, s32 a1); +extern u8 D_8018738C; +extern u8 D_800D533C; +extern void func_80158434(s32 param_1); +extern void func_80158548(s32 param_1); +extern void func_801585EC(u8 *a0); +extern void func_80158794(void); +extern s32 D_801B95C8; +extern s32 D_801B95D4; +extern s32 D_801B95D8; +extern void func_80158880(s32 *param); +extern void func_8015879C(s32 param_1); +extern void func_80158814(void *arg0); +extern void (*D_801873F8[])(s32 *); +extern void func_80158AE4(void *a0); +extern void func_80158AB4(void *a0); +extern void func_8016F264(void); +extern void func_80165840(void); +extern void func_801658DC(void); +extern void func_80165A78(s32); +extern void func_80158AE4(void * a0); +extern M2C_UNK D_800D58D8; +extern void func_80158BB0(void *arg0); +extern s32 func_80159404(s32 a0, s32 a1); +extern void func_80158C40(s32 *a0); +extern void func_80158CD8(s32 *a0); +extern s32 func_80159434(s32 a0, s32 a1); +extern void func_80158D60(s32 a0); +extern M2C_UNK D_800D5904; +extern void func_80158E24(s32 *a0); +extern s32 D_801873CC[]; +extern int rand(void); +extern s32 func_8013767C(s32 a0); +extern void func_80158F00(int param_1); +extern u8 D_80110C3C[]; +extern s32 func_801399F0(s32); +extern void func_80139914(s32); +extern s32 func_80159464(void); +extern void func_801594E8(s32, s32); +extern void func_80158FA4(s32 param_1); +extern s32 func_801399F0(s32 a0); +extern u8 D_80110C94[]; +extern u8 D_80110CD4[]; +extern void func_80159070(void *a0); +extern s32 func_80029A94(s32); +extern void func_80175454(void); +extern void func_800298BC(void *); +extern void func_8002992C(s32); +extern void func_800CF804(void); +extern void func_800CF818(void); +extern u8 D_80110D0C[]; +extern void func_80159120(s32 a0); +extern void func_801592CC(s32 *a0); +extern u8 D_800AE6BD; +extern s32 D_801B95D0; +extern void func_8015934C(void *arg0); +extern void func_801593E4(A801593E4 *a0); +extern void (*D_80187648[])(void); +extern void func_80159698(void *a0); +extern s32 func_801596D4(void *a0); +extern void func_80174B6C(void); +extern void func_80129248(s16 a0); +extern void func_8013C938(void); +extern void func_8013CB20(void); +extern void func_8013C98C(void); +extern void func_8002850C(s32, s32, s32); +extern void func_80028620(s32, void *); +extern s16 D_800B9AAC[]; +extern s16 D_800B9B00; +extern u16 D_801270C0; +extern u32 D_800AFAE8[]; +extern char D_80187468[]; +extern s32 func_801596F0(s32 param_1); +extern s32 func_80159874(void); +extern void func_800167B8(s32 a0); +extern s32 func_8015987C(s32 a0); +extern int func_800167F0(int arg); +extern int func_801598BC(void); +extern void func_80159968(void *a0); +extern void func_801598E0(u8 *a0); +extern void (*D_801876EC[])(void); +extern void func_80159A20(void *a0); +extern void func_801599E0(void *a0); +extern void func_80159A18(void); +extern void func_80159BE4(s32); +extern void func_80159B08(s32 *a0); +extern void func_80159B70(void *a0); +extern void func_80159B3C(void * a0); +extern void (*D_80187840[])(void); +extern void func_80159BAC(s32 a0); +extern s32 func_80172590(u8 *a0); +extern unsigned char D_8018765C; +extern void func_80159BE4(s32 arg0); +extern void func_8015A1C8(s32 a0); +extern void func_8015A2D8(s32); +extern void func_8015A1FC(s32 *a0); +extern void func_8015A264(void *a0); +extern void func_8015A230(s32 *a0); +extern void (*D_80187848[])(void); +extern void func_8015A2A0(s32 a0); +extern int D_8018766C; +extern s32 func_80172608(u8 *a0); +extern void func_8015A2D8(s32 param_1); +extern u8 D_800D48DC; +extern s32 func_8015AB7C(s32 a0); +extern s32 D_8011F9C4; +extern s32 func_8015ABD4(s32 a0, s32 a1, s32 a2); +extern s32 func_80161CD0(s32 a0, s32 a1); +extern M2C_UNK D_8018768C; +extern void func_8015AC48(s32 arg0); +extern void func_8015AC90(s32 a0); +extern void func_8015ADB0(s32 a0); +extern void func_8015ACC4(s32 *arg0); +extern void func_8015AD3C(void *a0); +extern void func_8015AD08(void *arg0); +extern void (*D_80187850[])(void); +extern void func_8015ADB0(s32); +extern void func_8015AD78(s32 a0); +extern void func_8015ADB0(s32 arg0); +extern s32 D_800D4A9C; +extern int func_8015B6F4(int param_1); +extern u8 D_800D4F8C[]; +extern s32 func_8015B7B4(s32 a0); +extern u8 D_800D4BE0[]; +extern s32 func_8014A51C(void); +extern s32 func_8015B858(u8 *a0); +extern s32 D_800D4B48; +extern void func_8015B8F8(s32 *a0); +extern void func_8015BD8C(s32 *a0); +extern s32 func_8015BE94(); +extern void func_8015BE38(struct Obj *a0); +extern s32 func_8015BE74(void); +extern void func_80161124(void *a0); +extern s32 func_8015BE94(s32 *a0); +extern s32 func_8015AE2C(); +extern s32 func_8015BEC4(void); +extern s32 func_8015B950(s32 arg0); +extern s32 func_8015BEE4(void); +extern void func_8015BF04(s32 *a0); +extern void func_8015C0C4(s32 a0); +extern void func_8015BFF4(void *a0); +extern void func_8015BF7C(s32 *a0); +extern void func_8015C030(s32 *a0, s32 a1); +extern void func_8015BFB0(s32 *a0, s32 a1); +extern void (*D_80187878[])(void); +extern void func_8015C0C4(s32); +extern void func_8015C08C(s32 a0); +extern s32 func_8015C128(s32 param_1); +extern void func_8015C6A4(void); +extern void func_8015C788(s32 a0); +extern void func_8015C6AC(s32 *a0); +extern void func_8015C714(void *a0); +extern void func_8015C6E0(s32 *a0); +extern void (*D_80187884[])(void); +extern void func_8015C788(s32); +extern void func_8015C750(s32 a0); +extern void func_8015CB94(s32 a0); +extern void func_8015CBCC(void); +extern void func_8015CBD4(void); +extern void func_8015CBDC(void); +extern void func_8015CBE4(void); +extern void func_8015CBEC(void); +extern void func_8015CBF4(void); +extern void func_8015CBFC(void); +extern void func_8015CC04(void); +extern void func_8015CC0C(s32 *param_1); +extern void func_8015CC74(s32 *a0); +extern void func_8015CC40(s32 *a0); +extern s32 func_8015CCD0(); +extern s32 func_8015CCB0(void); +extern s32 func_801725E0(u8 *a0); +extern s32 func_8015CCD0(s32 param_1); +extern s32 func_8015CD20(s32 arg0); +extern void func_8015CF24(s32 a0); +extern void func_8015D01C(); +extern void func_8015CF58(s32 *param_1); +extern void func_8015CFC0(s32 *a0); +extern void func_8015CF8C(s32 *a0); +extern void func_8015CFFC(void); +extern void func_8015D01C(int param_1); +extern void (*D_801876F8[])(void *); +extern s32 func_801725F4(u8 *a0); +extern void func_8015D104(void *arg0); +extern s32 D_80187928; +extern void func_8015D380(s32 a0); +extern unsigned char D_80186A0C[]; +extern void func_8015D414(int param_1); +extern void func_8015D57C(s32); +extern void func_8015D480(s32 *a0); +extern s32 func_8015D4E8(s16 *a0); +extern void func_8015D4B4(s16 *a0); +extern void func_8015D524(s32 arg0); +extern void func_8015D544(s32 a0); +extern void func_801746DC(void); +extern void func_8015D57C(s32 arg0); +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern void func_80154150(int, int); +extern void func_80149374(int, int); +extern unsigned char D_8018793C[]; +extern void func_8015D5E8(int param_1); +extern int func_8015E0D4(int); +extern void func_8015DA5C(s32 a0); +extern void func_8015DB6C(s32 a0); +extern void func_8015DA90(s32 *a0); +extern void func_8015DAF8(s32 *a0); +extern void func_8015DB6C(s32); +extern void func_8015DB34(s32 a0); +extern void func_8015DCB8(s32 a0); +extern void func_8014BD60(s32 a0, s32 a1); +extern int func_8015DD74(int); +extern void func_8015DBD4(void *arg0); +extern int func_8015DC84(int a0); +extern s8 D_80187978[]; +extern void func_8015DCB8(s32 param_1); +extern int func_8015DD74(int arg0); +extern void func_8015DECC(s32 a0); +extern void func_8015DDF0(s32 *a0); +extern void func_8015DE58(s32 *a0); +extern void func_8015DECC(s32); +extern void func_8015DE94(s32 a0); +extern void func_8015E018(s32 a0); +extern void func_8015DF34(void *arg0); +extern int func_8015DFE4(int a0); +extern void func_8015E018(s32 param_1); +extern int func_8015E0D4(int a0); +extern void func_8015E22C(s32 a0); +extern void func_8015E150(s32 *a0); +extern s32 func_8015E1B8(s32 a0); +extern void func_8015E184(s32 *arg0); +extern void func_8015E22C(s32); +extern void func_8015E1F4(s32 a0); +extern u8 D_800D4FF4[]; +extern u8 D_800D5098[]; +extern u8 D_800D5060[]; +extern s32 func_8014A850(s32 a0); +extern void func_8015E40C(s32 a0); +extern void func_8015E588(void); +extern void func_8015E4B0(s32 a0); +extern void func_8015E288(s32 a0); +extern u16 D_801879C0; +extern u16 D_801879C2; +extern u16 D_801879C4; +extern s32 D_801879C8; +extern void func_80013E94(void *a0, void *a1); +extern void func_8015E4B0(s32 param_1); +extern void func_8013C9C4(void *a0); +extern s32 D_801879D0; +extern void func_8015E5B0(u8 *self); +extern void func_8015E714(s32 *a0); +extern void func_8015E95C(s32); +extern void func_8015E84C(s32 *a0); +extern void func_8015E8E8(s32 *a0); +extern void func_8015E9B8(s32 *a0); +extern void func_8015E8B4(s32 *a0); +extern void func_8015E924(s32 a0); +extern void func_8015E95C(s32 a0); +extern s16 D_801152A0; +extern void func_80160818(s32 *a0); +extern void func_8015ED6C(s32 *a0); +extern void func_8015EE7C(s32); +extern void func_8015EDA0(s32 *a0); +extern s32 func_8015EE08(s32 a0); +extern void func_8015EDD4(s32 *arg0); +extern void func_8015EE44(s32 a0); +extern int D_800D4C48; +extern int D_801876DC; +extern void func_8015EE7C(s32 param_1); +extern void func_8015EEE0(void *arg0); +extern void func_8015EF9C(void); +extern void func_8015F080(s32); +extern void func_8015EFA4(s32 *a0); +extern void func_8015F00C(s32 *a0); +extern void func_8015EFD8(s32 *a0); +extern void func_8015F048(s32 a0); +extern void func_8015F080(s32 a0); +extern s32 D_80062BE8; +extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); +extern s32 func_80161208(void); +extern void func_8015F118(void *a0); +extern void func_8015F260(s32 *a0); +extern void func_8015F380(); +extern void func_8015F2BC(s32 *a0); +extern void func_8015F324(s32 *a0); +extern void func_8015F2F0(s32 *a0); +extern void func_8015F360(void); +extern s32 func_801725B8(u8 *a0); +extern void func_8015F380(void* arg0); +extern void func_8015F738(s32 *a0); +extern void func_8015F848(s32 *a0); +extern void func_8015F76C(s32 *a0); +extern s32 func_8015F7D4(s32 a0); +extern void func_8015F7A0(s32 *arg0); +extern void func_8015F810(s32 *a0); +extern void func_80147078(s32 *, s16); +extern void func_80159B70(void *); +extern void func_8015F89C(void *arg0); +extern void func_8015F948(s32 *param_1); +extern void func_8015F9A4(void *arg0); +extern void func_8015FA24(s32 arg0); +extern void func_8015FBE0(s32 *a0); +extern void func_8015FA44(s32 *a0); +extern void func_8015FAAC(s32 *a0); +extern void func_8015FA78(s32 *a0); +extern s32 func_801612B8(void *a0, s32 a1); +extern void func_8016007C(s32 a0); +extern void func_8015FAE8(void *arg0); +extern void func_8015FCC8(void *param_1); +extern unsigned int D_80187A54[]; +extern void func_8015FD74(int param_1); +extern s32 func_80028DE0(void); +extern u8 func_80165700(s32 a0, s32 a1); +extern void func_8015FDCC(s32 a0); +extern u8 D_80078EC2; +extern u8 func_801656E8(s32 a0, s32 a1); +extern void func_80165670(s32 a0, s32 a1); +extern void func_8016004C(s32 a0); +extern void func_8015FF20(void *param_1); +extern void func_801601AC(s32 *a0); +extern void func_801600D0(s32 *a0); +extern void func_80160138(s32 *a0); +extern void func_80160104(s32 *a0); +extern void func_80160174(s32 *a0); +extern void func_801601E4(s32 *a0); +extern void func_80160244(s32 *a0); +extern void func_8016032C(void); +extern void func_80160410(s32 *a0); +extern void func_80160334(s32 *a0); +extern void func_8016039C(s32 *a0); +extern void func_80160368(s32 *a0); +extern void func_801603D8(s32 *a0); +extern u8 D_80062BD0; +extern void func_80160410(s32 * a0); +extern void func_801607B8(s32 *a0); +extern void func_801608C0(s32 *a0); +extern void func_801607E4(s32 *a0); +extern void func_8016084C(s32 *a0); +extern void func_80160888(s32 *a0); +extern void func_80160A28(s32 a0); +extern void func_80160A74(s32 *a0); +extern void func_80160BB4(s32 *a0); +extern void func_80160ACC(s32 *a0); +extern s32 func_80160B34(s32 a0); +extern void func_80160B00(s32 *arg0); +extern void func_80160B70(s32 a0); +extern void func_80160C28(void *arg0); +extern void func_80160CB4(s32 *a0); +extern void func_80160D10(void *arg0); +extern void func_80160DEC(u8 *a0); +extern void func_80160F00(); +extern void func_80160E3C(s32 *a0); +extern void func_80160EA4(); +extern void func_80160E70(s32 *a0); +extern void (*D_80187B04[])(void); +extern void func_80160EA4(void *a0); +extern void func_80160EE0(void); +extern void func_80160F00(void* arg0); +extern void func_800D0F4C(s32 a0); +extern u8 D_80110EC0; +extern void func_80160F70(s32 a0); +extern void func_80160FE0(s32 *a0); +extern void func_80161034(void *a0); +extern void func_80161094(s32 a0); +extern void func_801610FC(void); +extern void func_801483E8(void); +extern s32 func_80161A60(s32 a0); +extern void func_8016130C(void *a0, s32 a1); +extern void func_80161240(void *a0); +extern void func_80161374(void *a0, s32 a1); +extern void func_80161278(void *a0); +extern s32 func_801612B8(void * a0, s32 a1); +extern void func_8016163C(void *a0, s32 a1); +extern void func_80161774(void *a0, s32 a1); +extern s32 func_8016197C(s32 a0, s32 a1); +extern s32 func_80161488(void *a0); +extern void func_80161888(void *a0, s32 a1); +extern void func_801614E4(void *a0); +extern void func_8016191C(void *a0, s32 a1); +extern void func_8016151C(void *a0); +extern void func_80161554(void *a0); +extern s32 func_801615C4(void * arg0, s32 arg1); +extern s32 func_801619A4(s32 *a0); +extern s32 func_80161A00(s32 a0); +extern s32 func_80161A30(s32 a0); +extern int func_801497A8(void); +extern int func_80161BE0(void *param_1); +extern u16 D_80187B34[]; +extern void func_80161C98(int param_1, u32 param_2); +extern void func_80161E08(s32); +extern s32 func_80162438(s32); +extern s32 D_800AE6A8; +extern void func_800D1734(void *); +extern s32 D_80187B98; +extern void func_80161D88(void); +extern void func_80161E08(s32 param_1); +extern int func_800291DC(int); +extern int func_800D0E30(void *a0); +extern int func_801620C4(void); +extern s32 func_800D0D7C(s32, s32); +extern int D_801B95E0[]; +extern void func_8016216C(void); +extern u8 D_80078EB0; +extern u8 D_80078EB1; +extern s32 func_801621CC(s32 arg0); +extern void func_801622C4(void); +extern void (*D_80187BBC[])(void); +extern void func_80162330(void *a0); +extern void func_8014706C(void *a0); +extern s32 func_8016236C(u8 *a0); +extern void func_800D0C48(s32 a0); +extern s32 func_801623B8(s32 *a0); +extern s32 func_800167F0(s32 a0); +extern s32 func_80162414(void); +extern s32 func_80162438(s32 _unused0); +extern int func_801626B8(void); +extern void func_80162714(void); +extern int D_801B9638[]; +extern void func_80162760(void); +extern void func_801627C0(void); +extern void (*D_80187C04[])(void); +extern void func_80162834(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80162968(s32 a0); +extern s32 func_80162ACC(u8 *a0); +extern u8 D_800B5CB8; +extern s32 D_80187BF4; +extern s32 D_800B5CBC; +extern u8 D_800B5CDF; +extern s32 D_800B5CEC; +extern void func_80162870(s32 param_1); +extern void func_801628F4(s32 *a0); +extern void func_80162968(s32 param_1); +extern void func_80162AC0(s32 *a0, s8 a1); +extern s32 func_80162AE0(u8 *a0); +extern void func_80162AF4(void); +extern void func_80162CC4(void); +extern s32 D_80126D40; +extern void func_80162B1C(void); +extern void func_80162D28(s32 *a0); +extern void func_80162D88(s32 *a0); +extern void func_80162DE8(s32 *a0); +extern void func_80162E48(s32 *a0); +extern void func_80162EA8(s32 *a0); +extern void func_80162F60(s32 arg0, s32 arg1); +extern void func_80162F80(s32 arg0, s32 arg1); +extern void func_80162FA0(s32 arg0, s32 arg1); +extern void func_80162F08(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80162FC0(s32 *a0); +extern void func_80162FF4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801630C4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163194(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg4); +extern void func_8016325C(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163234(s32 a0); +extern s32 D_80115100; +extern s32 func_801632E0(void); +extern s32 D_80115200; +extern s32 func_801632F0(void); +extern u16 D_80126B18[]; +extern void func_80163328(void); +extern s32 func_801633A8(void); +extern s32 func_80163408(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void func_80163534(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, u16 * a5); +extern void func_8016345C(s32 a0, u16 a1, s32 a2, u16 a3, s32 a4); +extern char D_801B8D88[8]; +extern void *memcpy(void *dst, const void *src, unsigned int n); +extern void func_801634D8(s32 param_1, u16 param_2, u16 param_3, s32 param_4, u16 param_5); +extern void func_80157158(); +extern void func_80163664(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801636D0(s32 a0, s32 a1); +extern s32 func_8016380C(struct S8016380C *a0, s32 a1); +extern void *memcpy(void *dst, void *src, s32 n); +extern s32 func_801638A0(u8 *a0, s32 a1); +extern s32 func_80163950(s32 a0); +extern void (*D_80187C0C[])(void); +extern void func_80163A58(void *a0); +extern void func_80163A94(s32 param_1); +extern void func_80163C2C(s32 param_1); +extern void func_80163EC8(s32 param_1); +extern void func_80164270(s32 *a0); +extern void func_80164418(void); +extern void func_80163764(s32 a0); +extern void func_801642AC(s32 a0); +extern void func_8016432C(s32 a0); +extern void func_80164410(void); +extern s32 func_80012DBC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164530(s32 arg0); +extern void (*D_80187C60[])(void); +extern void func_80164744(s32 param_1); +extern void func_8001C810(s32 a0, s32 a1); +extern void func_80164A74(s32 *a0); +extern void func_80164930(s32 a); +extern u16 D_800DF2E0; +extern s32 D_80187C28; +extern s16 D_80187C5C; +extern s16 D_80187C5A; +extern s16 D_80187C58; +extern void func_801647A4(int param_1); +extern void func_80164ACC(); +extern void func_80164864(void *a0); +extern void func_80164930(s32 param_1); +extern s32 func_8014C308(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164ACC(s32 a0); +extern void (*D_80187C6C[])(void); +extern void func_80164BA0(void *a0); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80164DD0(s32 a0); +extern void func_80164DB0(void); +extern u8 D_801B9698; +extern u8 D_801B9699; +extern u8 D_801B969A; +extern u8 D_801B969B; +extern u8 D_801B969C; +extern u8 D_801B969D; +extern u8 D_801B969E; +extern u8 D_801B969F; +extern void func_80164BDC(s32 param_1); +extern void func_80164E40(void); +extern void func_80164CD4(u8 *a0); +extern void func_80164D4C(void *arg0); +extern void (*D_80187C7C[])(void); +extern void func_80164EA4(void *a0); +extern void func_80165124(void *a0); +extern void func_80164EE0(int param_1); +extern s32 func_80165140(s32 a0); +extern void func_801651B8(void *a0); +extern void func_80164F44(void *arg0); +extern void func_80165024(void *a0); +extern void func_80165064(s32 *a0); +extern void func_801650C4(s32 *a0); +extern s32 func_80165140(s32 param_1); +extern s32 func_80165240(s32 a0, s32 a1, s32 a2); +extern s32 D_801B96D8; +extern void func_801651B8(void * param_1); +extern u8 D_80126CF8; +extern void func_8016533C(void); +extern void func_801653F4(s32 a0); +extern void func_80165580(s32 a0); +extern void func_80165374(s32 a0); +extern void func_80165580(s32 _arg0); +extern void func_801653B8(s32 *a0); +extern s32 func_80165624(s32 a0); +extern u8 D_80078EC5; +extern void (*D_80187CC0[])(void); +extern u8 func_80165658(s32 a0, s32 a1); +extern void func_800CAE0C(s32 a0); +extern void func_801654A8(s32 arg0); +extern void func_80165B28(void *a0); +extern void func_801655E4(s32 a0); +extern u8 D_80187D3C[]; +extern s32 D_80187D5C[]; +extern u8 D_80187DD8[]; +extern u8 func_801656D0(s32 a0, s32 a1); +extern u8 D_80187DF8[]; +extern u8 D_80187E18[]; +extern void func_800CAF6C(void); +extern void func_80165770(void); +extern void func_801657D8(void); +extern u8 D_80078EC3; +extern void func_801657A0(void); +extern s32 D_80078EA0; +extern s32 D_80078EA8; +extern u8 D_80078EBB; +extern s32 D_80078ED4; +extern s32 D_80078ED8; +extern s32 D_80078EDC; +extern u8 D_80078EE0; +extern void func_80165874(void); +extern s8 D_80078EC4; +extern void func_801658EC(void); +extern s32 func_80165900(void); +extern s32 func_80165910(void); +extern s32 D_8012672C; +extern s32 D_8012811C; +extern s32 D_80126B08; +extern void func_80165938(void); +extern void func_80165958(void); +extern s32 func_80165978(void); +extern void func_80165988(void); +extern s32 func_801659A8(void); +extern void func_801659B8(void); +extern s32 func_801659CC(void); +extern void func_80165A18(void); +extern s32 func_80165A50(s32 _arg0); +extern void func_80165AC8(void); +extern void func_80165A78(s32 arg0); +extern void (*D_80187EB4[])(void); +extern void func_80165B08(void); +extern void func_80165B10(void); +extern void func_80165B18(void); +extern void func_80165B20(void); +extern void (*D_80187F30[])(void); +extern void func_80165BB4(u8 *a0); +extern void func_80165B6C(u8 *a0); +extern void func_80165C58(s32 arg0); +extern void func_80165BFC(void *a0); +extern void func_80165C78(void); +extern M2C_UNK D_801B8D98; +extern void func_80165E2C(u16 *arg0); +extern s32 func_80165FA4(s32 a0, s32 a1, s32 a2); +extern s32 func_80167DBC(s32 a0, s32 a1, s32 a2); +extern s32 func_80167AE0(s32 a0, s32 a1, s32 a2); +extern void func_80165E90(void); +extern void func_80020F34(s32 a0, s32 a1); +extern s32 func_80165FA4(s32 arg0, s32 arg1, s32 arg2); +extern void (*D_80187F3C[])(void); +extern void func_80166018(void *a0); +extern void func_80166054(s32 arg0); +extern void func_801661CC(s32 param_1); +extern void func_80166244(void* arg0); +extern void func_8016629C(void *a0); +extern void func_801662F4(void *a0); +extern void func_8016634C(void *a0); +extern void func_801663A4(void *a0); +extern void (*D_80187F44[])(void); +extern void func_801663FC(void *a0); +extern s32 func_800D21C4(s32 a0, void *a1, s32 a2); +extern void func_800D1FC8(s32 a0, s32 a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_801665B4(); +extern void func_80146C3C(); +extern void func_80166438(u8 *a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_800D22E4(s32 a0); +extern void func_801665B4(s32 *a0); +extern void (*D_8018800C[])(void); +extern void func_80166618(void *a0); +extern void (*D_8018801C[])(void); +extern void func_80166654(void *a0); +extern s32 func_80166690(s32 param_1, s32 param_2); +extern s32 func_80166994(); +extern s32 func_80166F58(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern s32 func_80167540(s32 arg0); +extern void (*D_8018802C[])(void); +extern void func_801678B4(void *a0); +extern void RotMatrixYXZ(void *a0, void *a1); +extern void func_80048EAC(void *a0, void *a1); +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80146C3C(void); +extern void func_801678F0(s32 a0); +extern void (*D_80188038[])(void); +extern void func_80167A9C(void *a0); +extern void func_80167AD8(void); +extern s32 func_80167AE0(s32 param_1, s32 param_2, s32 param_3); +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u8 D_80187F98[]; +extern u8 D_80187FAC[]; +extern s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2); +extern void func_800D20C0(void *a0, void *a1, s32 a2); +extern void func_80017E68(void *a0, void *a1); +extern void func_800D23D0(void *a0); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern s32 D_801269A4; +extern s32 D_801269A8; +extern s32 D_801269AC; +extern void func_80168070(s32 param_1, s16 *param_2, s16 *param_3, void *param_4); +extern s32 func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8016829C(s32 a0); +extern s32 func_80166690(s32 a0, s32 a1); +extern void func_80168328(s32 arg0); +extern void func_801683D8(s32 a0); +extern void func_801684B4(s32 a0); +extern void func_80168540(s32 a0); +extern void func_801685EC(s32 a0); +extern void func_80168640(s32 a0); +extern s32 RotMatrixX(s32 a0, void *a1); +extern void func_80168664(void *arg0); +extern void (*D_80188050[])(void); +extern void func_80168744(void *a0); +extern void func_80168BDC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801687CC(s32 a0); +extern void func_80168780(s32 a0); +extern void func_80168828(void); +extern void func_801687CC(s32 param_1); +extern void func_80168828(); +extern void (*D_80188058[])(void); +extern void func_801689D8(void *a0); +extern void func_80168A14(s32 *a0); +extern void func_80168A88(void); +extern void (*D_80188060[])(void); +extern void func_80168AA8(void *a0); +extern void func_80168AE4(s32 a0); +extern void func_800D2318(void); +extern void func_80168BDC(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void (*D_80188068[])(void); +extern void func_80168D58(void *a0); +extern void func_80168D94(int a0); +extern void func_80168F40(); +extern void func_80168EC4(s32 a0); +extern void func_80168F40(void *arg0); +extern void (*D_80188070[])(void); +extern void func_8016901C(void *a0); +extern void func_80169058(s32 a0); +extern s32 func_80169228(void); +extern void func_801691B8(void *a0); +extern void (*D_80188078[])(void); +extern void func_801693CC(void *a0); +extern void func_80169584(s32 param_1); +extern void func_80169408(s32 a0); +extern void func_8016951C(int param_1); +extern s32 func_80017758(void *a0, void *a1); +extern s32 func_80017DC4(void *a0, void *a1); +extern void func_801696D8(s32 a0, s32 a1); +extern void (*D_80188080[])(void); +extern void func_80169830(void *a0); +extern void func_8016986C(s32 a0); +extern s32 func_80169A4C(s32 a0, s32 a1); +extern void func_801699D0(void *arg0); +extern void (*D_80188134[])(void); +extern void func_80169B80(void *a0); +extern void func_80169E44(s32 a0); +extern void (*D_8018813C[])(void); +extern void func_80169F00(void *a0); +extern char D_801880EC[]; +extern char D_801880AC[]; +extern void func_80169F3C(int param_1); +extern void func_80169FE0(s32 a0); +extern void (*D_80188174[])(void); +extern void func_8016A020(void *a0); +extern void func_8016A05C(void *a0); +extern void func_8016A290(s32 a, void *b, void *c); +extern void func_8016A08C(s32 param_1); +extern void func_8016A1CC(int param_1); +extern void func_8016A290(s32 param_1, void *param_2, void *param_3); +extern void (*D_80188180[])(void); +extern void func_8016A700(void *a0); +extern s32 func_8016A73C(s32 arg0); +extern s32 func_8016A8FC(s32 a0); +extern void func_8016A890(s32 arg0); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern void func_8016AA50(s32 param_1, s32 param_2); +extern void (*D_801881C8[])(void); +extern void func_8016AB30(void *a0); +extern void func_8016B234(void); +extern void func_8016AFB0(s32 a0); +extern void func_8016B114(void *arg0); +extern s32 func_8016B448(s32, s32); +extern s32 func_8016BA48(s32 a0); +extern void func_8016B3F4(s32 a0); +extern s32 func_8016B428(s32 a0); +extern void func_8016B984(void *a0); +extern s32 func_8016B448(s32 arg0, s32 arg1); +extern void (*D_80188244[])(void); +extern void func_8016B4BC(void *a0); +extern int func_8016B9F8(int); +extern int func_8016B834(int, int); +extern void func_8016B91C(int); +extern int D_801B99F8; +extern void func_8016B4F8(int param_1); +extern s32 func_8016B9F8(s32 param_1); +extern void func_8016B6BC(s32, s32, s32, s32); +extern void func_8016B91C(s32); +extern s16 D_80188238[]; +extern void func_8016B5C0(s32 param_1); +extern void func_8001CD9C(int, void *); +extern int *D_8018827C[]; +extern unsigned short D_80188284[]; +extern unsigned short D_8018828C[]; +extern unsigned char D_801B9A00[]; +extern int func_8016B834(int param_1, int param_2); +extern void func_8016B964(SrcB964 *a0, DstB964 *a1); +extern void func_8016B91C(s32 arg0); +extern s32 D_801B99F8; +extern s32 func_8016BA68(s32, s32); +extern void func_8016BADC(void *a0, s32 a1, s32 a2); +extern void (*D_80188294[])(void); +extern void func_8016BBA4(void *a0); +extern s32 func_8016BBE0(s32 param_1); +extern void func_8016BFA8(s32 a0, s32 a1, s32 a2, s32 a3); +extern M2C_UNK D_801B9B34; +extern M2C_UNK D_801B9B38; +extern void func_8016BCC0(void *arg0); +extern s32 func_8016BD78(s32 param_1); +extern s32 func_8016BEA0(s32 param_1); +extern void func_8016BF34(void *a0); +extern void func_8016BFD0(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern s32 D_801B9AC0; +extern void (*D_801882C4[])(void); +extern void func_8016C14C(void *a0); +extern s32 func_8016C374(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_801B9B3C[]; +extern u8 D_801B9B44[]; +extern u8 D_801B9AF4[]; +extern void func_8016C2C4(s32 param); +extern s32 func_8016C49C(s32 param_1_arg); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_8016C74C(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern short func_8016CF04(s32 a0, s32 a1); +extern void func_8016C83C(s32 a0); +extern void (*D_801882CC[])(void); +extern void func_8016CB84(void *a0); +extern short func_8016CF04(s32 param_1, s32 param_2); +extern void (*D_801882E8[])(void); +extern void func_8016D19C(void *a0); +extern void (*D_801882F0[])(void); +extern void func_8016D428(void *a0); +extern void func_8016D464(u8 *a0); +extern void func_8016D4DC(s32 a0); +extern void func_8016D5EC(s32 *a0); +extern short func_8016CBC0(void); +extern void func_8016D64C(int param_1); +extern void func_8016D778(s32 a0); +extern void func_800D20C0(); +extern void func_8016D848(s32 *a0); +extern void func_8016D984(s32 *a0); +extern void func_8016DBD8(u8 *a0); +extern void (*D_80188358[])(int); +extern void func_8016DA30(int param_1); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_801882FC; +extern u8 D_80188308; +extern void func_8016DA7C(s32 param_1); +extern void func_8016DB34(s32 param_1); +extern void (*D_8018838C[])(void); +extern void func_8016DEA4(void *a0); +extern void func_8016DEE0(s32 a0); +extern void (*D_80188394[])(void); +extern void func_8016DF20(void *a0); +extern void func_8016E3CC(s32 a0); +extern void func_8016E1CC(s32 a0); +extern void func_8016E26C(s32 *a0); +extern void func_8016E2E8(void *a0); +extern void func_8016E460(void *a0, void *a1); +extern void func_8016E358(void *a0); +extern void func_8016E460(void *arg0, void *arg1); +extern void (*D_801883E8[])(void); +extern void func_8016E5B8(void *a0); +extern void func_8016E5F4(s32 arg0); +extern void func_8016E778(); +extern void func_8016E688(void *a0); +extern void func_8016E6E4(s32 a0); +extern void func_8016E728(u8 *a0); +extern void func_8016E7C8(int param_1, short *p1, unsigned int *p2); +extern void func_8016E778(int param_1); +extern void func_8016E7C8(int param_1, short *param_2, unsigned int *param_3); +extern s32 D_80115218; +extern void func_8016E8F0(void); +extern void func_8016E918(short param_1, short param_2); +extern s32 func_8016E95C(); +extern u16 D_8018841C[]; +extern s32 func_8016EC0C(s32 a0, s32 a1); +extern void func_8016EAC0(Wave *param_1); +extern u8 D_8018840C[]; +extern void func_8016EB3C(s32 p); +extern void func_8016EBA8(u8 *param_1); +extern void func_8016ED6C(void); +extern s32 D_80126D70; +extern void func_8016EDEC(s32 a0, s32 a1, s32 a2); +extern void func_8016ED8C(s32 a0, s32 a1, s32 a2); +extern void func_8016EE40(s32 a0, s32 a1, s32 a2); +extern void func_8016EDBC(s32 a0, s32 a1, s32 a2); +extern void func_8016EE94(); +extern void func_8016EDEC(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_8016EF78(s32 a0); +extern void func_8016EE40(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_801726D0(void *a0); +extern s32 D_80126D50; +extern s32 D_80126D54; +extern u8 D_80126D6C; +extern u8 D_80126D6D; +extern u8 D_80126D6E; +extern s32 D_80126D5C; +extern s32 D_80126D60; +extern s16 D_80126D64; +extern s16 D_80126D66; +extern s16 D_80126D68; +extern s16 D_80126D6A; +extern u8 D_80126D1A; +extern s32 D_80127058; +extern s32 D_8012705C; +extern s32 D_80127060; +extern s32 D_80127064; +extern s32 D_80127068; +extern s32 D_8012706C; +extern s32 D_80127070; +extern s32 D_80127074; +extern s16 D_80126D20; +extern void func_8016EE94(s32 a0, s32 a1); +extern s32 func_8016EFC8(s32); +extern s32 func_8016EFA8(s32 a0); +extern void func_8016F094(s32 *a0); +extern s32 func_8016F0AC(); +extern s32 D_80188438; +extern void func_8016F250(void); +extern void func_8016F288(void); +extern void func_8016F2A8(void); +extern void func_8016F2C8(void); +extern void func_8016F2EC(void); +extern void func_8016F30C(void); +extern void func_8016F330(void); +extern void func_8016F350(void); +extern void func_8016F374(void); +extern void func_8016F388(void); +extern void func_8016F398(void); +extern s32 func_8016F44C(s32 a0); +extern void func_8016F470(s32 a0); +extern s32 func_8016F410(s32 a0); +extern void func_80175414(s32); +extern s32 func_8016F4C4(s32); +extern s32 func_8016F494(s32 a0); +extern void func_8016F0E4(void); +extern s32 func_8016F4C4(s32 param_1); +extern void func_8016F4F4(void); +extern void func_801719A4(int a0, int a1); +extern void func_800D1724(s32 a0); +extern void func_80171928(void *a0); +extern void *D_8011F738; +extern void func_8016F4FC(void *a0); +extern void func_8014708C(void *a0); +extern void func_8016F540(void *a0); +extern void func_8016F578(s32 *a0); +extern void func_8016F5B0(void *a0); +extern void func_80147060(u8 *a0); +extern void func_8016F5E0(u8 *a0); +extern void func_8016F610(void *a0); +extern void func_8016F648(void *a0); +extern void func_8016F680(void *a0); +extern void func_8016F6B0(void *a0); +extern void (*D_801884B0[])(void); +extern void func_8016F6E0(void *a0); +extern s32 func_80171990(u8 *a0); +extern void func_8016F764(void *a0); +extern void func_8016F71C(u8 *a0); +extern void (*D_801884B8[])(void); +extern void func_8016F798(void *a0); +extern void func_8016F804(void *a0); +extern void func_8016F7D4(u8 *a0); +extern void func_80171928(void *); +extern void (*D_801884C0[])(void); +extern void func_8016F834(void *a0); +extern void func_8016F8AC(u8 *a0); +extern void func_8016F870(u8 *a0); +extern void func_80172358(u8 *a0, u8 *a1); +extern void (*D_801884C8[])(void); +extern void func_8016F8E4(void *a0); +extern void func_8016F95C(void *a0); +extern void func_8016F920(u8 *a0); +extern s32 func_80171CC4(void *a0, void *a1); +extern s32 func_80171D1C(void *a0, void *a1, s32 a2); +extern u16 D_8011F73E; +extern void (*D_801884D0[])(void); +extern void func_8016F9C4(void *a0); +extern void func_80171B44(s32 *a0); +extern void func_8016FA44(s32 a0); +extern void func_8016FA00(s32 a0); +extern s32 func_80171C64(s32 a0, s32 a1); +extern void (*D_801884D8[])(void); +extern void func_8016FA84(void *a0); +extern void func_8016FB10(void *a0); +extern void func_8016FAC0(u8 *a0); +extern void func_8016FB50(void *a0); +extern void (*D_801884E4[])(void); +extern void func_8016FB7C(void *a0); +extern void func_8016FC24(); +extern void func_8016FBB8(s32 a0); +extern s32 func_80171B4C(s32 a0, s32 a1); +extern void func_8016FC24(s32 a0); +extern void func_8016FC64(void *a0); +extern void (*D_801884F0[])(void); +extern void func_8016FC90(void *a0); +extern void func_8016FD08(u8 *a0); +extern void func_8016FCCC(u8 *a0); +extern s32 func_80172658(s32 *a0); +extern void func_8016FD08(u8 *s0); +extern void func_8016FD7C(s32 *a0); +extern void (*D_801884FC[])(void); +extern void func_8016FDB4(void *a0); +extern void func_8016FE2C(u8 *a0); +extern void func_8016FDF0(u8 *a0); +extern void func_8016FE2C(u8 * a0); +extern s32 func_8016FE78(s32 *a0); +extern s32 func_80172664(s32 *a0); +extern void func_8016FED0(s32 *a0); +extern void (*D_8018850C[])(void); +extern void func_8016FF30(void *a0); +extern void func_8016FFA8(u8 *a0); +extern void func_8016FF6C(u8 *a0); +extern void (*D_8018851C[])(void); +extern void func_8016FFDC(void *a0); +extern void func_80170068(u8 *a0); +extern void func_80170018(u8 *a0); +extern void func_801700B8(u8 *a0); +extern void func_80170100(u8 *a0); +extern void (*D_80188524[])(void); +extern void func_80170150(void *a0); +extern void func_801701C8(u8 *a0); +extern void func_8017018C(u8 *a0); +extern void func_801701C8(u8 * a0); +extern void (*D_8018852C[])(void); +extern void func_80170240(void *a0); +extern void func_801702B8(s32 a0); +extern void func_8017027C(u8 *a0); +extern s16 func_80171AB0(s32 a0, void *a1); +extern void (*D_80188534[])(void); +extern void func_801702FC(void *a0); +extern void func_80170374(u8 *a0); +extern void func_80170338(u8 *a0); +extern s32 func_8014C168(s32 *a0, s32 a1); +extern void func_80170374(u8 * a0); +extern void (*D_8018853C[])(void); +extern void func_801703E0(void *a0); +extern void func_8017044C(u8 *a0); +extern void func_8017041C(u8 *a0); +extern void func_8017044C(u8 * a0); +extern void (*D_80188544[])(void); +extern void func_801704B0(void *a0); +extern void func_8017051C(void *a0); +extern void func_801704EC(u8 *a0); +extern void (*D_8018854C[])(void); +extern void func_80170548(void *a0); +extern void func_801705C0(u8 *a0); +extern void func_80170584(u8 *a0); +extern void func_801705C0(u8 * a0); +extern void (*D_80188554[])(void); +extern void func_801705F8(void *a0); +extern void func_80170670(void *a0); +extern void func_80170634(u8 *a0); +extern void func_8012A568(void (*a0)(void)); +extern void (*D_8018855C[])(void); +extern void func_801706AC(void *a0); +extern void func_80170718(void *a0); +extern void func_801706E8(u8 *a0); +extern void func_80129FF4(void); +extern void (*D_80188564[])(void); +extern void func_80170748(void *a0); +extern void func_801707D4(void *a0); +extern void func_80170784(u8 *a0); +extern s32 func_80174ED4(void); +extern void (*D_8018856C[])(void); +extern void func_80170810(void *a0); +extern void func_801708B0(void *a0); +extern u8 D_800D5DA8; +extern void func_8017084C(s32 a0); +extern u8 D_800D5A34[]; +extern void func_80170AD8(void *a0); +extern void func_80171904(s32 a0); +extern void func_80170B48(int a0); +extern void func_80170928(void); +extern u8 D_800D59EC[]; +extern void func_80170970(void); +extern u8 D_800D599C[]; +extern void func_801709B8(void); +extern u8 D_800D5934[]; +extern void func_80170A00(void); +extern void func_80170A48(void); +extern u8 D_800D5DC0[]; +extern void func_80170A90(void); +extern void (*D_80188574[])(void); +extern void func_80170B14(int a0); +extern void func_80170B90(u8 *a0); +extern void (*D_8018857C[])(void); +extern void func_80170BD8(void *a0); +extern void func_80170C44(u8 *a0); +extern void func_80170C14(u8 *a0); +extern void (*D_80188584[])(void); +extern void func_80170C74(void *a0); +extern s32 func_8017197C(u8 *a0); +extern void func_80170CF0(void *a0); +extern void func_80170CB0(u8 *a0); +extern void (*D_8018858C[])(void); +extern void func_80170D68(void *a0); +extern void func_80170DE0(u8 *a0); +extern void func_80170DA4(u8 *a0); +extern s32 D_8011F73C; +extern s32 D_8011F740; +extern void func_801718AC(void *a0); +extern void func_80170DE0(u8 * _arg0); +extern void (*D_80188594[])(void); +extern void func_80170E34(void *a0); +extern void func_80170EAC(u8 *a0); +extern void func_80170E70(u8 *a0); +extern int func_800D0F8C(int a0); +extern void func_80170EAC(u8 * _arg0); +extern void (*D_8018859C[])(void); +extern void func_80170EFC(void *a0); +extern void func_80170F74(void *a0); +extern void func_80170F38(u8 *a0); +extern void (*D_801885A4[])(void); +extern void func_80170FB0(void *a0); +extern void func_80171028(void *a0); +extern void func_80170FEC(u8 *a0); +extern void (*D_801885AC[])(void); +extern void func_80171064(void *a0); +extern void func_801710DC(u8 *a0); +extern void func_801710A0(u8 *a0); +extern u16 D_8011F73A; +extern void func_801710DC(u8 * arg0); +extern void (*D_801885B4[])(void); +extern void func_80171120(void *a0); +extern void func_8017118C(u8 *a0); +extern void func_8017115C(u8 *a0); +extern void func_80142454(s32 a0); +extern void func_8017118C(u8 * a0); +extern void (*D_801885BC[])(void); +extern void func_801711C0(void *a0); +extern void func_80171238(void); +extern void func_801711FC(u8 *param_1); +extern void (*D_801885C4[])(void); +extern void func_80171260(void *a0); +extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80171384(void *a0); +extern void (*D_801885CC[])(void); +extern void func_801714E4(void *a0); +extern void func_8017162C(void *a0); +extern void func_80171520(s32 a0); +extern s32 func_801716AC(s32 a0, void *a1, s32 *a2); +extern s32 func_80012FC8(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_800A5E94; +extern u8 D_800A5E95; +extern u8 D_800A5E96; +extern s32 func_801716AC(s32 a0, void * a1, s32 * a2); +extern int func_800D0FE0(int a0); +extern void func_801717A0(void *a0); +extern void func_8013E588(void *a0); +extern void func_801717F4(void *a0); +extern void func_80171824(void *a0); +extern void func_80171854(void *a0); +extern void func_80171884(void); +extern void func_80171A1C(u8 *a0); +extern void func_80171928(void * a0); +extern void func_8017196C(s32 *a0, s8 a1); +extern void func_80171A04(s32 *a0); +extern void func_80171A10(s32 *a0); +extern void func_80171A34(s32 *a0, s8 a1); +extern s32 func_80171A44(u8 *a0); +extern s32 func_80171A58(u8 *a0); +extern s32 func_80171A6C(u8 *a0); +extern void func_80171A80(s32 *a0, s32 a1); +extern s32 func_80171A88(s32 a0); +extern s16 func_80171AB0(s32 param_1, void * _arg1); +extern void func_80171B10(void *a0); +extern void func_80171EC8(s32 a0); +extern s32 func_80171C64(s32 param_1, s32 param_2); +extern s32 func_80171D78(s32 a0, s32 a1); +extern int func_8017250C(short *a0, short *a1); +extern s32 func_80171CC4(void * a0, void * a1); +extern s32 func_80171FFC(short *a0, short *a1, s32 a2); +extern s32 func_80171D1C(void * a0, void * a1, s32 a2); +extern s32 func_8017248C(s32 a0, s32 a1); +extern s32 func_80171E08(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); +extern void func_80172170(s32 a0, s32 a1); +extern s32 func_8017209C(void *arg0, void *arg1, s32 arg2, s32 arg3); +extern void func_801722CC(s32 *a0); +extern void func_80172304(s32 *a0); +extern void func_80172310(u8 *a0); +extern void func_801723C4(s32 param_1, s32 param_2); +extern void func_80161C24(s32, s32); +extern void func_80172414(s32 a0); +extern s32 func_801724EC(s32 a0); +extern s32 func_8017248C(s32 arg0, s32 arg1); +extern s32 func_80013450(s32); +extern s32 func_80172560(u8 *a0, u8 *a1); +extern s32 func_8017261C(u8 *a0); +extern s32 func_80172644(u8 *a0); +extern s32 func_80172670(s32 *a0); +extern s32 func_80172688(s32 *a0); +extern s32 func_80172694(s32 *a0); +extern s32 func_801726A0(s32 *a0); +extern s32 func_801726AC(s32 *a0); +extern s32 func_801726B8(s32 *a0); +extern s32 func_801726C4(s32 *a0); +extern s32 func_80172760(s32 a0); +extern s32 func_80174650(s32); +extern void (*D_80127088)(void); +extern s32 D_801270BC; +extern s16 D_80126B0C; +extern void func_801726D0(void * _arg0); +extern void func_80172710(void); +extern void func_80174684(void *); +extern void func_80172738(void); +extern s16 D_80126B30; +extern s32 func_801727D0(void *a0); +extern void func_80172780(void *a0); +extern void func_80172844(u8 *a0); +extern void func_8017280C(u8 *a0); +extern void func_8017288C(void); +extern s32 func_801728E4(void *a0); +extern void func_80172894(void *a0); +extern void func_80172958(u8 *a0); +extern void func_80172920(u8 *a0); +extern s16 D_80126B36; +extern void func_80172958(u8 * a0); +extern void func_801729A8(void); +extern s32 func_801729F0(void *a0); +extern s16 D_80126B34; +extern s16 D_80126B32; +extern void func_801729B0(s32 a0); +extern void func_80172A8C(void *a0); +extern void func_80172A2C(int param_1); +extern void func_80172ACC(u8 *a0); +extern void func_80172B0C(void); +extern s32 func_80172B44(void *a0); +extern void func_80172B14(s16 a0); +extern s32 D_801150F8; +extern void func_80172BC8(void *a0); +extern void func_80172B80(u8 *a0); +extern void func_80172C48(void); +extern void (*D_80188610[])(void); +extern void func_80172CA0(void *a0); +extern void func_80172D14(u8 *a0); +extern void func_80172CDC(u8 *a0); +extern void func_80172D14(u8 * a0); +extern void func_80172D60(void); +extern s32 D_80127508; +extern s32 func_80172DAC(void *a0); +extern void func_80172D68(s32 a0); +extern void func_80172E20(u8 *a0); +extern void func_80172DE8(u8 *a0); +extern void func_80172E20(u8 * a0); +extern void func_80172E8C(void); +extern void func_8017303C(void *); +extern void func_80172E94(void); +extern void func_80172ED4(void); +extern void func_80172EFC(void); +extern void func_80172F24(void); +extern u8 D_800D47F4[]; +extern void func_80172F4C(void); +extern void func_80172F9C(void); +extern u8 D_800D5C6C[]; +extern void func_80172FEC(void); +extern s32 func_80173078(void *a0); +extern void func_8017303C(void * a0); +extern void func_801730FC(struct S801730FC *a0); +extern void func_801730B4(s32 a0); +extern void func_8017316C(void); +extern s32 func_8017319C(void *a0); +extern void func_80173174(void); +extern u8 D_800D5AA0[]; +extern void func_80173220(void *a0); +extern void func_801731D8(s32 *a0); +extern M2C_UNK D_801885D4; +extern void func_80173220(void * arg0); +extern void func_80173294(void); +extern void func_801732C4(); +extern void func_8017329C(void); +extern void func_801732C4(s32 *a0); +extern void func_8017331C(); +extern void func_801732F4(void); +extern void func_8017331C(s32 *a0); +extern void func_80173374(); +extern void func_8017334C(void); +extern void func_80173374(s32 *a0); +extern void func_801733A4(void); +extern void func_801733CC(s32 a0); +extern void func_801734BC(s32 a0, s32 a1); +extern s16 D_80126B3E; +extern void func_80173460(s32 a0, s32 a1); +extern void func_801734BC(s32 arg0, s32 _unused1); +extern void (*D_80188640[])(void); +extern void func_80173544(void *a0); +extern void func_801735B8(u8 *a0); +extern void func_80173580(u8 *a0); +extern s16 D_80126B40; +extern void func_801735EC(void *a0); +extern void func_80173648(u8 *a0); +extern void func_801736A8(void); +extern s32 func_8014C118(void *a0, s32 a1, s32 a2); +extern s32 func_801736FC(void *a0); +extern void func_801736B0(s32 a0, s32 a1); +extern void func_80173770(u8 *a0); +extern void func_80173738(u8 *a0); +extern void func_801723C4(s32 a0, s32 a1); +extern void func_801737B0(void); +extern s32 func_801737E8(void *a0); +extern void func_801737B8(s16 a0); +extern void func_8017385C(u8 *a0); +extern void func_80173824(u8 *a0); +extern void func_801738D4(void); +extern s32 func_8017390C(void *a0); +extern void func_801738DC(s16 a0); +extern void func_80173980(u8 *a0); +extern void func_80173948(u8 *a0); +extern void func_801739D8(u8 *a0); +extern void func_80173A20(void); +extern s32 D_8012750C; +extern void func_80173A60(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80173A28(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void (*D_8018867C[])(void); +extern void func_80173B4C(void *a0); +extern void func_80173BC0(u8 *a0); +extern void func_80173B88(u8 *a0); +extern void func_80173C64(u8 *a0); +extern void func_80173E1C(s32 a0); +extern s16 D_80126938; +extern s16 D_80126B3A; +extern void func_800D128C(s32, s32); +extern void func_80174158(s32 a0); +extern void func_8002A088(s32); +extern void func_8002A2D4(s32); +extern void func_8002A544(s32); +extern void func_8002A7B4(s32); +extern s32 func_80174188(s32 a0); +extern void func_801741A8(s32 a0); +extern s32 func_800D0EC4(void); +extern void func_800D0F0C(s32, s32); +extern void func_80145EE8(s32); +extern void func_80173EF8(void *param_1); +extern s32 func_8014BCEC(s32, s32); +extern void func_801741A8(s32 _arg0); +extern s16 D_80126B3C; +extern s16 D_8011F9C8; +extern void func_801741EC(u8 *a0); +extern void func_80174274(void); +extern s32 func_801742A4(void *a0); +extern void func_8017427C(void); +extern void func_80174318(u8 *a0); +extern void func_801742E0(u8 *a0); +extern void func_80174354(void); +extern s32 func_80174384(void *a0); +extern void func_8017435C(void); +extern void func_801743F0(u8 *a0); +extern void func_801743C0(u8 *a0); +extern void func_801743F0(u8 * a0); +extern void func_80174430(void); +extern s32 func_80174474(void *a0); +extern void func_80174438(s32 a0); +extern void func_801744E0(u8 *a0); +extern void func_801744B0(u8 *a0); +extern void func_80174524(void); +extern void func_80174554(); +extern void func_8017452C(void); +extern void func_80174554(s32 arg0); +extern void func_801745AC(); +extern void func_80174584(void); +extern void func_801745AC(s32 *a0); +extern void func_80174604(void); +extern void func_801745DC(void); +extern void func_80174630(void); +extern s32 func_80174650(s32 _arg0); +extern void func_80174674(void); +extern void func_801746A4(void); +extern s32 func_800CF8CC(void); +extern void func_80174714(void); +extern s32 func_80174754(void); +extern s16 func_80174764(void); +extern s16 func_80174774(void); +extern s32 func_801747CC(void *a0); +extern void func_80174784(void); +extern s32 func_801747AC(s32 a0); +extern s32 func_80174808(u8 *a0); +extern void func_8017481C(void); +extern s32 func_80174888(void *a0); +extern void func_80174824(void); +extern void func_8017484C(s32 a0); +extern void func_801748C4(s32 a0); +extern void func_801748E4(void); +extern void func_8012A018(s32 a, s32 b); +extern s32 func_8017496C(void *a0); +extern s32 D_80126950; +extern void func_801748EC(void); +extern s32 func_801749C8(); +extern s32 func_801749A8(s32 a0); +extern void func_80174BBC(void *a0); +extern void func_8012A0E0(void); +extern void func_80174BF4(void *a0); +extern void (*D_801886D4[])(); +extern void func_80174BF4(void * arg0); +extern s32 func_80174CB0(s32, s32); +extern s32 func_80174C60(s32 a0); +extern void func_80174C80(s32 a0); +extern s32 D_8012697C; +extern u16 D_80126980; +extern s32 func_80174F28(void *a0); +extern void func_80174E9C(s32 a0); +extern void func_80174EF0(s32 a0, s16 a1); +extern s32 func_80175014(u8 *a0, u8 *a1, s32 a2); +extern void func_80174F64(u8 *a0); +extern void func_80174FBC(u8 *a0); +extern s32 func_8017509C(u8 *a0, s32 a1, u8 *a2, u8 *a3); +extern void func_80175184(s32 *a0); +extern void func_80175114(s32 *a0); +extern void func_80175184(); +extern void func_80175150(s32 *a0); +extern void (*D_801886E4[])(void*); +extern s32 func_80175268(s32); +extern void func_80175184(s32* arg0); +extern s32 func_80175218(void *a0); +extern void func_801751D8(void *a0); +extern void (*D_801886EC[])(s32); +extern s32 func_80175218(void * param_1); +extern void func_801752BC(s32 *a0); +extern u8 D_8011F7A8; +extern u8 D_8011F7A9; +extern u8 D_8011F7AD; +extern u8 D_8011F7AE; +extern void func_80175414(s32 _arg0); +extern void func_80175494(void); +extern void (*D_80188854[])(); +extern s32 func_801758FC(void); +extern s32 func_80175820(void); +extern s32 func_801759D8(void); +extern void func_8017553C(s32 *param); +extern void func_801757A0(s32 a0); +extern short D_800B9A02; +extern void func_80175590(void *arg0); +extern s16 D_800B9A02; +extern void func_801757A0(s32); +extern void func_80175624(void *a0); +extern void func_801757E0(int); +extern void func_80175668(void); +extern void (*D_80188860[])(); +extern void func_80175690(s32 *param); +extern void func_80175DA8(s32 a0); +extern void func_80175AB8(s32 a0); +extern void func_80176144(s32 a0); +extern void func_801756E4(s32 arg0); +extern void func_80175798(void); +extern void func_80176734(s32 a0); +extern void func_80176218(s32 a0); +extern void func_80176D00(s32 a0); +extern void func_801757E0(s32 a0); +extern s32 func_80178004(s32 a0, s32 a1, s32 a2); +extern u8 D_8011F7B1; +extern u16 D_8011F7B4; +extern u16 D_8011F7B6; +extern s16 D_8011F81E; +extern void *func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern u32 func_801783D0(s32 a0, s32 a1); +extern void *func_801777BC(void *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern u16 D_8011F82C; +extern u16 D_8011F82A; +extern u32 * func_80176D94(void *param_1, u32 param_2, s16 param_3_); +extern void func_801778A8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80176FF4(s32 a0); +extern u16 D_8011F830; +extern u16 D_8011F82E; +extern u32 * func_801770E0(void *param_1, u32 param_2, s16 param_3_); +extern void func_80177340(s32 a0); +extern u8 D_8011F837; +extern u8 D_8011F7F0; +extern u8 D_8011F7AB; +extern u32 * func_8017742C(u32 *param_1, s32 param_2, s32 param_3); +extern void func_801776EC(u8 *a0); +extern void * func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern uint * func_80177EA4(uint *param_1, int param_2, uint param_3, int param_4); +extern void func_80177F84(s32 param_1, s32 param_2); +extern u32 * func_80178298(u32 *param_1, u8 *param_2, short param_3, short param_4); +extern M2C_UNK D_801B8FE0; +extern void func_80178438(u16 *arg0); +extern void func_801787D4(void); +extern void func_8012A908(void); +extern void func_8017869C(s32 a0); +extern void func_80130D0C(s32 a0); +extern void func_8013E370(void); +extern s32 D_8011DB08; +extern void func_8017849C(void); +extern void func_8013E4B4(void); +extern s16 D_801270C4; +extern s32 D_801274D8; +extern s16 D_801270C2; +extern u8 D_801270C6; +extern u8 D_801270C7; +extern s32 D_801274DC; +extern s32 D_801274E0; +extern void func_80178608(void); +extern void func_80178744(s32 a0, s32 a1); +extern void func_80178840(); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern s32 func_801788B8(s32 arg0, s32 arg1); +extern s32 func_801789AC(s32 arg0); +extern s16 D_801BA978; +extern int func_80178970(void); +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern s32 func_80178B70(s32 param_1, s32 param_2); +extern void func_80178BB8(s32 a0, s32 a1); +extern s32 func_80178BF8(); +extern s32 D_801BA278; +extern short D_801BA9EC; +extern void func_80178CBC(s32 arg0, s32 arg1); +extern void func_80178D18(void); +extern s32 func_80178D40(s32 arg0, s32 arg1); +extern void func_80179B28(s32 a0); +extern void func_80179B74(u16 *p); +extern void func_80179D30(u16 *a0); +extern void func_80179D78(u16 *a0); +extern void func_80179DCC(short a0); +extern void func_80179DF8(void); +extern void func_80179E1C(short a0); +extern void func_80179E48(s16 a0); +extern void func_80179E74(s16 a0); +extern void func_80179EA0(u16 *a0); +extern void func_80179EE8(short a0); +extern void func_80179F14(s16 a0, s16 a1); +extern void func_80179F44(void); +extern void func_80179F6C(short a0); +extern void func_80179F98(u16 *a0); +extern void func_80179FEC(u16 *a0); +extern void func_8017A040(u16 *a0); +extern s32 D_801BA6A4; +extern void func_8017A094(s32 arg0); +extern void func_8017A0C4(s32 arg0); +extern void func_8017A0F4(void); +extern void func_8017A11C(void); +extern s32 D_801BA6CC; +extern void func_8017A144(s32 a0); +extern void func_8017A180(void); +extern void func_8017A1A8(void); +extern void func_8017A1D0(void); +extern void func_8017A1F8(void); +extern void func_8017A220(void); +extern void func_8017A248(void); +extern void func_8017A270(void); +extern void func_8017A298(void); +extern void func_8017A2C0(void); +extern void func_8017A2E8(void); +extern void func_8017A310(void); +extern void func_8017A338(void); +extern void func_8017A360(void); +extern void func_8017A388(void); +extern s16 D_801BA688; +extern s32 func_8017A3B0(void); +extern short D_801BA6C4; +extern short D_801BA6C0; +extern int func_800D0CA0(int); +extern int func_8001AAA0(void); +extern int func_800D0CE0(void); +extern int func_8017A3D8(void); +extern void func_80172310(u8*); +extern void func_80172780(void*); +extern void func_80172894(void*); +extern void func_801729B0(s32); +extern void func_80172B14(s16); +extern void func_80172C50(u16 *); +extern void func_80172D68(s32); +extern void func_801733FC(s16, u16 *); +extern void func_80173460(s32, s32); +extern void func_801734BC(s32, s32); +extern void func_801736B0(s32, s32); +extern void func_801737B8(s16); +extern void func_801738DC(s16); +extern void func_80173A28(s32, s32, s32, s32, s32, s32); +extern void func_80174438(s32); +extern void func_8017A4AC(void); +extern s32 func_8017AD0C(s32 arg0); +extern s32 func_8017AD0C(s32); +extern s32 func_8017ADE8(s32 a0); +extern s32 func_8017AE08(void); +extern void func_8017B0E4(int param_1, int param_2); +extern s16 D_801BA68C; +extern u16 D_801BA70C; +extern u16 D_801BA70E; +extern u16 D_801BA710; +extern void func_8017B1D8(void); +extern s32 func_8017B238(s32 param_1, s32 param_2); +extern s32 func_8017B368(s32 param); +extern s32 func_8017B614(s32 param_1, s32 param_2); +extern s32 D_80114F30; +extern s32 D_80114F34; +extern s32 D_80114F38; +extern s32 D_80114F24; +extern s32 D_80114F28; +extern s32 D_80114F2C; +extern u8 D_8012694C; +extern s16 D_801BA704; +extern s16 D_801BA706; +extern s16 D_801BA708; +extern s16 D_801BA6FC; +extern s16 D_801BA6FE; +extern s16 D_801BA700; +extern void func_8017B7A8(void); +extern s16 D_801BA71C; +extern s16 D_801BA71E; +extern s16 D_801BA720; +extern s16 D_801BA724; +extern s16 D_801BA726; +extern s16 D_801BA728; +extern void func_8017B824(void); +extern void func_8017B880(void); +extern s32 func_8017B8E8(s32 src); +extern short D_801BA714; +extern short D_801BA716; +extern short D_801BA718; +extern void func_8017B940(void); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(void *a0, void *a1, void *a2); +extern SV4 D_801BA6AC; +extern SV4 D_801BA6B4; +extern void func_8017BA3C(s32 param_1, s32 param_2); +extern s32 func_8017BB34(s32 param_1, s32 param_2); +extern void (*D_801BA6D4[10])(int); +extern void func_8017BC38(int param_1); +extern void func_8017B0E4(int, int); +extern void func_8017BCA0(int param_1); +extern void func_8012A4BC(void); +extern void func_8017BCF4(int param_1); +extern void (*D_801BA6D0)(void); +extern void func_8017BD50(int param_1); +extern void (*D_80188A3C[])(void); +extern void func_8017BE60(void *a0); +extern void func_8017BE9C(void); +extern void func_8017BEA4(void); +extern void func_8017BEAC(void); +extern void func_8017BEB4(void); +extern void (*D_80188A54[])(void); +extern void func_8017BEBC(void *a0); +extern void func_8017C090(void *a0); +extern void func_8017C24C(s32 arg0); +extern void func_8002931C(void); +extern int func_8017D12C(int arg); +extern void (*D_80188AD0[])(void); +extern void func_8017D14C(void *a0); +extern void func_8017D37C(void); +extern s32 func_8017D188(s32 a0); +extern s32 func_8017D1CC(void); +extern void func_8017D3A4(void); +extern s32 func_8017D1F0(s32 a0); +extern void func_8001BFD0(void); +extern void func_800D1E28(void); +extern s32 func_8017D230(u8 *a0); +extern s32 func_800D1EBC(void); +extern void func_8017D2AC(void); +extern void (*D_80188AE4[])(void); +extern void func_8017D2CC(void *a0); +extern s32 func_8017D308(s32 a0); +extern char D_80188AF0[]; +extern void func_8012A018(s32 a0, s32 a1); +extern void func_8012A094(s32 a0); +extern void func_8017D464(void *a0); +extern void func_8017D3CC(void); +extern void (*D_80188B10[])(void); +extern s32 func_80012ABC(s32 a0, s32 a1, s32 a2); +extern void func_8017D558(s32 param_1, s16 *param_2); +extern void (*D_80188B18[])(void); +extern void func_8017D6F0(void *a0); +extern s32 func_8017DB68(void); +extern s32 func_8012C354(s32, s32); +extern s32 func_80143994(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); +extern void func_8012CAE4(void*); +extern void func_8012B030(s32 a0); +extern void func_8017DBE0(s32 param_1); +extern void func_8017DE4C(s32 param_1); +extern void func_8017E080(s32 param_1); +extern void func_8012C218(void *a0); +extern void func_8001C924(s32 a0, void *a1); +extern s32 func_8012BEE8(); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern void func_8012B178(s32 a0, s32 a1); +extern s32 func_801817CC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern void func_8017E6EC(s32 p); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern void func_80142414(s32 a0, s16 a1); +extern void func_8017E9B4(s32 p); +extern void func_8017EA74(s32 param_1); +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern s32 func_8012E778(int param_1, int param_2); +extern s32 func_8012BCCC(s32 a0); +extern void func_8012EA90(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_801842E0(s32, s32); +extern void func_8018348C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_80183FD0(s32 a0, s32 a1); +extern void func_8017EDE4(s32 p); +extern void func_8017F3D8(s32 param_1); +extern void func_80181954(s32 a0); +extern void func_8012F214(s32, s32, s32); +extern s32 func_801833F4(void *a0, s32 a1, s32 a2); +extern s32 func_8012BEE8(); /* TU-canonical: an earlier call site passes zero args */ +extern void func_8017F490(s32 p); +extern void func_801834F0(s32 a0, void *a1, void *a2, s32 a3); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_80049CAC(s32, s32); +extern void func_800484EC(s32, s32, s32); +extern void func_8017F668(s32 p); +extern s32 func_8012BEE8(s32 a0); +extern void func_8012B0B4(unsigned int *p, int a1, int a2); +extern s32 func_8012B744(void *a0, void *a1); +extern void func_8012F14C(s32 a0); +extern void func_801834F0(s32, void*, void*, s32); +extern void func_8018348C(s32, void*, s32, s32, s32, s32); +extern s32 func_80013478(s32 a0, s32 a1); +extern void func_8017FAFC(s32 param_1); +extern void func_801811A8(void); +extern void func_8017FF18(s32 arg0); +/* ==== end §8b carried decl layer ==== */ + +#include "common.h" + +extern void func_80181064(s32 a0); +extern s32 func_8012DBD0(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80180EF0(s32 a0, s32 a1); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern s32 func_8012CBA4(s32 a0); +extern s32 func_8012CBF4(s32 a0); +extern void func_8012B23C(s32 a0); +extern void func_80131C78(s32 a0); +extern void func_80131E00(); +extern void func_80183FD0(s32 a0, s32 a1); + + +void func_80180B04(s32 a0) { + + extern u8 D_8019EBBC; + u16 sp10[4]; + s32 s1; + + if (*(s16 *)(a0 + 0xA) >= 0x10) { + func_80181064(a0); + return; + } + + if (*(s32 *)(a0 + 0x10) != 0 || *(s32 *)(a0 + 0x18) != 0) { + func_8012DBD0(a0, 0x50, + *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) + 0x800, 0x1D); + } + + switch (*(u8 *)(a0 + 0xC2)) { + case 0: + func_80180EF0(a0, (s32)&D_8019EBBC); + *(u8 *)(a0 + 0xC2) += 1; + case 1: + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x10) -= 0x100; + *(s32 *)(a0 + 0x1C) += 1; + if (*(s32 *)(a0 + 0x1C) >= 0x29) { + func_80131E00(a0, 0xD); + return; + } + s1 = ((s32 (*)(s32, s32))func_8012CC64)(a0, (s32)&D_8019EBBC); + if (s1 & 0x8000) { + *(s32 *)(a0 + 0x18) = 0; + *(s32 *)(a0 + 0x10) = 0; + } + if (s1 & 0x4000) { + func_8012B23C(a0); + *(u8 *)(a0 + 0xC2) = 4; + } else if (s1 & 0x2000) { + *(u8 *)(a0 + 0xC2) = 2; + func_80143B6C(a0, 1); + *(s32 *)(a0 + 0x14) = 0xFFF30000; + *(s32 *)(a0 + 0x1C) = 0; + func_80183FD0(a0, 0x9B8); + } + break; + + case 2: + { + s32 s2; + + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x10) -= 0x100; + *(s32 *)(a0 + 0x1C) += 1; + if (*(s32 *)(a0 + 0x1C) >= 0x29) { + func_80131E00(a0, 0xD); + return; + } + s2 = *(s32 *)(a0 + 0x14); + s1 = ((s32 (*)(s32, s32))func_8012CC64)(a0, (s32)&D_8019EBBC); + if (s1 & 0x8000) { + *(s32 *)(a0 + 0x18) = 0; + *(s32 *)(a0 + 0x10) = 0; + } + if (s1 & 0x4000) { + func_8012B23C(a0); + *(u8 *)(a0 + 0xC2) = 4; + } else if (s1 & 0x2000) { + func_80143B6C(a0, 1); + *(s32 *)(a0 + 0x14) = (-s2) / 3; + *(s32 *)(a0 + 0x1C) = 0; + *(u8 *)(a0 + 0xC2) = 3; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x10) = 0; + } + } + break; + + case 3: + *(s32 *)(a0 + 0x10) = *(s32 *)(a0 + 0x10) * 15 / 16; + *(s32 *)(a0 + 0x18) = *(s32 *)(a0 + 0x18) * 15 / 16; + if (*(u8 *)(a0 + 0xC3) & 1) { + s1 = func_8012CBA4(a0); + if (s1 & 0x8000) { + *(s32 *)(a0 + 0x18) = 0; + *(s32 *)(a0 + 0x10) = 0; + } + if (!(s1 & 0x6000)) { + func_80131E00(a0, 0xD); + return; + } + } else { + s1 = func_8012CBF4(a0); + if (s1 & 0x8000) { + *(s32 *)(a0 + 0x18) = 0; + *(s32 *)(a0 + 0x10) = 0; + } + if (s1 & 0x4000) { + func_8012B23C(a0); + *(u8 *)(a0 + 0xC2) = 4; + break; + } else if (s1 & 0x2000) { + *(u8 *)(a0 + 0xC3) |= 1; + func_80183FD0(a0, 0x9B8); + } + } + if ((*(s32 *)(a0 + 0x1C) & 3) == 3) { + func_80143B6C(a0, 1); + } + *(s32 *)(a0 + 0x1C) += 1; + if (*(s32 *)(a0 + 0x1C) < 0x11) { + break; + } + if (!(s1 & 0x6000)) { + func_80131E00(a0, 0xD); + return; + } + if (*(s16 *)(a0 + 0x76) <= 0) { + func_80131E00(a0, 6); + } else { + func_80131C78(a0); + } + break; + + case 4: + s1 = func_8012CBA4(a0); + if (s1 & 0x8000) { + *(s32 *)(a0 + 0x18) = 0; + *(s32 *)(a0 + 0x10) = 0; + } + if (s1 & 0x2000) { + if (*(s16 *)(a0 + 0x76) <= 0) { + func_80131E00(a0, 6); + } else { + func_80131C78(a0); + } + } else { + if ((*(s32 *)(a0 + 0x1C) & 3) == 3) { + func_80143B6C(a0, 1); + } + *(s32 *)(a0 + 0x1C) += 1; + if (*(s32 *)(a0 + 0x1C) >= 0x3D) { + func_80131E00(a0, 0xD); + return; + } + } + break; + } +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80180EF0); + +extern void func_80183FD0(s32 arg0, s32 arg1); + void func_80181044(void *arg0) { + func_80183FD0((s32)arg0, 0x9B7); + } + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181064); + + +extern void func_801811A8(void); +extern void func_80181654(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); + +void func_801810E8(s32 param_1) { + + extern s32 D_801B69A0; + u16 uVar1; + s32 iVar2; + + *(s16 *)(param_1 + 0x34) = 0; + if ((*(u32 *)(param_1 + 0xe0) & 8) == 0) { + func_801811A8(); + } else { + if ((*(u32 *)(param_1 + 0xe0) & 0x20) != 0) { + func_80181654(param_1, -0x8000); + } + *(s16 *)(param_1 + 2) = 0x22; + func_8012A828(param_1, &D_801B69A0); + } + iVar2 = *(s32 *)(param_1 + 0x20); + *(s16 *)(iVar2 + 0x14) = 0; + *(s16 *)(iVar2 + 0x10) = 0; + uVar1 = *(u16 *)(*(s32 *)(param_1 + 0x78) + 2); + *(u32 *)(param_1 + 0xe0) = (*(u32 *)(param_1 + 0xe0) & 0xffffffd5) | 0x400; + *(s16 *)(param_1 + 0x5e) = 0; + *(u16 *)(param_1 + 0xae) = *(u16 *)(param_1 + 0xae) & 0xfffe; + *(u32 *)(param_1 + 0xc4) = *(u32 *)(param_1 + 0xc4) & 0xfffffffb; + *(s16 *)(param_1 + 0x5c) = uVar1; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801811A8); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801812A0); + + + +extern s32 func_8012BCCC(s32 a0); +extern s32 func_8018353C(s32 a0, s32 a1); +extern void func_8012F214(s32, s32, s32); +extern s32 func_801833F4(void *a0, s32 a1, s32 a2); + +/* Two load-bearing constructs (do NOT "clean up"): + * 1. `goto ret0` / `goto store` with `ret0:` placed BEFORE the store block — cookbook L1344 + * shared-ret0 goto. A trailing `return 0` makes gcc sink the merged ret0 tail past the + * store block (7 mismatches: BRANCH-POLARITY + swapped tail). + * 2. `register s32 r __asm__("$2")` on the func_8018353C result + `return r`. Plain + * `return 0;` there emits `set v0,0; j epi`, which cross_jump (§5a) merges into the + * ret0 block, so the branch lands on ret0 instead of the epilogue. Pinning r to $v0 + * makes `return r` a self-copy that dies before jump2, leaving a bare `j epi` that + * jump.c collapses into `beqz $v0, .L8018730C`. (A plain `s32 r` does NOT work — cse2 + * const-folds `r` to 0 on the fall-through edge and the merge comes back.) */ +s32 func_801813C0(s32 p) { + + extern s32 D_80126B9C; + extern u8 D_8019E994[]; + s32 buf10[2]; + register s32 r __asm__("$2"); /* $v0 — see note 2 above */ + + if ((*(u32 *)(p + 0xE0) & 1) == 0) { + goto ret0; + } + if (*(u16 *)(p + 2) == 1) { + goto ret0; + } + if (*(u16 *)(p + 2) == 0xD) { + return 0; + } + if ((D_80126B9C & 2) == 0) { + return 0; + } + if (0x10000 < func_8012BCCC(p)) { + return 0; + } + r = func_8018353C(p, 0x380); + if (r == 0) { + return r; + } + ((void (*)(s32, void *, void *))func_8012F214)(p, D_8019E994, buf10); + if (func_801833F4(buf10, *(s16 *)(*(s32 *)(p + 0x20) + 0x12), 0x380) != 0) { + goto store; + } +ret0: + return 0; +store: + *(u16 *)(p + 2) = 0xC; + return 1; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181490); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181654); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801817CC); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_8018182C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181954); + + +/* func_801819B4 — line-of-sight / collision probe. + * + * Rotate the direction SVECTOR D_8019EBE4[dir] through the entity's matrix + * (*(0x20) + 0x34) into a scratch SVECTOR at sp+0x10, build the segment + * start (sp+0x18) = entity pos and end (sp+0x20) = entity pos + rotated + * vector, then hand the pair to func_8012CEB0 / func_800132BC. + * + * §71 sibling-first: DEFINE_func_80169408 / DEFINE_func_8016986C in + * src/shared/engine_core.h are the house shape for this ApplyMatrixSV + + * SVECTOR-local family — `s16 vNN[4]` locals declared in ASCENDING stack + * offset order (sp+0x10, sp+0x18, sp+0x20) and the entity position read as + * `*(u16 *)(s1 + 0x6 / 0xA / 0xE)` (which is what makes the loads `lhu`). + * + * The target stores each of sp+0x20/0x22/0x24 TWICE — a plain copy first, + * then the copy plus the rotated component — so the source assigns the + * position, then `+=` the delta as separate statements (the local's address + * is taken, so gcc-2.7.2 cannot kill the first store). + */ + +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern s32 func_8012CEB0(void *a0, void *a1, s32 a2); +extern s32 func_800132BC(void *a0, void *a1); + +s32 func_801819B4(s32 a0, s32 a1) { + + extern s16 D_8019EBE4[][4]; + extern s32 D_801BA730; + s32 s0 = a0; + s16 v10[4]; /* sp+0x10 SVECTOR — ApplyMatrixSV out */ + s16 v18[4]; /* sp+0x18 SVECTOR — segment start */ + s16 v20[4]; /* sp+0x20 SVECTOR — segment end */ + s32 r; + + ApplyMatrixSV((void *)(*(s32 *)(s0 + 0x20) + 0x34), D_8019EBE4[a1], v10); + v18[0] = *(u16 *)(s0 + 0x6); + v18[1] = *(u16 *)(s0 + 0xA); + v18[2] = *(u16 *)(s0 + 0xE); + v20[0] = *(u16 *)(s0 + 0x6); + v20[1] = *(u16 *)(s0 + 0xA); + v20[2] = *(u16 *)(s0 + 0xE); + v20[0] = v20[0] + v10[0]; + v20[1] = v20[1] + v10[1]; + v20[2] = v20[2] + v10[2]; + r = func_8012CEB0(v18, v20, 0); + D_801BA730 = func_800132BC(v18, v20); + return r != 0x2000; +} + + + +extern void (*D_8019EC24[])(void); + +void func_80181A94(void *a0) { + D_8019EC24[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181AD0); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181C5C); + + +extern void func_8012C218(void *a0); +extern void func_8012E8A8(u8 *a0); + +/* §48-C2: lwl/lwr/swl/swr block copy == a plain struct assign of a 2-byte-aligned struct */ +typedef struct { u16 a, b, c, d, e, f; } UAlign12_80181F40; +typedef struct { u16 a, b, c, d; } UAlign8_80181F40; + +void func_80181F40(s32 param_1) +{ + s32 t1 = *(s32 *)(param_1 + 0x64); + s32 pad[2]; + + if (*(s16 *)(t1 + 0x36) != *(s16 *)(param_1 + 0x10A)) { + func_8012C218((void *)param_1); + return; + } + { + if ((*(u32 *)(t1 + 0xE0) & 4) != 0) { + func_8012E8A8((u8 *)param_1); + return; + } + { + s32 a2 = *(s32 *)(*(s32 *)(t1 + 0x20) + 0x20); + s32 a3 = param_1 + 0xFC; + + if (a2 != 0) { + if ((a2 & 0x1000000) != 0) { + s32 a1 = a2 & 0xFEFFFFFF; + register u32 v0 __asm__("$2"); + u32 a0; + u32 v1a; + u32 v1b; + u32 v0b; + u32 v1; + + *(u16 *)(param_1 + 0x102) = *(u16 *)(a1 + 0x66); + + v0 = *(u32 *)(a1 + 0x60); + a0 = *(u8 *)(a1 + 0x61); + v1a = (v0 & 0xF) << 8; + a0 = a0 | v1a; + v1b = ((s32)v0 >> 16) & 0xFF; + v0b = (v0 & 0xF0) << 4; + v1 = v1b | v0b; + *(u16 *)(param_1 + 0x104) = (u16)a0; + *(u16 *)(param_1 + 0x106) = (u16)v1; + + *(s16 *)(param_1 + 0xFC) = (s8)*(u8 *)(a1 + 0x63); + *(s16 *)(param_1 + 0xFE) = (s8)*(u8 *)(a1 + 0x64); + *(s16 *)(param_1 + 0x100) = (s8)*(u8 *)(a1 + 0x65); + } else { + *(UAlign12_80181F40 *)(param_1 + 0xFC) = *(UAlign12_80181F40 *)(a2 + 0x90); + } + *(s32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = a3; + } + + if ((*(u32 *)(t1 + 0xE0) & 0x80) != 0) { + if (*(u16 *)(param_1 + 0x34) == 0) { + s16 sVar2 = *(u16 *)(param_1 + 0x108) + 0x40; + *(s16 *)(param_1 + 0x108) = sVar2; + if (sVar2 > 0x200) { + *(u16 *)(param_1 + 0x108) = 0x200; + *(s16 *)(param_1 + 0x34) = *(s16 *)(param_1 + 0x34) + 1; + } + } else { + u16 uVar3 = *(u16 *)(param_1 + 0x108) - 0x80; + *(u16 *)(param_1 + 0x108) = uVar3; + if ((s16)uVar3 < 0) { + *(u16 *)(param_1 + 0x108) = 0; + *(u16 *)(param_1 + 0x34) = 0; + *(u32 *)(t1 + 0xE0) = *(u32 *)(t1 + 0xE0) & ~0x80; + } + } + } + + *(u16 *)(a3 + 6) = *(u16 *)(a3 + 6) + *(u16 *)(param_1 + 0x108); + + *(u32 *)(param_1 + 4) = *(u32 *)(t1 + 4); + *(u32 *)(param_1 + 8) = *(u32 *)(t1 + 8); + *(u32 *)(param_1 + 0xC) = *(u32 *)(t1 + 0xC); + + *(UAlign8_80181F40 *)(param_1 + 0x50) = *(UAlign8_80181F40 *)(t1 + 0x50); + + { + s32 dst = *(s32 *)(param_1 + 0x20); + s32 src = *(s32 *)(t1 + 0x20); + *(UAlign8_80181F40 *)(dst + 0x10) = *(UAlign8_80181F40 *)(src + 0x10); + } + { + s32 dst = *(s32 *)(param_1 + 0x20); + s32 src = *(s32 *)(t1 + 0x20); + *(UAlign8_80181F40 *)(dst + 0x18) = *(UAlign8_80181F40 *)(src + 0x18); + } + { + s32 src = *(s32 *)(t1 + 0x20); + s32 dst = *(s32 *)(param_1 + 0x20); + *(u32 *)(dst + 4) = *(u32 *)(src + 4); + } + { + s32 src = *(s32 *)(t1 + 0x20); + s32 dst = *(s32 *)(param_1 + 0x20); + *(u16 *)(dst + 0x2C) = *(u16 *)(src + 0x2C); + } + } + } +} + + + +extern void (*D_8019ED7C[])(void); + +void func_801821F8(void *a0) { + D_8019ED7C[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182234); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801823A4); + + +extern void func_8012C218(void *a0); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80183170(s32 a0, s32 a1); +extern s32 func_8012B8E4(s32 a0, s32 a1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012CBF4(s32 a0); +extern void func_8012B178(s32 a0, s32 a1); +extern u8 *func_8012913C(s32 a0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); + + +void func_8018240C(s32 param_1) { + + extern u8 D_8019ECF4; + extern u8 D_8019EDA8[]; + extern u16 D_80126CB4; + extern u16 D_80126CB6; + extern u16 D_80126CB8; + u16 uVar1; + + if (0xf < *(s16 *)(param_1 + 0xA)) { + func_8012C218((void *)param_1); + return; + } + + { + s32 base = (s32)&D_8019ECF4; + s32 r = func_8012D5E4(param_1, base, base + 8, 0x78); + if (r == 1 || (*(u16 *)(param_1 + 0x5C) & 1) != 0) { + func_80183170(param_1, 1); + func_8012C218((void *)param_1); + return; + } + } + + uVar1 = *(u16 *)(param_1 + 0x34); + switch (uVar1) { + default: + return; + case 0: + { + s32 sVar3 = func_8012B608((s32)*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x10), 0, 0x18); + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + sVar3; + } + { + s32 r = func_8012CBF4(param_1); + if (r != 0) { + goto LAB_8018847c; + } + } + { + s32 r = func_8012BEE8(param_1); + if (r == 0) return; + } + *(u16 *)(param_1 + 0xF4) = D_80126CB4; + *(u16 *)(param_1 + 0xF6) = D_80126CB6; + { + u16 tmp = D_80126CB8; + *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; + *(s32 *)(param_1 + 0x1C) = 0x3C; + *(u16 *)(param_1 + 0xF8) = tmp; + } + return; + case 1: + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) += func_8012B8E4(param_1, 0x20); + { + s32 r = func_8012BEE8(param_1); + if (r != 0) { + *(s32 *)(param_1 + 0x1C) = 0x5A; + *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; + } + } + break; + case 2: + break; + } + + *(u16 *)(param_1 + 0xF2) = *(u16 *)(param_1 + 0xF2) - 0x100; + func_8012B178(param_1, 0xFFEC0000); + { + s32 r = func_8012CBF4(param_1); + if (r != 0) goto LAB_8018847c; + } + if (*(u16 *)(param_1 + 0x34) != 2) goto LAB_80188494; + { + s32 r = func_8012BEE8(param_1); + if (r != 1) goto LAB_80188494; + } +LAB_8018847c: + *(u16 *)(param_1 + 2) = 9; + func_80183170(param_1, 1); + return; +LAB_80188494: + { + s32 iv = (s32)func_8012913C(0x80); + if (iv == 0) return; + { + u16 out[4]; + ((void (*)(s32, void *, void *))func_8012F214)(param_1, D_8019EDA8, out); + *(u16 *)(iv + 6) = out[0]; + *(u16 *)(iv + 0xA) = out[1]; + *(u16 *)(iv + 0xE) = out[2]; + } + return; + } +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182664); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801826C4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801827FC); + + +// @class: struct +// @stuck: none — MATCH (276 ins, relocation-masked). Verified BOTH standalone (match_one) and +// spliced into src/ov_SC06_018/ov_SC06_018_jr_8017C24C.c (whole-TU cc1 -O2 clean, +// masked structured_diff 0/276). +// Keys: (1) the first func_8012C218 call gets a NOP delay slot because reload_cse_regs deletes the +// redundant `move a0,s1` -- $a0 still holds the incoming param on the fall-through path +// (no CODE_LABEL between the prologue and the jal). The second call site is behind a +// label, so the move survives. Source is the natural `func_8012C218((void *)param_1)` at +// BOTH sites -- do NOT write a zero-arg call (it also breaks in-TU: the composite type +// from the earlier file-scope `extern void func_8012C218(void *a0);` rejects 0 args). +// (2) case 0's guard is an `||` with an early return -- that is what puts `beqz -> fail` then +// `beq -> ok` (an `&&` would emit `bne -> fail`). +// (3) `register s32 sVar2 __asm__("$2")` holds the p+0x34 reload in cases 1/2 so the two arms +// cross-jump into the shared .L80188928 tail. +// (4) `__asm__ __volatile__("")` after the func_8012C658 arm forces the `lw v1,0x1C(s1)` +// reload before the cross-jumped `li v0,9` (§21 zero-byte re-tie). +// (5) `-((iVar3 << 0x10) / 0x22)` reproduces the 0x78787879/sra-4 magic-divide by 34 + negu. +// (6) `*p * 0xc` then `>>4` with the manual `if (x<0) x+=0xf` is the /16 rounding form. + +extern void func_8012C218(void *a0); +extern void func_801834F0(s32, void*, void*, s32); +extern s32 func_80013328(s32 a0, s32 a1); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012CC64(s32 a0, s32 a1); /* fleet-canonical: void; $v0 used -> cast at use */ +extern s32 func_8012C658(s32, s32, s32); +extern s32 func_80143B6C(s32 a0, s32 a1); /* fleet-canonical */ +extern s32 func_8012BEE8(s32 a0); +extern void func_80016714(void*, s32); +extern void func_80183170(s32 a0, s32 a1); + + +void func_80182820(s32 param_1) { + + extern u8 D_801B6AA8; + extern u8 D_8019ED1C; + extern u8 D_8019ED24; + extern u8 D_8019ED14; + extern u8 D_80126B5C; + u16 uVar1; + register s32 sVar2 __asm__("$2"); + s32 iVar3; + s32 iVar4; + s32 iVar5; + u32 uVar4; + s32 psVar5; + u16 buf[8]; + s32 vec[3]; + + if (0xf < *(s16 *)(param_1 + 0xA)) { + func_8012C218((void *)param_1); + return; + } + uVar1 = *(u16 *)(param_1 + 0x34); + switch (uVar1) { + case 0: + psVar5 = *(s32 *)(param_1 + 0x64); + if ((*(u16 *)psVar5 == 0) || + (*(s32 *)(psVar5 + 0x90) != (s32)&D_801B6AA8)) { + func_8012C218((void *)param_1); + return; + } + if (*(s32 *)(psVar5 + 0x94) < 0x11) { + ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED1C, buf, 5); + *(s16 *)(param_1 + 6) = buf[0]; + *(s16 *)(param_1 + 0xA) = buf[1]; + *(s16 *)(param_1 + 0xE) = buf[2]; + return; + } + ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED24, buf, 4); + ((void (*)(void *, void *, void *, s32))func_801834F0)((void *)psVar5, (void *)&D_8019ED24, &buf[4], 5); + *(s16 *)(param_1 + 6) = + (s16)((*(s16 *)&buf[0] + *(s16 *)&buf[4]) >> 1); + *(s16 *)(param_1 + 0xA) = + (s16)((*(s16 *)&buf[1] + *(s16 *)&buf[5]) >> 1); + *(s16 *)(param_1 + 0xE) = + (s16)((*(s16 *)&buf[2] + *(s16 *)&buf[6]) >> 1); + if (*(s32 *)(psVar5 + 0x94) != 0x19) { + return; + } + *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; + vec[0] = 0; + vec[1] = 0xfff40000; + iVar3 = func_80013328((s32)&D_80126B5C, param_1 + 4); + vec[2] = -((iVar3 << 0x10) / 0x22); + func_8012B14C(param_1, (s32)vec); + *(s32 *)(param_1 + 0x48) = 0xc000; + return; + case 1: + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + 0x80; + iVar3 = ((s32 (*)(s32, s32))func_8012CC64)(param_1, (s32)&D_8019ED14); + if (iVar3 == 0) { + return; + } + sVar2 = *(u16 *)(param_1 + 0x34); + *(s32 *)(param_1 + 0x1c) = 0; + *(u16 *)(param_1 + 0x34) = sVar2 + 1; + return; + case 2: + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + 0x40; + uVar4 = ((s32 (*)(s32, s32))func_8012CC64)(param_1, (s32)&D_8019ED14); + if ((uVar4 & 0x2000) == 0) { + return; + } + iVar4 = *(s32 *)(param_1 + 0x1c) + 1; + *(s32 *)(param_1 + 0x1c) = iVar4; + if (iVar4 >= 4) { + sVar2 = *(u16 *)(param_1 + 0x34); + *(s32 *)(param_1 + 0x1c) = 0x1e; + *(u16 *)(param_1 + 0x34) = sVar2 + 1; + return; + } + iVar3 = *(s32 *)(param_1 + 0x10) * 0xc; + if (iVar3 < 0) { + iVar3 = iVar3 + 0xf; + } + *(s32 *)(param_1 + 0x10) = iVar3 >> 4; + iVar5 = *(s32 *)(param_1 + 0x18) * 0xc; + if (iVar5 < 0) { + iVar5 = iVar5 + 0xf; + } + *(s32 *)(param_1 + 0x18) = iVar5 >> 4; + *(s32 *)(param_1 + 0x14) = -(0x80000 / *(s32 *)(param_1 + 0x1c)); + func_80143B6C(param_1, 1); + return; + case 3: + uVar4 = *(u32 *)(param_1 + 0x1c); + if ((uVar4 - 0xe < 0xb) && ((uVar4 & 1) == 0)) { + ((void (*)(s32, s32, s32))func_8012C658)(0x2a8, (s32)*(s16 *)(param_1 + 0x104), param_1); + *(u16 *)(param_1 + 0x104) = *(u16 *)(param_1 + 0x104) + 1; + __asm__ __volatile__(""); + uVar4 = *(u32 *)(param_1 + 0x1c); + } + if (uVar4 == 9) { + *(u32 *)(*(s32 *)(param_1 + 0xcc) + 4) = + *(u32 *)(*(s32 *)(param_1 + 0xcc) + 4) & 0x7fffffff; + *(s16 *)(*(s32 *)(param_1 + 0xcc) + 8) = *(u16 *)(param_1 + 6); + *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0xa) = + *(u16 *)(param_1 + 0xa) - 0x24; + *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0xc) = *(u16 *)(param_1 + 0xe); + } + if (*(s32 *)(param_1 + 0x1c) - 4U < 6) { + *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0x18) = + *(u16 *)(*(s32 *)(param_1 + 0xcc) + 0x18) + 0x200; + *(s16 *)(*(s32 *)(param_1 + 0xcc) + 0x1a) = + *(u16 *)(*(s32 *)(param_1 + 0xcc) + 0x1a) + 0x200; + } + iVar3 = func_8012BEE8(param_1); + if (iVar3 != 1) { + return; + } + ((void (*)(s32, s32))func_80016714)(*(s32 *)(param_1 + 0xcc), 0x38); + *(s16 *)(param_1 + 2) = 9; + func_80183170(param_1, 0); + return; + } + return; +} + + + +extern void func_80049CAC(s32, s32); +extern void func_800484EC(s32, s32, s32); +extern void func_8012B260(u8 *a0); + +void func_80182C70(s32 p) { + s32 g10[4]; /* sp+0x10 */ + u16 g20[4]; /* sp+0x20 */ + s32 buf28[8]; /* sp+0x28 */ + u16 v; + + g10[2] = 0xFFF00000; + g10[1] = 0; + g10[0] = 0; + g20[0] = 0x10; + v = *(u16 *)(*(s32 *)(*(s32 *)(p + 0x64) + 0x20) + 0x12) + + *(u16 *)(p + 0xFC); + g20[1] = v; + *(u16 *)(p + 0xFE) = v; + g20[2] = 0; + ((void (*)(void *, void *))func_80049CAC)(g20, buf28); + ((void (*)(void *, void *, s32))func_800484EC)(buf28, g10, p + 0x10); + *(u16 *)(p + 2) = 8; + *(s32 *)(p + 0x1C) = 0x40; + ((void (*)(s32))func_8012B260)(p); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182D0C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182EC4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182F00); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80182F80); + + +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_8012B0B4(unsigned int *p, int a1, int a2); +extern void func_80049CAC(s32, s32); +extern void func_800484EC(s32, s32, s32); +extern s32 func_8012C658(s32, s32, s32); +extern void func_80183FD0(s32 a0, s32 a1); +extern s32 rand(void); + +void func_80183170(s32 a0, s32 a1) { + s32 buf10[8]; /* sp+0x10 (0x20) - func_80049CAC out / func_800484EC in */ + s32 g40[4]; /* sp+0x30, only [0..2] used - func_800484EC vec3 arg */ + u16 g30[4]; /* sp+0x40, only [0..2] used - func_80049CAC vec3 arg */ + unsigned int buf48[2]; /* sp+0x48 (8) - func_8012B0B4 output */ + unsigned int *p48; + s32 i; + s32 baseY; + s32 e; + u32 uVar; + s32 scratch; + s32 tmp; + + i = 0; + p48 = buf48; + baseY = 0x100; + do { + e = func_80132EF4(a0, 0x23); + if (e != 0) { + *(s16 *)(e + 0x34) = rand() % 0x4000 + 0x1000; + *(u16 *)(*(s32 *)(e + 0x20) + 0x2c) = 0xc008; + + func_8012B0B4(p48, rand() % 0x1000, rand() % 0x58); + + tmp = *(s32 *)buf48; + *(s16 *)(e + 6) = *(s16 *)(e + 6) + (s16)tmp; + *(s16 *)(e + 0xe) = *(s16 *)(e + 0xe) + (s16)(tmp >> 16); + + tmp = rand(); + scratch = tmp % 0x80; + uVar = rand(); + g30[0] = (uVar & 1) == 0 ? -scratch + 0x400 : scratch + 0x400; + + scratch = rand() % 0xc0; + uVar = rand(); + g30[1] = (uVar & 1) != 0 ? baseY + scratch : baseY - scratch; + + g30[2] = 0; + g40[1] = 0; + g40[0] = 0; + g40[2] = (rand() % 4 + 3) << 16; + + ((void (*)(void *, void *))func_80049CAC)(g30, buf10); + ((void (*)(void *, void *, s32))func_800484EC)(buf10, g40, e + 0x10); + } + i++; + baseY += 0x200; + } while (i < 8); + + e = func_80132EF4(a0, 0x23); + if (e != 0) { + *(u16 *)(e + 0x34) = 0x7ff1; + *(u16 *)(*(s32 *)(e + 0x20) + 0x2c) = 0xc004; + *(s32 *)(e + 0x14) = 0xfffb0000; + } + + i = 0; + do { + func_8012C658(0x29d, (u16)a1, a0); + i++; + } while (i < 4); + + func_80183FD0(a0, 0x95e); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801833F4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_8018348C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801834F0); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_8018353C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_801835BC); + + +extern void (*D_8019EDB0[])(void); + +void func_80183624(void *a0) { + D_8019EDB0[*(u16 *)((s32)a0 + 0x2)](); +} + + + + +extern s32 rand(void); +extern void func_8012C1B8(void); +extern void func_8012CAE4(void*); +extern void func_8001C214(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void func_8012B178(s32 a0, s32 a1); + +void func_80183660(s32 param_1) { + + extern u8 D_8019EDB8[]; + s32 unused[2]; /* dead 8-byte local — frame padding (cookbook idiom 6) */ + s32 obj; + s16 raw; + s32 r; + s32 sgn; + s32 v; + u8 *tbl; + s16 *p; + s32 q; + s32 w; + + obj = ((s32 (*)(void))func_8012C1B8)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + return; + } + *(s32 *)(param_1 + 0x20) = obj; + func_8001C214(obj, 0); + + raw = rand(); + r = raw; + *(u16 *)(obj + 0x2C) = *(u16 *)(obj + 0x2C) | 0x10; + v = r % 384 + 0x400; + *(s16 *)(obj + 0x1C) = v; + *(s16 *)(obj + 0x1A) = v; + *(s16 *)(obj + 0x18) = v; + sgn = -1; + if (raw & 1) { + sgn = 1; + } + *(s16 *)(obj + 0x10) = sgn * (r % 128) - 0x300; + *(s16 *)(obj + 0x12) = r % 4096; + *(s32 *)(param_1 + 0x48) = 0xC000; + *(u16 *)(param_1 + 0xA) = *(u16 *)(param_1 + 0xA) - 0x19; + func_8012B2CC(param_1); + func_8012B178(param_1, -0xC0000 - ((r % 8) << 16)); + *(s32 *)(param_1 + 0x1C) = 0x3C; + *(s16 *)(param_1 + 0xFE) = rand() & 0xF0; + *(s16 *)(param_1 + 0x100) = rand() & 0x1F0; + *(s16 *)(param_1 + 0x102) = rand() & 0x30; + tbl = &D_8019EDB8[(*(u16 *)(param_1 + 0x70) & 0xF) * 4]; + + p = (s16 *)(param_1 + 0xDC); + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q - 0x18; + } else { + w = q - 0x18; + } + p[0] = w; + p[1] = 0; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q - 0x18; + } else { + w = q - 0x18; + } + p[2] = w; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q + 0x18; + } else { + w = q + 0x18; + } + p[4] = w; + p[5] = 0; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q - 0x18; + } else { + w = q - 0x18; + } + p[6] = w; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q - 0x18; + } else { + w = q - 0x18; + } + p[8] = w; + p[9] = 0; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q + 0x18; + } else { + w = q + 0x18; + } + p[10] = w; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q + 0x18; + } else { + w = q + 0x18; + } + p[12] = w; + p[13] = 0; + + q = rand() % 12; + if ((rand() & 1) == 0) { + w = -q + 0x18; + } else { + w = q + 0x18; + } + p[14] = w; + + *((u8 *)p + 0x20) = tbl[0]; + *((u8 *)p + 0x21) = tbl[1]; + *((u8 *)p + 0x22) = tbl[2]; + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + + +extern s32 func_8012CBF4(s32 a0); +extern s32 func_8012BEE8(s32 a0); +extern void func_8012C218(void *a0); /* TU-canonical (ov_SC06_018_jr_8017C24C L5455) */ +extern void func_80017274(s32 a0, s32 a1); + +void func_80183AC4(s32 param_1) { + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10) + *(u16 *)(param_1 + 0xFE); + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12) + *(u16 *)(param_1 + 0x100); + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) + *(u16 *)(param_1 + 0x102); + + if (func_8012CBF4(param_1) != 0 || func_8012BEE8(param_1) != 0) { + func_8012C218((void *)param_1); + } else { + func_80017274(param_1 + 0xDC, *(s32 *)(param_1 + 0x20) + 0x34); + } +} + + + +extern void (*D_8019EDD0[])(void); + +void func_80183B68(void *a0) { + D_8019EDD0[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80183BA4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80183D98); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80183ED4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80183FD0); + + +extern void (*D_8019EDDC[])(void); + +void func_8018413C(void *a0) { + D_8019EDDC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80184178(s32 param_1) { + + extern u8 D_800D387C[]; + extern u8 D_800D3888[]; + s32 t; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x50000000; + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + t = *(s32 *)(param_1 + 0x20); + *(u16 *)(t + 0x1a) = 0x2000; + *(u16 *)(t + 0x18) = 0x2000; + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x24) = 0xff; + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x25) = 0; + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x26) = 0; + + func_80128EA8(*(s32 *)(param_1 + 0x20), param_1 + 0x24, (s32)&D_800D3888); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + + +extern void func_8012931C(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_801292C8(s32 a0); + +void func_80184228(s32 param_1) { + s32 q; + u8 a; + u8 b; + u16 h; + + q = *(s32 *)(param_1 + 0x20); + + a = *(u8 *)(q + 0x24) - 0x20; + *(u8 *)(q + 0x24) = a; + if (a < 0x80) { + *(u8 *)(q + 0x24) = 0x80; + } + + b = *(u8 *)(q + 0x25) + 0x20; + *(u8 *)(q + 0x25) = b; + if (b > 0x80) { + *(u8 *)(q + 0x25) = 0x80; + } + + h = *(u16 *)(q + 0x1A) + 0x400; + *(u8 *)(q + 0x26) = *(u8 *)(q + 0x25); + *(u16 *)(q + 0x1A) = h; + *(u16 *)(q + 0x18) = h; + + func_8012931C(param_1); + + if (func_80128ED8((void *)q, (void *)(param_1 + 0x24)) != 0) { + func_801292C8(param_1); + } +} + + + +extern s32 D_801BA878; +extern s32 func_8012C588(s32 a0, s32 a1); + +s32 func_801842E0(s32 a0, s32 a1) { + D_801BA878 = a1; + return func_8012C588(0x85, a0); +} + + +extern u8 D_801152A8[]; +extern s32 D_801BA878; +extern s32 func_80017DC4(void *a0, void *a1); +extern void func_80017E68(void *a0, void *a1); +extern void func_800D20C0(void *a0, void *a1, s32 a2); +extern void func_800D23D0(void *a0); +extern void func_8012A828(s32 a0, void *a1); +extern void func_8012C218(void *a0); +extern void func_8012F14C(s32); +extern s32 func_80134510(s32 arg); + +// @class: regalloc-order +// @stuck: none — MATCH (145/145 ins, match_one confirmed) + + + + +s32 func_80184310(s32 param_1) { + + extern M2C_UNK D_80185388; + extern s32 func_8012C354(s32 a0, s32 a1); + extern void RotMatrixZ(s32, void *); + extern void MulMatrix0(s32, void *, s32); + extern s32 D_801B6BE4; + extern char * D_801B6C18; + extern char D_801BA858[]; + + S8_80184F08 s60; + SVECTOR_80184F08 sStack_58; + S8_80184F08 s50; + int auStack_48[8]; + s32 iVar5, iVar8; + char *puVar2, *puVar4; + u16 uVar3; + + if (((s32 (*)(s32, void *))func_8012C354)(param_1, &D_801B6BE4) == 0) { + ((void (*)(s32))func_8012C218)(param_1); + } + ((void(*)(s32, void *))func_8012A828)(param_1, &(*(s32 *)&D_80185388)); + iVar5 = *(s32 *)(param_1 + 0x20); + *(s16 *)(param_1 + 0x70) = 0x80; + *(s32 *)(iVar5 + 4) |= 0x50000040; + *(u16 *)(iVar5 + 0x2c) |= 1; + iVar8 = *(s32 *)(*(s32 *)(param_1 + 0x64) + 0x20) + 0x34; + ((void (*)(s32, s32, void *))func_8012F14C)(iVar8, D_801BA878, &s60); + s50 = s60; + sStack_58.vz = 0x1800; + sStack_58.vy = 0x1800; + sStack_58.vx = 0x1800; + ((void (*)(void *, void *))func_80017DC4)(&sStack_58, auStack_48); + RotMatrixZ(rand() & 0xfff, auStack_48); + MulMatrix0(iVar8, auStack_48, iVar5 + 0x34); + ((void (*)(void *, s32))func_80017E68)(&s50, iVar5 + 0x34); + + /* pool-alloc: gcc routes the loaded pointer through a caller-saved reg ($v0) + before the callee-saved home ($s1) — pin it to reproduce the extra move. */ + { + register char *tmp __asm__("$2"); + tmp = D_801B6C18; + puVar2 = tmp; + } + puVar4 = puVar2 + 0x20; + D_801B6C18 = puVar4; + *(char **)(param_1 + 0xcc) = puVar2; + if (D_801BA858 < puVar4) { + D_801B6C18 = D_801BA858 - 0x120; + } + func_800D20C0(&s60, &sStack_58, 7); + func_800D23D0(&sStack_58); + ((void(*)(void *, void *))RotMatrixYXZ)(&sStack_58, puVar2); + ((void (*)(void *, s32))func_80017E68)(&s60, (s32)puVar2); + + uVar3 = *(u16 *)((char *)&s50 + 2); + if (((s32 (*)(void *))func_80134510)(&s50) != 0 && + (s32)(s16)uVar3 - (s32)*(s16 *)((char *)&s50 + 2) < 0x80) { + *(s16 *)((char *)&s50 + 2) = *(s16 *)((char *)&s50 + 2) - 4; + { + register char *tmp __asm__("$3"); + tmp = D_801B6C18; + puVar2 = tmp; + } + puVar4 = puVar2 + 0x20; + D_801B6C18 = puVar4; + *(char **)(param_1 + 0xd0) = puVar2; + if (D_801BA858 < puVar4) { + D_801B6C18 = D_801BA858 - 0x120; + } + func_800D23D0(&(*(s32 *)&D_801152A8)); + ((void(*)(void *, void *))RotMatrixYXZ)(&(*(s32 *)&D_801152A8), puVar2); + ((void (*)(void *, s32))func_80017E68)(&s50, (s32)puVar2); + } + *(s16 *)(param_1 + 2) = *(s16 *)(param_1 + 2) + 1; +} + + +extern s32 func_80017758(void *a0, void *a1); +extern void func_8012C218(void *a0); + + +// @class: regalloc-order +// @stuck: none — MATCH (168 ins). Keys: (1) pin param->$s1 via `register int self __asm__("$17")=param_1` +// (natural alloc put the short loop-counter in $s1); (2) block2's guarded dest via a test-temp +// `td=load; if(td){dest=td; ...}` forces the range-split `lw $a1; addu $s3,$a1,$0` the target has; +// (3) counter is `short i` do-while (keeps the `addu $s2,$v0,$0` raw-copy + sll16/sra16 compare); +// (4) gcc-2.7.2 loads s8/s16 via lbu/lhu+shift-extend (not lb/lh) so `signed char *p; *(s16*)buf=*p++` +// emits lbu;sll24;sra24;sh; (5) else-branch zero-byte asm barrier forces `addu $a0,$s1,$0` (else gcc +// reuses the still-live incoming $a0 with a nop delay slot). + +s32 func_80184554(s32 param_1) { + + extern signed char D_801B6BD0[]; + register int self __asm__("$17") = ((int)param_1); + int iVar6; + int iVar1; + unsigned char buf[0x34]; + signed char *p; + short i; + int dest; + int td; + unsigned short t; + + iVar1 = *(int *)(self + 0x1c); + iVar6 = *(int *)(self + 0x20); + *(int *)(self + 0x1c) = iVar1 + 1; + if (iVar1 < 2) { + p = D_801B6BD0; + i = 0; + dest = *(int *)(self + 0xcc); + t = *(unsigned short *)(self + 0x70); + *(short *)(buf + 0x0c) = 0; + *(short *)(buf + 0x0a) = 0; + *(short *)(buf + 0x08) = 0; + *(short *)(buf + 0x1c) = 0; + *(short *)(buf + 0x14) = 0; + *(short *)(buf + 0x04) = 0; + buf[0x22] = 0; + buf[0x21] = 0; + buf[0x20] = 0; + buf[0x2a] = 0; + buf[0x29] = 0; + buf[0x28] = 0; + buf[0x2e] = 0; + buf[0x2d] = 0; + buf[0x2c] = 0; + *(int *)(buf + 0x30) = 0x50000000; + buf[0x25] = t; + buf[0x26] = t; + buf[0x24] = t; + do { + *(short *)(buf + 0x00) = *p++; + *(short *)(buf + 0x02) = *p++; + *(short *)(buf + 0x10) = *p++; + *(short *)(buf + 0x12) = *p++; + *(short *)(buf + 0x18) = *p++; + *(short *)(buf + 0x1a) = *p--; + func_80017758(buf, (void *)dest); + i++; + } while (i < 4); + + td = *(int *)(self + 0xd0); + if (td != 0) { + dest = td; + p = D_801B6BD0; + i = 0; + t = *(unsigned short *)(self + 0x70); + *(short *)(buf + 0x0c) = 0; + *(short *)(buf + 0x0a) = 0; + *(short *)(buf + 0x08) = 0; + *(short *)(buf + 0x1c) = 0; + *(short *)(buf + 0x14) = 0; + *(short *)(buf + 0x04) = 0; + buf[0x22] = 0; + buf[0x21] = 0; + buf[0x20] = 0; + buf[0x2a] = 0; + buf[0x29] = 0; + buf[0x28] = 0; + buf[0x2e] = 0; + buf[0x2d] = 0; + buf[0x2c] = 0; + *(int *)(buf + 0x30) = 0x50000000; + buf[0x25] = t; + buf[0x26] = t; + buf[0x24] = t; + do { + *(short *)(buf + 0x00) = *p++; + *(short *)(buf + 0x02) = *p++; + *(short *)(buf + 0x10) = *p++; + *(short *)(buf + 0x12) = *p++; + *(short *)(buf + 0x18) = *p++; + *(short *)(buf + 0x1a) = *p--; + func_80017758(buf, (void *)dest); + i++; + } while (i < 4); + } + *(short *)(self + 0x70) = *(short *)(self + 0x70) >> 1; + *(unsigned short *)(iVar6 + 0x2c) |= 1; + } else { + __asm__ __volatile__("" : "=r"(self) : "0"(self)); + func_8012C218((void *)self); + } +} + + + +extern void (*D_801B6C1C[])(void); + +void func_801847F4(void *a0) { + D_801B6C1C[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801B7524[])(void); + +void func_80184830(void *a0) { + D_801B7524[*(u16 *)((s32)a0 + 0x2)](); +} + + + + +/* Declarations conform VERBATIM to the ones already present in + * src/ov_SC03_014/ov_SC03_014_jr_801848E4.c (lines 58, 2524, 2527, 3139, + * 3222, 3244, 3245). Type mismatches are resolved by casting AT THE USE. */ +extern s32 func_8012C354(s32 a0, s32 a1); +extern s32 func_80029178(s32 arg); +extern s32 func_801788B8(s32 arg0, s32 arg1); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012CAE4(void *a0); +extern void func_8012A828(s32 a0, void *a1); +/* not declared anywhere in the TU */ +extern void func_80184F18(void); + +void func_8018486C(void *a0) { + + extern s32 D_801B727C[]; + extern u8 D_801B7214[]; + extern u8 D_80185388[]; + s32 res1, res2, arr_elem; + void *ptr; + u16 idx; + s16 val; + + res1 = func_8012C354((s32)a0, (s32)D_801B7214); + if (res1 == 0) { + return; + } + + ptr = *(void **)((s32)a0 + 0xDC); + idx = *(u16 *)((s32)ptr + 0xA); + arr_elem = D_801B727C[idx]; + + res1 = func_80029178(arr_elem); + + if ((res1 & 0xFF) == 0) { + res2 = func_801788B8((s32)a0, (s32)func_80184F18); + *(s32 *)((s32)a0 + 0xCC) = res2; + } else { + val = *(s16 *)((s32)a0 + 0x70); + val |= 0x4000; + *(s16 *)((s32)a0 + 0x70) = val; + } + + res2 = func_8012C658(0x8F, *(s16 *)((s32)a0 + 0x70), (s32)a0); + *(s32 *)((s32)a0 + 0x6C) = res2; + + if (res2 == 0) { + func_8012CAE4(a0); + } else { + func_8012A828((s32)a0, D_80185388); + *(u16 *)((s32)a0 + 0x2) = 1; + } +} + + + + +s32 func_80184940(void *a0) { + void *p1, *p2; + u16 val; + long x; + + p1 = *(void **)(a0 + 0x20); + p2 = *(void **)(a0 + 0x6C); + val = *(u16 *)(p1 + 0x12); + p2 = *(void **)(p2 + 0x20); + val += 0x800; + val &= 0xFFF; + *(u16 *)(p2 + 0x12) = val; + x = 2; + *(u16 *)(a0 + 0x2) = x; + return x; +} + + +void func_80184968(void) { +} + + +/* Declarations copied VERBATIM from src/ov_SC03_014/ov_SC03_014_jr_801848E4.c + * (func_80029178 @ line 58/3176, func_80029124 @ line 43/3253, + * func_80178CBC @ line 2537). The D_801E3* globals are not declared + * anywhere in the TU. */ +extern s32 func_80029178(s32 arg); +extern void func_80029124(s32 a0, s32 a1); +extern void func_80178CBC(s32 arg0, s32 arg1); + +void func_80184970(void *a0) { + + extern s32 D_801B7460; + extern s32 D_801B744C; + extern s32 D_801B7448; + extern s32 D_801B74E0; + extern s32 D_801B7474; + extern s32 D_801B7340[]; + extern s32 D_801B73C4[]; + s32 *s0; + s32 *p; + u16 v0; + + s0 = *(s32 **)((char *)a0 + 0xDC); + v0 = *(u16 *)((char *)s0 + 0x8); + + if (!(v0 & 0x8000)) { + v0 = (func_80029178(0x1D)) & 0xFF; + + if (v0 != 0) { + u16 flags2; + D_801B7460 = *(s32 *)((char *)s0 + 0x4); + flags2 = *(u16 *)((char *)s0 + 0x8); + + if (!(flags2 & 0x4000)) { + v0 = *(u16 *)((char *)s0 + 0xC); + D_801B7448 = 0; + D_801B744C = D_801B73C4[v0]; + } else { + D_801B744C = 0; + v0 = *(u16 *)((char *)s0 + 0xC); + func_80029124(D_801B73C4[v0], 1); + D_801B7448 = 2; + } + } else { + D_801B7460 = *(s32 *)((char *)s0 + 0x0); + v0 = *(u16 *)((char *)s0 + 0xC); + D_801B7448 = 0; + D_801B744C = D_801B7340[v0]; + } + + func_80178CBC((s32)a0, (s32)&D_801B7474); + } else { + p = &D_801B74E0; + *p = *(s32 *)((char *)s0 + 0x0); + func_80178CBC((s32)a0, (s32)(p - 7)); + } + + *(u16 *)(a0 + 0x2) = 4; + *(u16 *)(a0 + 0x70) |= 0x8000; +} + + + + +/* Declarations copied VERBATIM from src/ov_SC03_014/ov_SC03_014_jr_801848E4.c + * (lines 43, 45, 58, 65, 2528, 2538, 2712, 3177, 3282). + * Type mismatches resolved by casting AT THE USE (func_80178D18). */ +extern s32 func_801789AC(s32 arg0); +extern void func_80178D18(void); +extern s32 func_80029178(s32 arg); +extern void func_80029514(s32); +extern void func_80029124(s32, s32); +extern void func_80145EE8(s32 param_1); +extern void func_8012C218(void *a0); +extern s32 func_80184CC0(void); + +void func_80184ABC(void *arg0) { + + extern s32 D_801B727C[]; + extern void func_8002AC00(s32 arg0); /* not declared anywhere in the TU */ + s32 ptr; + + ptr = *(s32 *)((s32)arg0 + 0xDC); + + if (func_801789AC((s32)arg0) != 0) { + ((void (*)(void *))func_80178D18)(arg0); + + if ((u8)func_80029178(D_801B727C[*(u16 *)(ptr + 0xA)]) != 0) { + if (D_801B727C[*(u16 *)(ptr + 0xA)] == 0x54) { + func_80029514(0x5A); + func_80029124(0xEA, 1); + } + + if ((*(u16 *)(ptr + 0x8) & 0x4000) != 0) { + if ((u8)func_80029178(0x1D) != 0) { + func_80145EE8(0); + } + } + + if (func_80184CC0() == 1) { + func_8002AC00(0x26); + } + + *(u16 *)((s32)arg0 + 0x70) &= 0x8000; + func_8012C218(*(void **)((s32)arg0 + 0xCC)); + } + + *(u16 *)((s32)arg0 + 0x2) = 2; + } +} + + +extern void func_8012C218(void *a0); + void func_80184BDC(void * arg0) { + *(short *)((char *)arg0 + 0x2) = 2; + ((void (*)(s32 *))func_8012C218)(*(s32 **)((char *)arg0 + 0xcc)); + } + + +void func_80184C08(void *a0) { + *(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 1; + } + + +void func_80184C18(void *a0) { + *(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 2; + } + + + + +extern void func_80029124(s32, s32); + +void func_80184C28(void *a0) { + + extern s32 D_801B727C[]; + u16 idx = *(u16 *)(*(s32 *)(a0 + 0xDC) + 0xA); + func_80029124(D_801B727C[idx], 1); +} + + + +extern s32 D_80126B58; +extern void func_8014ADA8(s32 a0, s32 a1); + +void func_80184C68(void * arg0) { + s32 temp_v0; + + temp_v0 = *(s32 *)((s32)arg0 + 0xdc); + ((void (*)(s32 *, s32))func_8014ADA8)((s32 *)&D_80126B58, *(u16 *)(temp_v0 + 0xc)); +} + + +extern s16 func_80174764(void); +s32 func_80184C9C(void) { + return ((s32 (*)(void))func_80174764)() == 1; +} + + + + +extern s32 func_80029178(s32 arg); + +s32 func_80184CC0(void) { + + extern s32 D_801B727C[]; + s32 i; + + for (i = 0; i < 0x26; i++) { + if ((u8)func_80029178(D_801B727C[i]) == 0) { + return 0; + } + } + return 1; +} + + + +extern void (*D_801B754C[])(void); + +void func_80184D24(void *a0) { + D_801B754C[*(u16 *)((s32)a0 + 0x2)](); +} + + + + +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); + +void func_80184D60(void *a0) { + + extern u8 D_801B7248[]; + extern u8 D_801B7C0C[]; + extern u8 D_801B79EC[]; + s32 ptr; + unsigned short v1; + unsigned short v0; + + if (func_8012C354((s32)a0, (s32)D_801B7248) == 0) { + return; + } + + ptr = *(s32 *)((s32)a0 + 0x64); + v1 = *(unsigned short *)(ptr + 0x36); + v0 = *(unsigned short *)((s32)a0 + 0x70); + *(unsigned short *)((s32)a0 + 0xFC) = v1; + + if (v0 & 0x4000) { + func_8012A828((s32)a0, D_801B7C0C); + *(unsigned short *)((s32)a0 + 0x5C) = 0; + } else { + func_8012A828((s32)a0, D_801B79EC); + } + + *(unsigned short *)((s32)a0 + 0x2) = 1; +} + + + + +extern void func_8012C218(void *a0); +extern void func_8012A828(s32 a0, void *a1); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80184DE8(void *a0) { + + extern u8 D_801B79FC[]; + extern u8 D_801B7B04[]; + s16 mode; + + if (*(s16 *)((s32)a0 + 0xFC) != *(s16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36)) { + ((void (*)(void))func_8012C218)(); + return; + } + + mode = *(s16 *)((s32)a0 + 0xFE); + if (mode == 1) { + *(s16 *)((s32)a0 + 0x2) = 2; + *(s32 *)((s32)a0 + 0x1C) = 0x20; + func_8012A828((s32)a0, D_801B79FC); + *(s16 *)((s32)a0 + 0x5C) = 0; + func_8002D4C8(0x5BF, 0); + } else if (mode == 2) { + *(s16 *)((s32)a0 + 0x2) = 2; + *(s32 *)((s32)a0 + 0x1C) = 0x20; + func_8012A828((s32)a0, D_801B7B04); + *(u16 *)((s32)a0 + 0x5C) = 0x8C00; + } +} + + + +/* func_80184EA8 — guarded state-kick: if the s16 at 0x98 is clear, set the + * state word at 0x02 to 1, hand the entity to func_8012A828 with one of two + * script tables selected by the s16 flag at 0xFE (== 1 -> D_801B7C0C, else + * D_801B79EC), then clear that flag. + * + * §71 sibling-first: func_8018A06C (same TU, 0x148 bytes earlier) is the same + * two-arm `func_8012A828(entity, D_801B7C0C / D_801B79EC)` selector and pins + * the widths: `lh` at 0x98/0xFE, `sh` at 0x02. + */ + +extern void func_8012A828(s32 a0, void *a1); + +void func_80184EA8(void *a0) { + + extern u8 D_801B7C0C[]; + extern u8 D_801B79EC[]; + if (*(s16 *)((s32)a0 + 0x98) == 0) { + *(s16 *)((s32)a0 + 0x2) = 1; + if (*(s16 *)((s32)a0 + 0xFE) == 1) { + func_8012A828((s32)a0, D_801B7C0C); + } else { + func_8012A828((s32)a0, D_801B79EC); + } + *(s16 *)((s32)a0 + 0xFE) = 0; + } +} + + +extern s32 *D_80126B78; +extern u8 D_801B753C[]; +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80172710(void); +extern s32 func_80178BF8(); +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) + +s32 aF8018A224() __asm__("func_80184F18"); + +s32 aF8018A224(param_1) + void *param_1; +{ + s32 *m; + s32 obj; + s32 sv0[2]; + s32 sv1[2]; + s32 flag; + + m = (s32 *)((u8 *)D_80126B78 + 0x34); + obj = *(s32 *)((s32)param_1 + 0x64); + + gte_SetRotMatrix(m); + gte_SetTransMatrix(m); + + RotTransSV(D_801B753C, sv0, &flag); + RotTransSV(D_801B753C + 8, sv1, &flag); + + if (func_80135888(*(s32 *)(obj + 0x20), *(s32 *)(obj + 0x58), (s32)sv0, (s32)sv1) == 0) { + return 0; + } + if (func_8012BDBC(obj, 0x300) == 0) { + return 0; + } + *(s16 *)(obj + 0x2) = 3; + func_80178BF8(); + return (s32)func_80172710; +} + + + + + + diff --git a/src/ov_SC07_006/ov_SC07_006_jr_80135D20.c b/src/ov_SC07_006/ov_SC07_006_jr_80135D20.c index a37b969918..f79353724c 100644 --- a/src/ov_SC07_006/ov_SC07_006_jr_80135D20.c +++ b/src/ov_SC07_006/ov_SC07_006_jr_80135D20.c @@ -1529,732 +1529,3 @@ int func_80137D08(int arg0, int arg1, short arg2) DEFINE_func_80137DD4() /* dedup: shared engine-core @0x80137DD4 (src/shared) */ DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137fd8 (src/shared) */ - - -INCLUDE_ASM("asm/ov_SC07_006/nonmatchings/ov_SC07_006_jr_80135D20", func_801380E0); - -/* de-macroized: per-overlay-local decl for func_80138DE0 (byte-true sig); do NOT re-macroize */ - void func_801387B8(s32 arg0) { - extern s32 func_80138DE0(u8*, u8, s32); - extern s32 func_80139220(s32 a0); - extern void func_80138948(void *a0); - extern void func_80139A8C(s32 a0); - extern void func_80139B18(s32 a0); - extern s32 D_80127530[]; - u16 *p; - s32 base; - s32 cont; - u8 cmd; - s32 sub; - s32 pc; - for (;;) { - cont = 0; - 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 *)(base + pc); - sub = *(u8 *)(base + pc + 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); - *p += 1; - goto loop_end; - case 1: - cont = 1; - *(u8 *)(arg0 + 0x23) = sub; - *p += 2; - goto loop_end; - case 7: - if (!(*(s32 *)(arg0 + 8) & 0x20000)) { - *(s32 *)(arg0 + 8) &= ~0x20; - } - break; - case 23: - *(s32 *)(arg0 + 8) |= 2; - default: - cont = 1; - *p += 1; - goto loop_end; - } - } - func_80138948((void *)arg0); - } - loop_end: - if (cont == 0) { - func_80139A8C(arg0); - func_80139B18(arg0); - return; - } - } - } /* dedup: shared engine-core @0x801387B8 (src/shared) */ - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895c (src/shared) */ - - -/* de-macroized: per-overlay-local decl for func_80138DE0 (byte-true sig); do NOT re-macroize */ - extern s16 D_80127540[4]; - extern s32 func_80139D04(s32 a0, s32 a1); - extern s32 func_80138DE0(u8*, u8, s32); - extern void func_80139B18(s32 a0); - void func_80138AB4(s32 a0) { - u8 sp10[8]; - s32 s0 = a0; - s32 s1; - s32 a0v; - s1 = func_80139D04((s32)sp10, (u16)D_80127540[*(u16 *)(s0 + 0x48)]) & 0xFFFF; - do { - s32 v1 = *(u16 *)(s0 + 0x44); - a0v = 0; - if ((s32)v1 < s1) { - s32 a1v = (sp10[v1] + 0x30) & 0xFF; - a0v = func_80138DE0(s0, a1v, 0); - if (*(s32 *)(s0 + 0x8) & 0x80220) { - /* a0v stays */ - } else { - a0v = 0; - } - } else { - s32 t = *(u16 *)(s0 + 0x48); - if ((u32)t < 3) { - *(s16 *)(s0 + 0x48) = t + 1; - } - *(s16 *)(s0 + 0x4) = 2; - } - } while (a0v != 0); - func_80139B18(s0); - } /* dedup: shared engine-core @0x80138ab4 (src/shared) */ - - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138b88 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - - -void func_80138BE0(int p) -{ - - extern void (*D_8018AA10[])(void); - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018AA10[*(short *)(p + 4)](); -} - - -void func_80138C30(void *a0) { - if (*(s16 *)((s32)a0 + 4) == 4) { - *(s16 *)((s32)a0 + 4) = 2; - } else { - *(u32 *)((s32)a0 + 8) |= 0x800; - } -} - - -extern s32 func_80139BE0(s32); - -s32 func_80138C60(s32 arg0) -{ - typedef struct { - u8 b0; - u8 b1; - u8 b2; - u8 b3; - } Q_80138C60; - extern Q_80138C60 D_8018A9DC[]; - u16 t; - u8 b; - s32 f; - s32 idx; - - if (*(s32 *)(arg0 + 8) & 0x2000) { - return 1; - } - - t = *(u8 *)(arg0 + 0x22) & 7; - *(s16 *)(arg0 + 0x18) = t; - if (t < 2) { - *(u8 *)(arg0 + 0x20) = 0; - } - - f = *(s32 *)(arg0 + 8); - if (f & 0x40) { - *(u8 *)(arg0 + 0x22) = (*(u8 *)(arg0 + 0x22) & 0x67) | (f & ~0x67); - } - - b = *(u8 *)(arg0 + 0x22); - if (b & 0x80) { - idx = (b & 0x18) >> 3; - } else { - idx = (b & 0x78) >> 3; - if (b & 0x60) { - *(s16 *)(arg0 + 0x1C) = 0; - } - } - - *(Q_80138C60 *)(arg0 + 0x24) = D_8018A9DC[idx]; - - func_80139BE0(arg0); - func_80139C7C((u8 *)arg0); - return func_8013A8FC(arg0); -} - - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138d58 (src/shared) */ - - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138db8 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH -/* func_80138DE0 — advance the text cursor by 1 or 2 after emitting a glyph. - * - * Key levers (both required; the body itself is a plain if/else-if): - * - D_80127548 MUST be declared as an ARRAY (`extern s32 D_80127548[];`) and accessed as - * D_80127548[0]. As a scalar, gcc emits the assembler-macro form twice in the tail - * (lui+lw %lo / lui+sw %lo via $at, 8 insns); as an array the address is materialised once - * (la $v1 = lui+addiu) and the lw/sw use 0($v1), which is what the target does and is one - * instruction shorter. This is the §40b indexed-global idiom, and it is also the form the - * shared engine-core macro DEFINE_func_80138ED0() already uses for this same symbol. - * - arg1 is a byte param (u8): each use re-emits `andi ...,0xFF` (§I2), which is why the - * 0x20-subtraction path recomputes the mask instead of reusing $v1. - * - The 2nd argument of func_80138ED0 is u32, so the (u16) cast supplies the `andi 0xFFFF`. - * - The `if (arg2 != 0) return 0;` tail check is redundant on the two call paths; gcc's - * thread_jumps folds them straight to the return-0 tails (.L80138EB8 / .L80138EBC), and the - * `*p = ...` store is cross-jumped between the +2 and +1 arms. - */ -#include "common.h" - -extern s32 D_80127548[]; -extern u8 D_800D3AB4[]; -extern s32 func_80138ED0(u8 *param_1, u32 param_2, u8 *param_3); - -s32 func_80138DE0(u8 *arg0, u8 arg1, s32 arg2) { - u16 *p; - - if (D_80127548[0] == 0) { - return 0; - } - p = (u16 *)(arg0 + 0x44); - if ((*(u32 *)(arg0 + 8) & 0x400) == 0) { - p = (u16 *)(arg0 + 0x10); - if (*(s16 *)(arg0 + 4) == 8) { - p = (u16 *)(arg0 + 0x44); - } - } - if (arg1 >= 0xE0) { - arg2 = func_80138ED0(arg0, 0x1F, D_800D3AB4); - if (arg2 != 0) { - return 0; - } - *p = *p + 2; - } else if (arg1 >= 0x20) { - arg2 = func_80138ED0(arg0, (u16)(arg1 - 0x20), D_800D3AB4); - if (arg2 != 0) { - return 0; - } - *p = *p + 1; - } - if (arg2 != 0) { - return 0; - } - D_80127548[0] = D_80127548[0] - 1; - return D_80127548[0]; -} - - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ed0 (src/shared) */ - - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914c (src/shared) */ - - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391f0 (src/shared) */ - - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392c8 (src/shared) */ - - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392fc (src/shared) */ - - -DEFINE_func_801395D4() /* dedup: shared engine-core @0x801395D4 (src/shared) */ - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - - -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - - extern short D_800B9A02; - extern u8 D_800A6518[]; - extern u8 D_8018AA54; - extern u8 D_8018AA98; - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018AA54; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018AA98 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399a8 (src/shared) */ - - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399f0 (src/shared) */ - - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139a34 (src/shared) */ - - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139a44 (src/shared) */ - - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139a68 (src/shared) */ - - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139a8c (src/shared) */ - - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139b18 (src/shared) */ - - - -/* func_80139BE0 — ov_SC01_077 / ov_SC01_077_jr_801380E0, 39 ins, MATCH. - * - * REDRAFT of the decayed backlog draft: the stored draft was -1 instruction - * (LENGTH-DRIFT) because the target keeps a QI->SI zero-extend of the masked - * byte (`andi $a1,$v0,0xFF` after `andi $v0,$v0,0x60`) that gcc-2.7.2 folds - * away: combine proves nonzero_bits(x & 0x60) <= 0xff and simplifies the - * extend to nothing. No pure-C spelling survives that fold when the def and - * the extend sit in the SAME basic block (verified: u8 local, (u8) cast at - * the use, `& 0xff` at the use, u8-via-int, u16 hold, hard-register pins) — - * a cross-BB def keeps it but lands the andi in the wrong block. - * The opacity idiom (already used in src/ov_SC03_099) makes the value's range - * unprovable in place, so the extend survives at its original position. - * cookbook §1/I2 ("masked andi survives only if the value's range is - * unprovable"), §17 (pins/barriers). - */ - -s32 func_80139BE0(int param_1) -{ - - extern unsigned char D_8018A9D8[]; - int v; - - if ((*(unsigned int *)(param_1 + 8) & 0x2000) == 0) { - int t = *(unsigned char *)(param_1 + 0x22) & 0x60; - int h = *(unsigned short *)(param_1 + 0x18); - unsigned int idx; - - __asm__("" : "=r"(t) : "0"(t)); - idx = (unsigned char)t; - if (h < 7) { - if (h >= 2) { - v = D_8018A9D8[idx >> 5]; - } else { - v = D_8018A9D8[0]; - } - } else { - v = D_8018A9D8[0]; - } - *(short *)(param_1 + 0x2e) = 3; - *(short *)(param_1 + 0x2c) = v; - } - *(short *)(param_1 + 0x34) = *(short *)(param_1 + 0x2c) * 6; - { - int x = *(short *)(param_1 + 0x2e); - *(short *)(param_1 + 0x36) = x * 12 + (x - 1) * 2; - } -} - - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139c7c (src/shared) */ - - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139d04 (src/shared) */ - - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139dc8 (src/shared) */ - - -void func_80139DEC(void) { -} - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139df4 (src/shared) */ - - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139e84 (src/shared) */ - - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139f0c (src/shared) */ - - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139fbc (src/shared) */ - - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139fe8 (src/shared) */ - - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013a0a4 (src/shared) */ - - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013a164 (src/shared) */ - - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013a1e8 (src/shared) */ - - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013a250 (src/shared) */ - - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013a2bc (src/shared) */ - - -void func_8013A378(void) { -} - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013a380 (src/shared) */ - - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013a448 (src/shared) */ - - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013a4c4 (src/shared) */ - - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013a530 (src/shared) */ - - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013a860 (src/shared) */ - - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013a8b0 (src/shared) */ - - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013a8bc (src/shared) */ - - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013a8fc (src/shared) */ - - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013a9b4 (src/shared) */ - - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013a9f8 (src/shared) */ - - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013aa24 (src/shared) */ - - -extern void func_8013AD38(void *a0, s32 a1, void *a2, void *a3); -extern void func_8013B274(s32 a0, s32 a1, void *a2); -extern void func_8013AF20(); -s32 func_8013AB54(s32 a0, s32 a1, s32 a2, s32 a3) { - - extern s32 D_800A5E60; - u8 buf[0xE4]; /* spans 0x10 .. 0xF4 */ - s32 neg; - s32 a, b; - s32 t4, t6; - t4 = *(s16 *)(a2 + 4) * 12; - *(s16 *)(buf + 0xE0) = t4 + 0x10; /* sp+0xF0 */ - neg = a3 & 0x8000; - t6 = *(s16 *)(a2 + 6) * 12 + (*(s16 *)(a2 + 6) - 1) * 2; - *(s16 *)(buf + 0xE2) = t6 + 8; - if (neg == 0) { - *(s16 *)(buf + 0xE0) = t4 + 0x38; - *(s16 *)(buf + 0xE2) = t6 + 0x10; - } - a = ((s32)*(s16 *)(buf + 0xE0) << 12) / 154; - b = ((s32)*(s16 *)(buf + 0xE2) << 12) / 42; - *(s16 *)(buf + 0xE0) = a; - *(s16 *)(buf + 0xE2) = b; - if (neg != 0) { - *(s16 *)(buf + 0xE0) = -a; - } - *(s16 *)(buf + 0xC8) = b; /* 0xD8 */ - *(s16 *)(buf + 0xC2) = 0; /* 0xD2 */ - *(s16 *)(buf + 0xC4) = 0; /* 0xD4 */ - *(s16 *)(buf + 0xC6) = 0; /* 0xD6 */ - *(s16 *)(buf + 0xCA) = 0; /* 0xDA */ - *(s16 *)(buf + 0xCC) = 0; /* 0xDC */ - *(s16 *)(buf + 0xCE) = 0; /* 0xDE */ - *(s16 *)(buf + 0xD0) = 0x1000; /* 0xE0 */ - *(s16 *)(buf + 0xC0) = *(u16 *)(buf + 0xE0); /* 0xD0 */ - *(s32 *)(buf + 0xD4) = *(s16 *)(a2 + 0); /* 0xE4 */ - *(s32 *)(buf + 0xD8) = *(s16 *)(a2 + 2); /* 0xE8 */ - *(s32 *)(buf + 0xDC) = 0; /* 0xEC */ - __asm__ __volatile__("" ::: "memory"); - { - register s32 *p __asm__("$2") = (s32 *)(buf + 0xC0); - __asm__ __volatile__( - "lw $12, 0(%0)\n" - "lw $13, 4(%0)\n" - "ctc2 $12, $0\n" - "ctc2 $13, $1\n" - "lw $12, 8(%0)\n" - "lw $13, 12(%0)\n" - "lw $14, 16(%0)\n" - "ctc2 $12, $2\n" - "ctc2 $13, $3\n" - "ctc2 $14, $4\n" - "lw $12, 20(%0)\n" - "lw $13, 24(%0)\n" - "ctc2 $12, $5\n" - "lw $14, 28(%0)\n" - "ctc2 $13, $6\n" - "ctc2 $14, $7\n" - : : "r"(p) : "$12", "$13", "$14", "memory"); - } - func_8013AD38(buf + 0xE0, 0, buf + 0x00, buf + 0x80); - D_800A5E60 = a0; - if (a3 != 0) { - func_8013B274(a1, 0x80, buf + 0xE0); - } - func_8013AF20(a1, a2, buf + 0x00, buf + 0x80); - return D_800A5E60; -} - - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) { - - extern s16 D_800D45F4[]; - extern u8 D_8018AADC[]; - extern s16 D_800D466C[]; - extern u8 D_8018AB18[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018AB18; - if (((s16)a1) < 0xC00) { - tbl = D_8018AADC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair *)out2)[i].x = res[0]; - ((Pair *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair *)out2)[i] = ((Pair *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013af20 (src/shared) */ - - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013b204 (src/shared) */ - - - - -extern void *func_80010A08(s32); - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - - extern s16 D_8018AB54, D_8018AB56, D_8018AB58, D_8018AB5A, D_8018AB5C, D_8018AB5E; - extern u16 D_800D45F6; - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018AB56 < ang)) goto outer_else; - if (!(ang < D_8018AB5C)) goto inner_else; - if (ang < D_8018AB58) { *(s16 *)L = D_8018AB58; goto done; } - if (D_8018AB5A < ang) { *(s16 *)L = D_8018AB5A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018AB54) { *(s16 *)L = D_8018AB54; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018AB5E < ang) { *(s16 *)L = D_8018AB5E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} diff --git a/src/ov_SC07_006/ov_SC07_006_jr_801380E0.c b/src/ov_SC07_006/ov_SC07_006_jr_801380E0.c new file mode 100644 index 0000000000..66f0ada41a --- /dev/null +++ b/src/ov_SC07_006/ov_SC07_006_jr_801380E0.c @@ -0,0 +1,1662 @@ +#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 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 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(); +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(); +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 void func_80029444(void); +extern void func_800D1754(void); +extern void func_8014ED28(s32 _arg0); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern int func_801288E8(int arg0); +extern int func_80128940(int arg0); +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 s32 func_80128ED8(s32 param_1, s32 *param_2); +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern void func_80129010(void); +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 struct BigCopy D_80126DB8; +extern u8 D_80126948[]; +extern struct BigCopy D_80114EE8; +extern s32 D_80126E60[]; +extern s8 D_801150D6; +extern s8 D_801152C0; +extern u8 D_80127504; +extern void func_800144D4(void); +extern void func_80129C40(s32 _arg0); +extern void func_8012A328(); +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 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 s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_80129CF8(void); +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void func_8012A018(s32 a0, s32 a1); +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 *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +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 void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern void func_8012A464(void); +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 s32 func_80047D3C(s32 a0); +extern s32 ratan2(s32 a0, s32 a1); +extern s32 func_8012A6D0(void* a0, void* a1); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(); +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 void func_8012ACA0(void *arg0); +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 D_80126B58; +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_8012C218(void *a0); +extern void func_8012C098(void *param_1); +extern s32 func_8012C0EC(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 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_8012C750(s32 a0); +extern s32 func_8012C820(u8 *a0); +extern u16 D_801274E4[]; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern s32 func_8012CC88(); +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_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 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 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_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(s32 arg0); +extern void func_8012E138(); +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 s32 func_8012E778(int param_1, int param_2); +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_8012EA90(s32 param_1, s32 param_2, s32 *param_3); +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 void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_8012F8C8(int param_1); +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 void func_80131B14(void); +extern void func_8012FCC4(int param_1); +extern void func_8012FDA8(int param_1); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +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 void func_8012CBF4(s32); +extern s32 func_80131D68(s32 a0, s32 a1); +extern void func_80130650(s32 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_80130A18(u8 *a0); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void func_80130D0C(s32 a0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_80131E00(); +extern s32 D_801F4D80; +extern s32 D_801F4D84; +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void func_80019064(void *a0); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern int func_80131D68(int a0, int a1); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void func_80131EEC(void *a0); +extern void func_80131F28(void *a0); +extern void func_80131F64(void *a0); +extern void func_80131FA0(void *a0); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern void func_801320D8(int param_1); +extern void func_80132144(int param_1); +extern void func_801321B0(int param_1); +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(void * param_1, s16 * param_2, s32 param_3); +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 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_80134310(Vec3s *a0, Vec3s *a1, s32 a2); +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_801345F8(s32 arg); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern int func_80134A74(int param_1, s16 param_2, s16 param_3, int param_4); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +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_80135A4C(s32 a0, s32 a1, s32 *a2, s32 a3); +extern s16 func_80135480(void*, s32, s16*, s16*); +extern s32 func_80135EB0(void *arg0, s32 arg1_); +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 D_801F4DDC; +extern s32 D_801F4DFC; +extern s32 func_80135D20(s32 arg0, s32 arg1, u16 *arg2); +extern s32 func_801365B8(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32, s32, s32); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void func_80136C54(void); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern u16 D_80126CC4; +extern M2C_UNK func_800153CC(M2C_UNK, u16, M2C_UNK, M2C_UNK, s32, s32); +extern void func_80136DFC(void); +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_80136F3C(s32 a0, s32 a1); +extern void func_80137030(s16 a0, s16 a1); +extern void func_80137178(s32 a0, s32 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 aF80137614(); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 func_80139BE0(s32); +extern void * aF801376E8(); +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 void func_8013A860(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern s32 D_801269F0; +extern s16 D_801269F4; +extern s32 D_801269F8; +extern void func_80138BE0(s32 a0); +extern void func_80137BD8(s32 a0); +extern void func_8013A380(void); +extern void func_801379FC(void); +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 int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80137DD4(s32 ent, u8 *arg, u8 *work); +/* ==== end §8b carried decl layer ==== */ + + +/* func_801380E0 (438 ins) — Script-command interpreter, byte-identical body + * already banked in multiple sibling overlays (e.g. ov_SC03_099). Reused + * verbatim (§136c/S34 sibling-first). See ov_SC03_099_jr_801380E0.c for the + * full derivation notes (L-A/L-B/L-C/L-D levers). + */ + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(void); + 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); + extern s32 func_80138C60(s32); + extern void func_80138D58(s32, u16); + extern s32 func_80138DE0(u8 *arg0, u8 arg1, s32 arg2); + extern void func_801391F0(void*); + extern s32 func_80139220(s32); + extern void func_80139788(void); + extern void func_80139914(s32); + extern s32 func_80029178(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s16 D_8012752E; + 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 = ((s32 (*)(s32, s32, s32))func_80138DE0)(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + ((void (*)(s32, s32))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: + ((void (*)(s32, s32))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 (((s32 (*)(s32, s32))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 (((s32 (*)(void))func_8001B22C)() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + ((void (*)(s32))func_8001931C)(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + ((void (*)(s32))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: + ((void (*)(s32, s32))func_80138D58)(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + ((void (*)(s32, s32))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); +} + + +/* de-macroized: per-overlay-local decl for func_80138DE0 (byte-true sig); do NOT re-macroize */ + void func_801387B8(s32 arg0) { + extern s32 func_80138DE0(u8*, u8, s32); + extern s32 func_80139220(s32 a0); + extern void func_80138948(void *a0); + extern void func_80139A8C(s32 a0); + extern void func_80139B18(s32 a0); + extern s32 D_80127530[]; + u16 *p; + s32 base; + s32 cont; + u8 cmd; + s32 sub; + s32 pc; + for (;;) { + cont = 0; + 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 *)(base + pc); + sub = *(u8 *)(base + pc + 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); + *p += 1; + goto loop_end; + case 1: + cont = 1; + *(u8 *)(arg0 + 0x23) = sub; + *p += 2; + goto loop_end; + case 7: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + *(s32 *)(arg0 + 8) &= ~0x20; + } + break; + case 23: + *(s32 *)(arg0 + 8) |= 2; + default: + cont = 1; + *p += 1; + goto loop_end; + } + } + func_80138948((void *)arg0); + } + loop_end: + if (cont == 0) { + func_80139A8C(arg0); + func_80139B18(arg0); + return; + } + } + } /* dedup: shared engine-core @0x801387B8 (src/shared) */ + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895c (src/shared) */ + + +/* de-macroized: per-overlay-local decl for func_80138DE0 (byte-true sig); do NOT re-macroize */ + extern s16 D_80127540[4]; + extern s32 func_80139D04(s32 a0, s32 a1); + extern s32 func_80138DE0(u8*, u8, s32); + extern void func_80139B18(s32 a0); + void func_80138AB4(s32 a0) { + u8 sp10[8]; + s32 s0 = a0; + s32 s1; + s32 a0v; + s1 = func_80139D04((s32)sp10, (u16)D_80127540[*(u16 *)(s0 + 0x48)]) & 0xFFFF; + do { + s32 v1 = *(u16 *)(s0 + 0x44); + a0v = 0; + if ((s32)v1 < s1) { + s32 a1v = (sp10[v1] + 0x30) & 0xFF; + a0v = func_80138DE0(s0, a1v, 0); + if (*(s32 *)(s0 + 0x8) & 0x80220) { + /* a0v stays */ + } else { + a0v = 0; + } + } else { + s32 t = *(u16 *)(s0 + 0x48); + if ((u32)t < 3) { + *(s16 *)(s0 + 0x48) = t + 1; + } + *(s16 *)(s0 + 0x4) = 2; + } + } while (a0v != 0); + func_80139B18(s0); + } /* dedup: shared engine-core @0x80138ab4 (src/shared) */ + + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138b88 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + + +void func_80138BE0(int p) +{ + + extern void (*D_8018AA10[])(void); + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018AA10[*(short *)(p + 4)](); +} + + +void func_80138C30(void *a0) { + if (*(s16 *)((s32)a0 + 4) == 4) { + *(s16 *)((s32)a0 + 4) = 2; + } else { + *(u32 *)((s32)a0 + 8) |= 0x800; + } +} + + +extern s32 func_80139BE0(s32); + +s32 func_80138C60(s32 arg0) +{ + typedef struct { + u8 b0; + u8 b1; + u8 b2; + u8 b3; + } Q_80138C60; + extern Q_80138C60 D_8018A9DC[]; + u16 t; + u8 b; + s32 f; + s32 idx; + + if (*(s32 *)(arg0 + 8) & 0x2000) { + return 1; + } + + t = *(u8 *)(arg0 + 0x22) & 7; + *(s16 *)(arg0 + 0x18) = t; + if (t < 2) { + *(u8 *)(arg0 + 0x20) = 0; + } + + f = *(s32 *)(arg0 + 8); + if (f & 0x40) { + *(u8 *)(arg0 + 0x22) = (*(u8 *)(arg0 + 0x22) & 0x67) | (f & ~0x67); + } + + b = *(u8 *)(arg0 + 0x22); + if (b & 0x80) { + idx = (b & 0x18) >> 3; + } else { + idx = (b & 0x78) >> 3; + if (b & 0x60) { + *(s16 *)(arg0 + 0x1C) = 0; + } + } + + *(Q_80138C60 *)(arg0 + 0x24) = D_8018A9DC[idx]; + + func_80139BE0(arg0); + func_80139C7C((u8 *)arg0); + return func_8013A8FC(arg0); +} + + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138d58 (src/shared) */ + + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138db8 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH +/* func_80138DE0 — advance the text cursor by 1 or 2 after emitting a glyph. + * + * Key levers (both required; the body itself is a plain if/else-if): + * - D_80127548 MUST be declared as an ARRAY (`extern s32 D_80127548[];`) and accessed as + * D_80127548[0]. As a scalar, gcc emits the assembler-macro form twice in the tail + * (lui+lw %lo / lui+sw %lo via $at, 8 insns); as an array the address is materialised once + * (la $v1 = lui+addiu) and the lw/sw use 0($v1), which is what the target does and is one + * instruction shorter. This is the §40b indexed-global idiom, and it is also the form the + * shared engine-core macro DEFINE_func_80138ED0() already uses for this same symbol. + * - arg1 is a byte param (u8): each use re-emits `andi ...,0xFF` (§I2), which is why the + * 0x20-subtraction path recomputes the mask instead of reusing $v1. + * - The 2nd argument of func_80138ED0 is u32, so the (u16) cast supplies the `andi 0xFFFF`. + * - The `if (arg2 != 0) return 0;` tail check is redundant on the two call paths; gcc's + * thread_jumps folds them straight to the return-0 tails (.L80138EB8 / .L80138EBC), and the + * `*p = ...` store is cross-jumped between the +2 and +1 arms. + */ +#include "common.h" + +extern s32 D_80127548[]; +extern u8 D_800D3AB4[]; +extern s32 func_80138ED0(u8 *param_1, u32 param_2, u8 *param_3); + +s32 func_80138DE0(u8 *arg0, u8 arg1, s32 arg2) { + u16 *p; + + if (D_80127548[0] == 0) { + return 0; + } + p = (u16 *)(arg0 + 0x44); + if ((*(u32 *)(arg0 + 8) & 0x400) == 0) { + p = (u16 *)(arg0 + 0x10); + if (*(s16 *)(arg0 + 4) == 8) { + p = (u16 *)(arg0 + 0x44); + } + } + if (arg1 >= 0xE0) { + arg2 = func_80138ED0(arg0, 0x1F, D_800D3AB4); + if (arg2 != 0) { + return 0; + } + *p = *p + 2; + } else if (arg1 >= 0x20) { + arg2 = func_80138ED0(arg0, (u16)(arg1 - 0x20), D_800D3AB4); + if (arg2 != 0) { + return 0; + } + *p = *p + 1; + } + if (arg2 != 0) { + return 0; + } + D_80127548[0] = D_80127548[0] - 1; + return D_80127548[0]; +} + + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ed0 (src/shared) */ + + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914c (src/shared) */ + + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391f0 (src/shared) */ + + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392c8 (src/shared) */ + + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392fc (src/shared) */ + + +DEFINE_func_801395D4() /* dedup: shared engine-core @0x801395D4 (src/shared) */ + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + + +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + + extern short D_800B9A02; + extern u8 D_800A6518[]; + extern u8 D_8018AA54; + extern u8 D_8018AA98; + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018AA54; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018AA98 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399a8 (src/shared) */ + + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399f0 (src/shared) */ + + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139a34 (src/shared) */ + + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139a44 (src/shared) */ + + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139a68 (src/shared) */ + + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139a8c (src/shared) */ + + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139b18 (src/shared) */ + + + +/* func_80139BE0 — ov_SC01_077 / ov_SC01_077_jr_801380E0, 39 ins, MATCH. + * + * REDRAFT of the decayed backlog draft: the stored draft was -1 instruction + * (LENGTH-DRIFT) because the target keeps a QI->SI zero-extend of the masked + * byte (`andi $a1,$v0,0xFF` after `andi $v0,$v0,0x60`) that gcc-2.7.2 folds + * away: combine proves nonzero_bits(x & 0x60) <= 0xff and simplifies the + * extend to nothing. No pure-C spelling survives that fold when the def and + * the extend sit in the SAME basic block (verified: u8 local, (u8) cast at + * the use, `& 0xff` at the use, u8-via-int, u16 hold, hard-register pins) — + * a cross-BB def keeps it but lands the andi in the wrong block. + * The opacity idiom (already used in src/ov_SC03_099) makes the value's range + * unprovable in place, so the extend survives at its original position. + * cookbook §1/I2 ("masked andi survives only if the value's range is + * unprovable"), §17 (pins/barriers). + */ + +s32 func_80139BE0(int param_1) +{ + + extern unsigned char D_8018A9D8[]; + int v; + + if ((*(unsigned int *)(param_1 + 8) & 0x2000) == 0) { + int t = *(unsigned char *)(param_1 + 0x22) & 0x60; + int h = *(unsigned short *)(param_1 + 0x18); + unsigned int idx; + + __asm__("" : "=r"(t) : "0"(t)); + idx = (unsigned char)t; + if (h < 7) { + if (h >= 2) { + v = D_8018A9D8[idx >> 5]; + } else { + v = D_8018A9D8[0]; + } + } else { + v = D_8018A9D8[0]; + } + *(short *)(param_1 + 0x2e) = 3; + *(short *)(param_1 + 0x2c) = v; + } + *(short *)(param_1 + 0x34) = *(short *)(param_1 + 0x2c) * 6; + { + int x = *(short *)(param_1 + 0x2e); + *(short *)(param_1 + 0x36) = x * 12 + (x - 1) * 2; + } +} + + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139c7c (src/shared) */ + + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139d04 (src/shared) */ + + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139dc8 (src/shared) */ + + +void func_80139DEC(void) { +} + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139df4 (src/shared) */ + + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139e84 (src/shared) */ + + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139f0c (src/shared) */ + + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139fbc (src/shared) */ + + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139fe8 (src/shared) */ + + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013a0a4 (src/shared) */ + + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013a164 (src/shared) */ + + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013a1e8 (src/shared) */ + + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013a250 (src/shared) */ + + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013a2bc (src/shared) */ + + +void func_8013A378(void) { +} + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013a380 (src/shared) */ + + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013a448 (src/shared) */ + + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013a4c4 (src/shared) */ + + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013a530 (src/shared) */ + + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013a860 (src/shared) */ + + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013a8b0 (src/shared) */ + + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013a8bc (src/shared) */ + + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013a8fc (src/shared) */ + + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013a9b4 (src/shared) */ + + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013a9f8 (src/shared) */ + + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013aa24 (src/shared) */ + + +extern void func_8013AD38(void *a0, s32 a1, void *a2, void *a3); +extern void func_8013B274(s32 a0, s32 a1, void *a2); +extern void func_8013AF20(); +s32 func_8013AB54(s32 a0, s32 a1, s32 a2, s32 a3) { + + extern s32 D_800A5E60; + u8 buf[0xE4]; /* spans 0x10 .. 0xF4 */ + s32 neg; + s32 a, b; + s32 t4, t6; + t4 = *(s16 *)(a2 + 4) * 12; + *(s16 *)(buf + 0xE0) = t4 + 0x10; /* sp+0xF0 */ + neg = a3 & 0x8000; + t6 = *(s16 *)(a2 + 6) * 12 + (*(s16 *)(a2 + 6) - 1) * 2; + *(s16 *)(buf + 0xE2) = t6 + 8; + if (neg == 0) { + *(s16 *)(buf + 0xE0) = t4 + 0x38; + *(s16 *)(buf + 0xE2) = t6 + 0x10; + } + a = ((s32)*(s16 *)(buf + 0xE0) << 12) / 154; + b = ((s32)*(s16 *)(buf + 0xE2) << 12) / 42; + *(s16 *)(buf + 0xE0) = a; + *(s16 *)(buf + 0xE2) = b; + if (neg != 0) { + *(s16 *)(buf + 0xE0) = -a; + } + *(s16 *)(buf + 0xC8) = b; /* 0xD8 */ + *(s16 *)(buf + 0xC2) = 0; /* 0xD2 */ + *(s16 *)(buf + 0xC4) = 0; /* 0xD4 */ + *(s16 *)(buf + 0xC6) = 0; /* 0xD6 */ + *(s16 *)(buf + 0xCA) = 0; /* 0xDA */ + *(s16 *)(buf + 0xCC) = 0; /* 0xDC */ + *(s16 *)(buf + 0xCE) = 0; /* 0xDE */ + *(s16 *)(buf + 0xD0) = 0x1000; /* 0xE0 */ + *(s16 *)(buf + 0xC0) = *(u16 *)(buf + 0xE0); /* 0xD0 */ + *(s32 *)(buf + 0xD4) = *(s16 *)(a2 + 0); /* 0xE4 */ + *(s32 *)(buf + 0xD8) = *(s16 *)(a2 + 2); /* 0xE8 */ + *(s32 *)(buf + 0xDC) = 0; /* 0xEC */ + __asm__ __volatile__("" ::: "memory"); + { + register s32 *p __asm__("$2") = (s32 *)(buf + 0xC0); + __asm__ __volatile__( + "lw $12, 0(%0)\n" + "lw $13, 4(%0)\n" + "ctc2 $12, $0\n" + "ctc2 $13, $1\n" + "lw $12, 8(%0)\n" + "lw $13, 12(%0)\n" + "lw $14, 16(%0)\n" + "ctc2 $12, $2\n" + "ctc2 $13, $3\n" + "ctc2 $14, $4\n" + "lw $12, 20(%0)\n" + "lw $13, 24(%0)\n" + "ctc2 $12, $5\n" + "lw $14, 28(%0)\n" + "ctc2 $13, $6\n" + "ctc2 $14, $7\n" + : : "r"(p) : "$12", "$13", "$14", "memory"); + } + func_8013AD38(buf + 0xE0, 0, buf + 0x00, buf + 0x80); + D_800A5E60 = a0; + if (a3 != 0) { + func_8013B274(a1, 0x80, buf + 0xE0); + } + func_8013AF20(a1, a2, buf + 0x00, buf + 0x80); + return D_800A5E60; +} + + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) { + + extern s16 D_800D45F4[]; + extern u8 D_8018AADC[]; + extern s16 D_800D466C[]; + extern u8 D_8018AB18[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018AB18; + if (((s16)a1) < 0xC00) { + tbl = D_8018AADC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair *)out2)[i].x = res[0]; + ((Pair *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair *)out2)[i] = ((Pair *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013af20 (src/shared) */ + + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013b204 (src/shared) */ + + + + +extern void *func_80010A08(s32); + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + + extern s16 D_8018AB54, D_8018AB56, D_8018AB58, D_8018AB5A, D_8018AB5C, D_8018AB5E; + extern u16 D_800D45F6; + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018AB56 < ang)) goto outer_else; + if (!(ang < D_8018AB5C)) goto inner_else; + if (ang < D_8018AB58) { *(s16 *)L = D_8018AB58; goto done; } + if (D_8018AB5A < ang) { *(s16 *)L = D_8018AB5A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018AB54) { *(s16 *)L = D_8018AB54; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018AB5E < ang) { *(s16 *)L = D_8018AB5E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + diff --git a/tools/jr_isolate_all.py b/tools/jr_isolate_all.py index 9db9fde594..de84a97b28 100644 --- a/tools/jr_isolate_all.py +++ b/tools/jr_isolate_all.py @@ -307,6 +307,17 @@ def _partition(srcpath, cuts, syms): if any(it[0] is None and it[2] == "tail" for it in items): sys.exit(f"jr_isolate_all: unaddressable content in {srcpath}") footer = [it for it in items if it[2] == "footer"] + # R32 COVERAGE — the same guard as overlay_src_split.partition, and for the same reason: + # `addressed` silently discards any construct whose vram did not resolve, so this function + # rewrote the TU WITHOUT it. Measured P30 S38: one carve of ov_SC02_028 deleted the two + # definition-side asm-label-alias definitions emitting func_80183AF8 and func_80184268 (their + # C identifiers are aF*, which matched neither `func_` nor `syms`), and the overlay then + # failed to link. Six wave-6 drafts were written off against that. Fail loud instead. + lost = [it for it in items if it[0] is None and it[2] not in ("tail", "footer")] + if lost: + sys.exit(f"jr_isolate_all: {srcpath} has {len(lost)} construct(s) with no resolvable " + f"address — refusing to rewrite the file without them (R32):\n" + + "\n".join(f" kind={it[2]} name={it[1]} :: {it[3].strip()[:110]}" for it in lost[:6])) addressed = [it for it in items if it[0] is not None] cuts = sorted(set(cuts)) bounds = [None] + cuts + [None] diff --git a/tools/overlay_src_split.py b/tools/overlay_src_split.py index dbb263f7a9..d85f43922e 100644 --- a/tools/overlay_src_split.py +++ b/tools/overlay_src_split.py @@ -58,13 +58,39 @@ def load_syms(path): return s -def addr_of(name, syms): +# §37/§73 DEFINITION-SIDE ASM-LABEL ALIAS. A body whose byte-true signature conflicts with the +# fleet-canonical decl is banked by giving the DEFINITION a different C identifier and binding the +# emitted SYMBOL with a GNU asm label: +# void aF8018A860(s32, s16 *, u8 *, u8 *) __asm__("func_80183AF8"); <- decl (stays in preamble) +# void aF8018A860(s32, s16 *, u8 *, u8 *) { ... } <- THIS emits func_80183AF8 +# `addr_of` resolved a def by its C NAME, so `aF8018A860` matched neither `func_` nor `syms` +# and returned None — and `partition()` then DROPPED the item, because it keeps only addressed +# ones. That is SILENT CODE LOSS during a repartition: measured P30 S38, one carve deleted the +# definitions emitting BOTH func_80183AF8 and func_80184268, and the overlay then failed to link +# with `undefined reference` — read for two sessions as a compiler/plumbing wall. +# `family_remap._alias_decl_for` already handled this exact form (and its docstring records the +# same lesson costing 137 sweep skips); the fix was never propagated here. This is the FIFTH tool +# with the same structural blindness — see cookbook §134/§139. +_ALIAS_DECL = re.compile( + r'\b([A-Za-z_]\w*)\s*\([^;{}]*\)\s*__asm__\s*\(\s*"([^"]+)"\s*\)\s*;', re.S) + + +def asm_label_aliases(src): + """{C identifier -> emitted symbol} for every definition-side asm-label alias in `src`.""" + return {m.group(1): m.group(2) for m in _ALIAS_DECL.finditer(src)} + + +def addr_of(name, syms, aliases=None): if not name: return None m = re.match(r'func_([0-9A-Fa-f]{8})$', name) if m: return int(m.group(1), 16) - return syms.get(name) + if name in syms: + return syms[name] + if aliases and name in aliases: # resolve through the EMITTED symbol, not the C name + return addr_of(aliases[name], syms) + return None def item_func_name(text): @@ -224,6 +250,7 @@ def parse_overlay_c(src, syms): """Return (header, items) where items = [(addr, name, kind, text)] in file order. kind in {asm, define, def, nonmatch, tail}. `tail` = trailing content with no following anchor (addr None) — normally absent in a well-formed file.""" + aliases = asm_label_aliases(src) lines = src.split("\n") hdr_end = split_header(lines) header = "\n".join(lines[:hdr_end]) @@ -279,7 +306,7 @@ def parse_overlay_c(src, syms): j += 1 j = min(j + 1, n) name = item_func_name("\n".join(lines[i:j])) - items.append((addr_of(name, syms), name, "nonmatch", + items.append((addr_of(name, syms, aliases), name, "nonmatch", "\n".join(lines[pre_start:j]))) i = j pre_start = i @@ -288,7 +315,7 @@ def parse_overlay_c(src, syms): j, is_def = scan_construct(lines, i) if is_def: name = def_name(lines[i:j]) - items.append((addr_of(name, syms), name, "def", + items.append((addr_of(name, syms, aliases), name, "def", "\n".join(lines[pre_start:j]))) i = j pre_start = i @@ -591,6 +618,15 @@ def partition(srcpath, cuts, syms_path, verbose=True): sys.exit(f"partition: {srcpath} has unaddressable trailing content:\n" f"{tail[0][3][:160]}") footer = [it for it in items if it[2] == "footer"] + # R32 COVERAGE: a construct we could not place is a DEFECT, never a no-op. `addressed` keeps + # only items with a resolved vram, so an unresolved def/nonmatch used to vanish from every + # region — the file was rewritten WITHOUT it and nothing said so (P30 S38: two asm-label-alias + # definitions deleted by one carve). Fail loud instead. + lost = [it for it in items if it[0] is None and it[2] not in ("tail", "footer")] + if lost: + sys.exit(f"partition: {srcpath} has {len(lost)} construct(s) with no resolvable address — " + f"refusing to rewrite the file without them (R32):\n" + + "\n".join(f" kind={it[2]} name={it[1]} :: {it[3].strip()[:110]}" for it in lost[:6])) addressed = [it for it in items if it[0] is not None] cuts = sorted(set(cuts)) bounds = [None] + cuts + [None] # (start,cut0),(cut0,cut1),...,(cutN,end)