feat(phase-30 S34): wave 2 — 10 heads + 18 members; the search order had a cross-overlay hole

Fleet 96.24% fn-count / 93.9 -> 94.0% instr / 88.4% distinct. R22 clean-fleet:
140 passed, 0 failed of 140. dedup 1910/0.

WAVE 2: 13 targets / 37,943 templatable ins. 19 agents, 4.5M tokens. Claimed 11
MATCH; the whole-binary gate banked 9, +1 on reconcile (func_8017E5D0 via the
§37/§124 DEFINITION-side alias — the TU declares it `(void)`, the byte-true def
takes a pointer). Reconcile lane now 19/20 lifetime. 18 members swept.

THE FINDING (an agent caught a hole in our own procedure). §136c's search order
— engine_core.h near-twin -> same-TU banked sibling -> the .s — is entirely
SAME-TU or SHARED-HEADER scoped, so no step can reach a banked twin in a
DIFFERENT overlay's TU. But the large template classes live cross-overlay by
construction. func_80188C04 (328 ins) turned out byte-identical to an
already-banked func_801833F0 in ov_SC02_028, and ONE command found it:
`grep -rn "E100000A" src/` — a magic word lifted from the target .s. The body was
then reused verbatim, only file-local suffixes renamed. Promoted to STEP 0 of
§136c, ahead of engine_core.h.

That compounds with the manifest finding this session: the family map's
`exemplar` is an IN-FAMILY pointer, so a family whose twin is banked elsewhere
looks un-cracked — and the pointer can itself name an ALREADY-BANKED instance,
hiding the family from any ranking built on it. Derive open sites from
corpus.stubs over the member list instead. Measured on this wave: ranking off the
map's exemplar gave 16,696 templatable ins; deriving from corpus.stubs gave
41,023, including a 55-ins family open in 138 overlays and a 46-ins one in 133.

HONEST ON THE SWEEP: those two big families templated 18/165. That is the known
h_seq refusal ceiling, not a new wall. One agent reported "all 10 members
distance 0" — that is NORMALIZED distance, not h_exact, which is why
dedup_propagate correctly answered reach<2. Do not read a normalized-distance
claim as an h_exact guarantee.

LEDGERED (real residual, not paperwork): func_8017F7B4 — needed its sibling's
type names AND a data asm-label alias for a u8-shaped symbol, and still refuses.
Plus func_8017C294 (DIFF close=12: 4 register/schedule permutations + a frame
where I can get the 0x138 size OR pEnd's slot at 0x108, not both) and
func_801898E4.
This commit is contained in:
Drew T
2026-08-04 07:14:28 -06:00
parent 138e21c7d4
commit 7a4abddbfa
31 changed files with 3658 additions and 155 deletions
+43 -44
View File
@@ -2,7 +2,7 @@
> Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there.
**Open near-misses:** 863 · by status {'near': 825, 'failed': 38} · by class {'schedule': 4, 'plumbing': 6, 'struct': 11, 'regalloc-order': 9, None: 827, 'other': 1, 'WAVE': 3, 'STRUCT': 1, 'loose-typing': 1}
**Open near-misses:** 862 · by status {'near': 824, 'failed': 38} · by class {'schedule': 4, 'plumbing': 6, 'struct': 11, 'regalloc-order': 9, None: 826, 'other': 1, 'WAVE': 3, 'STRUCT': 1, 'loose-typing': 1}
| # | addr | reach | class | nins | status | closeness | where it stuck | best draft |
|--:|------|------:|-------|-----:|--------|----------:|----------------|------------|
@@ -826,46 +826,45 @@
| 818 | func_80183BF8 | None | | None | near | 258 | residual: 258 mismatch | `.run/backlog_drafts/func_80183BF8.c` |
| 819 | func_8017EB30 | None | | None | near | 278 | residual: 278 mismatch | `.run/backlog_drafts/func_8017EB30.c` |
| 820 | func_801804A0 | None | | None | near | 280 | residual: 280 mismatch | `.run/backlog_drafts/func_801804A0.c` |
| 821 | func_80187EDC | None | | None | near | 296 | residual: 296 mismatch | `.run/backlog_drafts/func_80187EDC.c` |
| 822 | func_8017F554 | None | | None | near | 299 | residual: 299 mismatch | `.run/backlog_drafts/func_8017F554.c` |
| 823 | func_80181670 | None | | None | near | 311 | residual: 311 mismatch | `.run/backlog_drafts/func_80181670.c` |
| 824 | func_8017EA84 | None | | None | near | 578 | residual: 578 mismatch | `.run/backlog_drafts/func_8017EA84.c` |
| 825 | func_8018057C | None | | None | near | 897 | residual: 897 mismatch | `.run/backlog_drafts/func_8018057C.c` |
| 826 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` |
| 827 | func_80180B64 | 1 | struct | 75 | failed | | none — MATCH (75 ins, relocation-masked) | `.run/backlog_drafts/func_80180B64.c` |
| 828 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` |
| 829 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` |
| 830 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` |
| 831 | func_80185BA4 | 1 | WAVE | 177 | failed | | won't compile standalone (loose-typing / missing decl) | |
| 832 | func_8017D8DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D8DC.c` |
| 833 | func_8017FFEC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFEC.c` |
| 834 | func_8017DC18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DC18.c` |
| 835 | func_801853CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801853CC.c` |
| 836 | func_80181894 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181894.c` |
| 837 | func_8018BFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018BFBC.c` |
| 838 | func_801807F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801807F4.c` |
| 839 | func_8017FFC8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC8.c` |
| 840 | func_8017E99C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E99C.c` |
| 841 | func_80180294 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180294.c` |
| 842 | func_8017E76C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E76C.c` |
| 843 | func_8017F29C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F29C.c` |
| 844 | func_8017F00C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F00C.c` |
| 845 | func_801802B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801802B0.c` |
| 846 | func_8017DA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DA1C.c` |
| 847 | func_8017FFC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC4.c` |
| 848 | func_8017E2F0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E2F0.c` |
| 849 | func_801841E4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801841E4.c` |
| 850 | func_80181738 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181738.c` |
| 851 | func_801873D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801873D8.c` |
| 852 | func_80185628 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185628.c` |
| 853 | func_80181A78 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181A78.c` |
| 854 | func_801805D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801805D4.c` |
| 855 | func_8017EA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017EA1C.c` |
| 856 | func_8017F098 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F098.c` |
| 857 | func_801822CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801822CC.c` |
| 858 | func_8017E3F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E3F4.c` |
| 859 | func_800D1658 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D1658.c` |
| 860 | func_800D1984 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D1984.c` |
| 861 | func_800D24A0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D24A0.c` |
| 862 | func_80144B9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80144B9C.c` |
| 863 | func_8013DD68 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8013DD68.c` |
| 821 | func_8017F554 | None | | None | near | 299 | residual: 299 mismatch | `.run/backlog_drafts/func_8017F554.c` |
| 822 | func_80181670 | None | | None | near | 311 | residual: 311 mismatch | `.run/backlog_drafts/func_80181670.c` |
| 823 | func_8017EA84 | None | | None | near | 578 | residual: 578 mismatch | `.run/backlog_drafts/func_8017EA84.c` |
| 824 | func_8018057C | None | | None | near | 897 | residual: 897 mismatch | `.run/backlog_drafts/func_8018057C.c` |
| 825 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` |
| 826 | func_80180B64 | 1 | struct | 75 | failed | | none — MATCH (75 ins, relocation-masked) | `.run/backlog_drafts/func_80180B64.c` |
| 827 | func_80183DE0 | 1 | regalloc-order | 91 | failed | | testing if(!=1) layout + counter-before-pointer init order | `.run/backlog_drafts/func_80183DE0.c` |
| 828 | func_80182C9C | 1 | schedule | 101 | failed | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` |
| 829 | func_80183FB8 | 1 | loose-typing | 101 | failed | | none — MATCH (relocation-masked match_one, 101/101 ins) | `.run/backlog_drafts/func_80183FB8.c` |
| 830 | func_80185BA4 | 1 | WAVE | 177 | failed | | won't compile standalone (loose-typing / missing decl) | |
| 831 | func_8017D8DC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017D8DC.c` |
| 832 | func_8017FFEC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFEC.c` |
| 833 | func_8017DC18 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DC18.c` |
| 834 | func_801853CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801853CC.c` |
| 835 | func_80181894 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181894.c` |
| 836 | func_8018BFBC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018BFBC.c` |
| 837 | func_801807F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801807F4.c` |
| 838 | func_8017FFC8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC8.c` |
| 839 | func_8017E99C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E99C.c` |
| 840 | func_80180294 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180294.c` |
| 841 | func_8017E76C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E76C.c` |
| 842 | func_8017F29C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F29C.c` |
| 843 | func_8017F00C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F00C.c` |
| 844 | func_801802B0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801802B0.c` |
| 845 | func_8017DA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017DA1C.c` |
| 846 | func_8017FFC4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FFC4.c` |
| 847 | func_8017E2F0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E2F0.c` |
| 848 | func_801841E4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801841E4.c` |
| 849 | func_80181738 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181738.c` |
| 850 | func_801873D8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801873D8.c` |
| 851 | func_80185628 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80185628.c` |
| 852 | func_80181A78 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181A78.c` |
| 853 | func_801805D4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801805D4.c` |
| 854 | func_8017EA1C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017EA1C.c` |
| 855 | func_8017F098 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F098.c` |
| 856 | func_801822CC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801822CC.c` |
| 857 | func_8017E3F4 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017E3F4.c` |
| 858 | func_800D1658 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D1658.c` |
| 859 | func_800D1984 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D1984.c` |
| 860 | func_800D24A0 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_800D24A0.c` |
| 861 | func_80144B9C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80144B9C.c` |
| 862 | func_8013DD68 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8013DD68.c` |
+8 -6
View File
@@ -2,7 +2,7 @@
> **Generated by `tools/cookbook_index.py` — do not hand-edit** (R33). Regenerate after adding a cookbook section.
>
> `docs/matching-cookbook.md` is ~716 KB / 389 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses.
> `docs/matching-cookbook.md` is ~716 KB / 390 sections. Grepping it blind is how three P30 wave-1 agents each "discovered" an idiom that was already written down. **Start here, then read the section.** A section appears under every symptom it addresses.
**How to use:** name what you SEE in the diff (a stolen delay slot, an extra `la`, a swapped register pair, a `conflicting types` error), find that symptom below, read those sections first. If nothing fits, THEN grind — and add a section when you win.
@@ -225,7 +225,7 @@
- **§3-The** — declaration surface (integration, not codegen) <sub>L8931</sub>
- **§136f** — Two declaration sub-cases the reconcile lane surfaced (lane now 15/15 lifetime) <sub>L9176</sub>
- **§138** — The propagation lanes: a gate refusal is a DECLARATION, and which lever you owe depends on blast radius <sub>L9405</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9536</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9555</sub>
### jump tables & switches (25)
@@ -377,7 +377,7 @@
- **§114** — The THIRD decl axis: a CALLEE the draft declares differently from the target TU (Phase 29 T76/T77) <sub>L7801</sub>
- **§3-The** — integration idioms (these decide whether a byte-correct draft BANKS) <sub>L8797</sub>
- **§3-The** — declaration surface (integration, not codegen) <sub>L8931</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9536</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9555</sub>
### build graph, splat & the harness (95)
@@ -475,7 +475,7 @@
- **§137a** — A gate verdict has a TIMESTAMP; re-check it against the draft's mtime <sub>L9376</sub>
- **§138** — The propagation lanes: a gate refusal is a DECLARATION, and which lever you owe depends on blast radius <sub>L9405</sub>
- **§134** — again, in a second tool — and the waiter rule corrected <sub>L9516</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9536</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9555</sub>
### process, measurement & doctrine (53)
@@ -533,7 +533,7 @@
- **§136j** — The failure MIX flips with function size (measured across four bands, one session) <sub>L9292</sub>
- **Rank** — the lane by measured concentration, not by class count <sub>L9471</sub>
### (unbucketed — title matched no symptom vocabulary) (109)
### (unbucketed — title matched no symptom vocabulary) (110)
- **§3-How** — to use this <sub>L30</sub>
- **§1** — Idiom catalog (asm pattern → C that produces it) <sub>L39</sub>
@@ -644,6 +644,7 @@
- **§136i** — The drafter model LADDER: Haiku → **Sonnet** → Opus → Fable5 (Drew, 2026-08-03) <sub>L9260</sub>
- **§3-The** — triage, cheapest first <sub>L9411</sub>
- **THREE** — carry variants hide in one "CARRY-FIXABLE" bucket — and they need different fixes <sub>L9480</sub>
- **STEP** — 0 of sibling-first: grep `src/` for a distinctive LITERAL from the `.s` <sub>L9536</sub>
## All sections, in order
@@ -1036,4 +1037,5 @@
- **Rank** — the lane by measured concentration, not by class count <sub>L9471</sub>
- **THREE** — carry variants hide in one "CARRY-FIXABLE" bucket — and they need different fixes <sub>L9480</sub>
- **§134** — again, in a second tool — and the waiter rule corrected <sub>L9516</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9536</sub>
- **STEP** — 0 of sibling-first: grep `src/` for a distinctive LITERAL from the `.s` <sub>L9536</sub>
- **Reconciling** — a gate-refused draft: which way you edit depends on WHERE the TU's decl is <sub>L9555</sub>
+45 -45
View File
@@ -2,13 +2,13 @@
> Generated by `tools/family_hseq.py` from the 138 overlay sigs + per-overlay src stubs. Ranked by TEMPLATABLE byte-weight (PURE+IMM members × nins × 4). The byte-gate is the arbiter.
>
> **Scope: the 138 OVERLAYS only** (no main, no resident) · generated at HEAD `commit:1386` · stub set derived from `corpus.stubs` — the same oracle `progress.py` counts, so same-tree overlay totals agree by construction; compare digests only at the same HEAD.
> **Scope: the 138 OVERLAYS only** (no main, no resident) · generated at HEAD `commit:1387` · stub set derived from `corpus.stubs` — the same oracle `progress.py` counts, so same-tree overlay totals agree by construction; compare digests only at the same HEAD.
**Fleet (overlays):** 96.5% fn / 94.4% instr / 89.3% distinct-code matched. Unmatched: 12,264 instances / 736,631 ins (9,820 distinct classes).
**Fleet (overlays):** 96.5% fn / 94.4% instr / 89.4% distinct-code matched. Unmatched: 12,230 instances / 730,269 ins (9,790 distinct classes).
**Tail cross-check (Phase-25 close):** 8,013 tail fns / 392,543 ins → 434 h_seq families ≥2, **111 substantial (nins≥80) / 88,803 ins**.
**Tail cross-check (Phase-25 close):** 7,867 tail fns / 390,989 ins → 433 h_seq families ≥2, **110 substantial (nins≥80) / 87,350 ins**.
**Full frontier (all unmatched by h_seq):** 2044 target families (≥2 members or a matched sibling) + 3767 singletons (Step-D residue). Substantial: **381 families / 274,821 templatable ins**, 30 with a matched sibling (zero-crack). Substantial member classes: 1,625 PURE · 29 IMM · 6 STRUCT-excluded.
**Full frontier (all unmatched by h_seq):** 2041 target families (≥2 members or a matched sibling) + 3767 singletons (Step-D residue). Substantial: **378 families / 268,604 templatable ins**, 28 with a matched sibling (zero-crack). Substantial member classes: 1,595 PURE · 28 IMM · 6 STRUCT-excluded.
## Top substantial families (by templatable byte-weight)
@@ -21,47 +21,47 @@
| 4 | 299 | 20 (20/0/0) | 20/20 | scattered | PURE | 0 | Y | 0x8017fee0 modal | 5,980 |
| 5 | 246 | 16 (16/0/0) | 6/16 | cross-address | PURE | 0 | · | 0x8017c294 draft-ov077 | 3,936 |
| 6 | 491 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801863cc modal | 3,437 |
| 7 | 328 | 10 (10/0/0) | 10/10 | scattered | PURE | 1 | · | 0x801833f0 matched | 3,280 |
| 8 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 |
| 9 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 |
| 7 | 770 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | · | 0x80144b9c matched-ov077 | 3,080 |
| 8 | 611 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x80186e24 modal | 3,055 |
| 9 | 328 | 9 (9/0/0) | 9/9 | scattered | PURE | 2 | · | 0x801833f0 matched | 2,952 |
| 10 | 557 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80186570 modal | 2,785 |
| 11 | 551 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80189540 modal | 2,755 |
| 12 | 125 | 22 (22/0/0) | 22/22 | scattered | PURE | 0 | Y | 0x80185440 modal | 2,750 |
| 13 | 263 | 10 (10/0/0) | 10/10 | scattered | PURE | 1 | · | 0x80182fd4 matched | 2,630 |
| 14 | 513 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x801878e8 modal | 2,565 |
| 15 | 296 | 7 (7/0/0) | 7/7 | cross-address | PURE | 0 | · | 0x8017e2ec modal | 2,072 |
| 16 | 137 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | Y | 0x80183084 modal | 2,055 |
| 17 | 438 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x801380e0 matched-ov077 | 1,752 |
| 18 | 579 | 3 (3/0/0) | 2/3 | cross-address | PURE | 0 | Y | 0x8018103c draft-ov077 | 1,737 |
| 19 | 133 | 13 (13/0/0) | 10/13 | scattered | PURE | 1 | · | 0x8017d0bc matched | 1,729 |
| 20 | 288 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80184c74 modal | 1,728 |
| 21 | 281 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80186270 modal | 1,686 |
| 22 | 240 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801872b4 modal | 1,680 |
| 23 | 265 | 6 (0/6/0) | 6/6 | cross-address | IMM | 1 | · | 0x80183e04 matched | 1,590 |
| 24 | 143 | 11 (11/0/0) | 10/11 | scattered | PURE | 1 | · | 0x8017d77c matched | 1,573 |
| 25 | 251 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80186994 modal | 1,506 |
| 26 | 710 | 2 (2/0/0) | 2/2 | cross-address | PURE | 1 | Y | 0x80191c50 matched | 1,420 |
| 27 | 470 | 3 (3/0/0) | 3/3 | cross-address | PURE | 0 | Y | 0x80191320 modal | 1,410 |
| 28 | 279 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x8017f2d4 modal | 1,395 |
| 29 | 229 | 6 (6/0/0) | 2/6 | cross-address | PURE | 1 | · | 0x8017c290 matched | 1,374 |
| 30 | 673 | 2 (2/0/0) | 2/2 | cross-address | PURE | 1 | Y | 0x8019059c matched | 1,346 |
| 31 | 254 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80188e1c modal | 1,270 |
| 32 | 198 | 6 (6/0/0) | 6/6 | cross-address | PURE | 1 | · | 0x80181ee0 matched | 1,188 |
| 33 | 198 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80185f58 modal | 1,188 |
| 34 | 385 | 3 (3/0/0) | 3/3 | cross-address | PURE | 0 | Y | 0x8018ff98 modal | 1,155 |
| 35 | 185 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80187aec modal | 1,110 |
| 36 | 184 | 6 (6/0/0) | 2/6 | cross-address | PURE | 1 | · | 0x8017d318 matched | 1,104 |
| 37 | 203 | 5 (0/5/0) | 4/5 | cross-address | IMM | 5 | · | 0x8017e804 matched | 1,015 |
| 38 | 324 | 3 (3/0/0) | 2/3 | cross-address | PURE | 0 | Y | 0x80183324 draft-ov077 | 972 |
| 39 | 121 | 8 (8/0/0) | 8/8 | cross-address | PURE | 9 | · | 0x8018b76c matched | 968 |
| 40 | 95 | 10 (10/0/0) | 9/10 | scattered | PURE | 0 | Y | 0x80185d70 modal | 950 |
| 41 | 231 | 4 (4/0/0) | 4/4 | cross-address | PURE | 0 | Y | 0x8017f83c modal | 924 |
| 42 | 184 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x8017e3dc modal | 920 |
| 43 | 115 | 8 (8/0/0) | 6/8 | cross-address | PURE | 0 | · | 0x8018089c modal | 920 |
| 44 | 153 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x80181d94 modal | 918 |
| 45 | 152 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x8018200c modal | 912 |
| 46 | 180 | 5 (5/0/0) | 5/5 | cross-address | PURE | 0 | · | 0x80182a78 modal | 900 |
| 47 | 225 | 4 (4/0/0) | 4/4 | cross-address | PURE | 0 | · | 0x801803e0 modal | 900 |
| 48 | 150 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x8018829c modal | 900 |
| 49 | 175 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x8017e6bc modal | 875 |
| 50 | 124 | 7 (7/0/0) | 7/7 | cross-address | PURE | 0 | · | 0x80181cf0 modal | 868 |
| 13 | 513 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x801878e8 modal | 2,565 |
| 14 | 263 | 9 (9/0/0) | 9/9 | scattered | PURE | 2 | · | 0x80182fd4 matched | 2,367 |
| 15 | 137 | 15 (15/0/0) | 15/15 | scattered | PURE | 0 | Y | 0x80183084 modal | 2,055 |
| 16 | 438 | 4 (4/0/0) | 1/4 | per-location | PURE | 134 | Y | 0x801380e0 matched-ov077 | 1,752 |
| 17 | 579 | 3 (3/0/0) | 2/3 | cross-address | PURE | 0 | Y | 0x8018103c draft-ov077 | 1,737 |
| 18 | 288 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80184c74 modal | 1,728 |
| 19 | 281 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80186270 modal | 1,686 |
| 20 | 240 | 7 (7/0/0) | 6/7 | cross-address | PURE | 0 | Y | 0x801872b4 modal | 1,680 |
| 21 | 251 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80186994 modal | 1,506 |
| 22 | 143 | 10 (10/0/0) | 9/10 | scattered | PURE | 2 | · | 0x8017df78 matched | 1,430 |
| 23 | 710 | 2 (2/0/0) | 2/2 | cross-address | PURE | 1 | Y | 0x80191c50 matched | 1,420 |
| 24 | 470 | 3 (3/0/0) | 3/3 | cross-address | PURE | 0 | Y | 0x80191320 modal | 1,410 |
| 25 | 279 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x8017f2d4 modal | 1,395 |
| 26 | 673 | 2 (2/0/0) | 2/2 | cross-address | PURE | 1 | Y | 0x8019059c matched | 1,346 |
| 27 | 265 | 5 (0/5/0) | 5/5 | cross-address | IMM | 2 | · | 0x80183e04 matched | 1,325 |
| 28 | 254 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | Y | 0x80188e1c modal | 1,270 |
| 29 | 198 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80185f58 modal | 1,188 |
| 30 | 385 | 3 (3/0/0) | 3/3 | cross-address | PURE | 0 | Y | 0x8018ff98 modal | 1,155 |
| 31 | 229 | 5 (5/0/0) | 1/5 | per-location | PURE | 2 | · | 0x8017e72c matched | 1,145 |
| 32 | 185 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | Y | 0x80187aec modal | 1,110 |
| 33 | 184 | 6 (6/0/0) | 2/6 | cross-address | PURE | 1 | · | 0x8017d318 matched | 1,104 |
| 34 | 203 | 5 (0/5/0) | 4/5 | cross-address | IMM | 5 | · | 0x8017e804 matched | 1,015 |
| 35 | 324 | 3 (3/0/0) | 2/3 | cross-address | PURE | 0 | Y | 0x80183324 draft-ov077 | 972 |
| 36 | 121 | 8 (8/0/0) | 8/8 | cross-address | PURE | 9 | · | 0x8018b76c matched | 968 |
| 37 | 95 | 10 (10/0/0) | 9/10 | scattered | PURE | 0 | Y | 0x80185d70 modal | 950 |
| 38 | 231 | 4 (4/0/0) | 4/4 | cross-address | PURE | 0 | Y | 0x8017f83c modal | 924 |
| 39 | 184 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x8017e3dc modal | 920 |
| 40 | 115 | 8 (8/0/0) | 6/8 | cross-address | PURE | 0 | · | 0x8018089c modal | 920 |
| 41 | 153 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x80181d94 modal | 918 |
| 42 | 152 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x8018200c modal | 912 |
| 43 | 180 | 5 (5/0/0) | 5/5 | cross-address | PURE | 0 | · | 0x80182a78 modal | 900 |
| 44 | 225 | 4 (4/0/0) | 4/4 | cross-address | PURE | 0 | · | 0x801803e0 modal | 900 |
| 45 | 150 | 6 (6/0/0) | 6/6 | cross-address | PURE | 0 | · | 0x8018829c modal | 900 |
| 46 | 175 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x8017e6bc modal | 875 |
| 47 | 124 | 7 (7/0/0) | 7/7 | cross-address | PURE | 0 | · | 0x80181cf0 modal | 868 |
| 48 | 173 | 5 (5/0/0) | 4/5 | cross-address | PURE | 0 | · | 0x8017dc48 modal | 865 |
| 49 | 214 | 4 (4/0/0) | 4/4 | cross-address | PURE | 0 | · | 0x8017f2e8 modal | 856 |
| 50 | 122 | 7 (7/0/0) | 7/7 | cross-address | PURE | 0 | · | 0x8017f100 modal | 854 |
+19
View File
@@ -9533,6 +9533,25 @@ on **`tools/treelock.sh --status`**, which is a statement of intent spanning the
wrap a campaign in `nohup … &` inside a backgrounded call: the harness then signals completion of the
*wrapper* — a fleet check "finished" at 63/140.
### STEP 0 of sibling-first: grep `src/` for a distinctive LITERAL from the `.s`
§136c's search order (engine_core.h near-twin -> same-TU banked sibling -> the `.s`) has a hole: both
of its first two steps are **same-TU or shared-header** scoped, so neither can reach a banked twin
that lives in a **different overlay's** TU — and the large template classes live cross-overlay by
construction. Measured: `func_80188C04` (328 ins) was byte-identical to an already-banked
`func_801833F0` in `ov_SC02_028`, and one command found it —
grep -rn "E100000A" src/ # a magic word lifted straight out of the target .s
— after which the body was reused verbatim with only the file-local type/macro suffixes renamed.
**Put this ahead of engine_core.h.** Pick a distinctive constant from the target: a magic word, an
unusual mask, an odd immediate. Corollary for the family map: it carries an in-family `exemplar`
pointer only, so a family whose twin is banked *elsewhere* looks un-cracked — and, separately, that
pointer can name an instance that is **already banked**, which hides the whole family from any
ranking built on it. **Derive open sites from `corpus.stubs` over the member list.** Measured on one
wave: ranking off the map's `exemplar` yielded 16,696 templatable ins; deriving from `corpus.stubs`
yielded **41,023** — including a 55-ins family open in 138 overlays and a 46-ins one open in 133.
### Reconciling a gate-refused draft: which way you edit depends on WHERE the TU's decl is
A draft that `match_one`-MATCHes but the whole-binary gate refuses is declaration plumbing (the
+31 -31
View File
@@ -4,23 +4,23 @@
# cross-binary collapsible-byte leverage: docs/duplicates.cross.md.
# THREE progress metrics (all matter — see the labels):
FLEET fn-count byte-ident: 340408 / 353721 = 96.24% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
FLEET instr-weighted : 12344917 / 13141652 = 93.9% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number)
FLEET distinct-code(uniq): 4978834 / 5634875 = 88.4% (77631/87459 unique fns; the DISTINCT-RE number)
FLEET fn-count byte-ident: 340436 / 353721 = 96.24% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
FLEET instr-weighted : 12350091 / 13141652 = 94.0% (shipped .text across main + resident + 138 overlays; the decomp.dev-DISPLAY number)
FLEET distinct-code(uniq): 4983476 / 5634875 = 88.4% (77655/87459 unique fns; the DISTINCT-RE number)
MAIN game-code weighted : 436 / 60201 = 0.7% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-06-14; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift)
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12344481 / 13081451 = 94.4%)
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12349655 / 13081451 = 94.4%)
FLEET REAL substantive : 338553 (of which dedup-shared 241142 via 1910 groups / 241216 instances)
FLEET REAL substantive : 338581 (of which dedup-shared 241142 via 1910 groups / 241216 instances)
FLEET LINKED PsyQ objs : 959
FLEET NON_MATCHING : 7 (0 in any default build — G4)
FLEET INCLUDE_ASM stubs : 13306
FLEET INCLUDE_ASM stubs : 13278
FLEET matchable : 353721
| binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % |
|---|---:|---:|---:|---:|---:|---:|
| main | 54 | 2 | 959 | 1055 | 2096 | 50.3% |
| resident | 129 | 0 | 0 | 131 | 145 | 90.3% |
| ov_SC01_000 | 2382 | 1753 | 0 | 2382 | 2403 | 99.1% |
| ov_SC01_000 | 2384 | 1753 | 0 | 2384 | 2403 | 99.2% |
| ov_SC01_001 | 2390 | 1754 | 0 | 2392 | 2466 | 97.0% |
| ov_SC01_004 | 2384 | 1745 | 0 | 2385 | 2414 | 98.8% |
| ov_SC01_005 | 2414 | 1768 | 0 | 2414 | 2503 | 96.4% |
@@ -35,22 +35,22 @@ FLEET matchable : 353721
| ov_SC02_003 | 2507 | 1793 | 0 | 2507 | 2683 | 93.4% |
| ov_SC02_004 | 2382 | 1749 | 0 | 2382 | 2401 | 99.2% |
| ov_SC02_005 | 2530 | 1745 | 0 | 2540 | 2927 | 86.8% |
| ov_SC02_011 | 2614 | 1752 | 0 | 2625 | 2893 | 90.7% |
| ov_SC02_011 | 2616 | 1752 | 0 | 2627 | 2893 | 90.8% |
| ov_SC02_015 | 2393 | 1751 | 0 | 2393 | 2414 | 99.1% |
| ov_SC02_016 | 2474 | 1751 | 0 | 2477 | 2545 | 97.3% |
| ov_SC02_017 | 2542 | 1751 | 0 | 2550 | 2732 | 93.3% |
| ov_SC02_021 | 2398 | 1751 | 0 | 2398 | 2437 | 98.4% |
| ov_SC02_026 | 2489 | 1749 | 0 | 2495 | 2572 | 97.0% |
| ov_SC02_026 | 2490 | 1749 | 0 | 2496 | 2572 | 97.0% |
| ov_SC02_027 | 2546 | 1749 | 0 | 2555 | 2692 | 94.9% |
| ov_SC02_028 | 2552 | 1749 | 0 | 2562 | 2701 | 94.9% |
| ov_SC02_031 | 2485 | 1750 | 0 | 2490 | 2562 | 97.2% |
| ov_SC02_031 | 2486 | 1750 | 0 | 2491 | 2562 | 97.2% |
| ov_SC02_035 | 2473 | 1749 | 0 | 2476 | 2520 | 98.3% |
| ov_SC02_039 | 2387 | 1749 | 0 | 2387 | 2416 | 98.8% |
| ov_SC02_041 | 2464 | 1749 | 0 | 2467 | 2561 | 96.3% |
| ov_SC03_001 | 2650 | 1750 | 0 | 2667 | 2869 | 93.0% |
| ov_SC03_001 | 2651 | 1750 | 0 | 2668 | 2869 | 93.0% |
| ov_SC03_002 | 2526 | 1754 | 0 | 2541 | 2631 | 96.6% |
| ov_SC03_003 | 2391 | 1749 | 0 | 2392 | 2423 | 98.7% |
| ov_SC03_006 | 2540 | 1755 | 0 | 2549 | 2767 | 92.1% |
| ov_SC03_006 | 2541 | 1755 | 0 | 2550 | 2767 | 92.2% |
| ov_SC03_007 | 2454 | 1749 | 0 | 2458 | 2623 | 93.7% |
| ov_SC03_010 | 2407 | 1749 | 0 | 2407 | 2471 | 97.4% |
| ov_SC03_011 | 2409 | 1749 | 0 | 2415 | 2527 | 95.6% |
@@ -59,12 +59,12 @@ FLEET matchable : 353721
| ov_SC03_014 | 2563 | 1777 | 0 | 2563 | 2685 | 95.5% |
| ov_SC03_015 | 2562 | 1777 | 0 | 2562 | 2685 | 95.4% |
| ov_SC03_023 | 2393 | 1749 | 0 | 2394 | 2435 | 98.3% |
| ov_SC03_024 | 2504 | 1754 | 0 | 2511 | 2641 | 95.1% |
| ov_SC03_028 | 2451 | 1749 | 0 | 2455 | 2664 | 92.2% |
| ov_SC03_024 | 2505 | 1754 | 0 | 2512 | 2641 | 95.1% |
| ov_SC03_028 | 2452 | 1749 | 0 | 2456 | 2664 | 92.2% |
| ov_SC03_029 | 2493 | 1751 | 0 | 2503 | 2644 | 94.7% |
| ov_SC03_030 | 2411 | 1754 | 0 | 2413 | 2495 | 96.7% |
| ov_SC03_031 | 2440 | 1749 | 0 | 2443 | 2514 | 97.2% |
| ov_SC03_089 | 2499 | 1754 | 0 | 2506 | 2581 | 97.1% |
| ov_SC03_089 | 2501 | 1754 | 0 | 2508 | 2581 | 97.2% |
| ov_SC03_090 | 2509 | 1754 | 0 | 2517 | 2625 | 95.9% |
| ov_SC03_091 | 2523 | 1749 | 0 | 2531 | 2640 | 95.9% |
| ov_SC03_092 | 2492 | 1754 | 0 | 2504 | 2587 | 96.8% |
@@ -84,18 +84,18 @@ FLEET matchable : 353721
| ov_SC03_108 | 2390 | 1749 | 0 | 2390 | 2443 | 97.8% |
| ov_SC03_109 | 2400 | 1749 | 0 | 2402 | 2424 | 99.1% |
| ov_SC03_110 | 2432 | 1749 | 0 | 2432 | 2468 | 98.5% |
| ov_SC03_111 | 2462 | 1749 | 0 | 2465 | 2510 | 98.2% |
| ov_SC03_111 | 2463 | 1749 | 0 | 2466 | 2510 | 98.2% |
| ov_SC03_112 | 2424 | 1751 | 0 | 2426 | 2526 | 96.0% |
| ov_SC03_113 | 2425 | 1751 | 0 | 2428 | 2468 | 98.4% |
| ov_SC03_114 | 2382 | 1749 | 0 | 2384 | 2415 | 98.7% |
| ov_SC03_113 | 2426 | 1751 | 0 | 2429 | 2468 | 98.4% |
| ov_SC03_114 | 2383 | 1749 | 0 | 2385 | 2415 | 98.8% |
| ov_SC03_115 | 2423 | 1749 | 0 | 2425 | 2472 | 98.1% |
| ov_SC03_116 | 2390 | 1749 | 0 | 2393 | 2438 | 98.2% |
| ov_SC03_117 | 2458 | 1749 | 0 | 2464 | 2557 | 96.4% |
| ov_SC03_118 | 2530 | 1773 | 0 | 2531 | 2685 | 94.3% |
| ov_SC03_119 | 2526 | 1773 | 0 | 2527 | 2685 | 94.1% |
| ov_SC03_118 | 2531 | 1773 | 0 | 2532 | 2685 | 94.3% |
| ov_SC03_119 | 2527 | 1773 | 0 | 2528 | 2685 | 94.2% |
| ov_SC03_121 | 2396 | 1749 | 0 | 2399 | 2459 | 97.6% |
| ov_SC03_124 | 2560 | 1745 | 0 | 2580 | 2741 | 94.1% |
| ov_SC03_125 | 2513 | 1749 | 0 | 2525 | 2588 | 97.6% |
| ov_SC03_125 | 2514 | 1749 | 0 | 2526 | 2588 | 97.6% |
| ov_SC03_126 | 2392 | 1751 | 0 | 2392 | 2423 | 98.7% |
| ov_SC04_000 | 2465 | 1753 | 0 | 2474 | 2546 | 97.2% |
| ov_SC04_002 | 2492 | 1749 | 0 | 2496 | 2636 | 94.7% |
@@ -107,19 +107,19 @@ FLEET matchable : 353721
| ov_SC04_008 | 2393 | 1749 | 0 | 2393 | 2415 | 99.1% |
| ov_SC04_009 | 2419 | 1749 | 0 | 2422 | 2441 | 99.2% |
| ov_SC04_010 | 2395 | 1749 | 0 | 2396 | 2419 | 99.0% |
| ov_SC04_011 | 2507 | 1754 | 0 | 2513 | 2803 | 89.7% |
| ov_SC04_011 | 2508 | 1754 | 0 | 2514 | 2803 | 89.7% |
| ov_SC04_012 | 2390 | 1749 | 0 | 2391 | 2420 | 98.8% |
| ov_SC04_015 | 2518 | 1750 | 0 | 2529 | 2611 | 96.9% |
| ov_SC04_016 | 2393 | 1749 | 0 | 2395 | 2440 | 98.2% |
| ov_SC04_016 | 2394 | 1749 | 0 | 2396 | 2440 | 98.2% |
| ov_SC04_018 | 2662 | 1785 | 0 | 2662 | 2857 | 93.2% |
| ov_SC04_019 | 2654 | 1785 | 0 | 2654 | 2857 | 92.9% |
| ov_SC04_020 | 2500 | 1749 | 0 | 2512 | 2567 | 97.9% |
| ov_SC04_020 | 2501 | 1749 | 0 | 2513 | 2567 | 97.9% |
| ov_SC04_021 | 2392 | 1751 | 0 | 2392 | 2423 | 98.7% |
| ov_SC05_000 | 2399 | 1753 | 0 | 2402 | 2422 | 99.2% |
| ov_SC05_001 | 2467 | 1749 | 0 | 2472 | 2574 | 96.0% |
| ov_SC05_002 | 2423 | 1749 | 0 | 2426 | 2442 | 99.3% |
| ov_SC05_003 | 2404 | 1749 | 0 | 2405 | 2481 | 96.9% |
| ov_SC05_004 | 2413 | 1749 | 0 | 2415 | 2464 | 98.0% |
| ov_SC05_004 | 2414 | 1749 | 0 | 2416 | 2464 | 98.1% |
| ov_SC05_005 | 2429 | 1754 | 0 | 2430 | 2491 | 97.6% |
| ov_SC05_006 | 2415 | 1749 | 0 | 2415 | 2430 | 99.4% |
| ov_SC05_007 | 2422 | 1749 | 0 | 2427 | 2482 | 97.8% |
@@ -128,18 +128,18 @@ FLEET matchable : 353721
| ov_SC05_010 | 2439 | 1749 | 0 | 2443 | 2588 | 94.4% |
| ov_SC05_011 | 2389 | 1749 | 0 | 2390 | 2409 | 99.2% |
| ov_SC05_017 | 2633 | 1746 | 0 | 2644 | 2842 | 93.0% |
| ov_SC05_018 | 2529 | 1749 | 0 | 2542 | 2673 | 95.1% |
| ov_SC05_018 | 2530 | 1749 | 0 | 2543 | 2673 | 95.1% |
| ov_SC05_019 | 2392 | 1751 | 0 | 2392 | 2423 | 98.7% |
| ov_SC06_000 | 2518 | 1758 | 0 | 2521 | 2691 | 93.7% |
| ov_SC06_006 | 2415 | 1749 | 0 | 2416 | 2511 | 96.2% |
| ov_SC06_000 | 2519 | 1758 | 0 | 2522 | 2691 | 93.7% |
| ov_SC06_006 | 2416 | 1749 | 0 | 2417 | 2511 | 96.3% |
| ov_SC06_008 | 2472 | 1751 | 0 | 2478 | 2542 | 97.5% |
| ov_SC06_010 | 2446 | 1749 | 0 | 2451 | 2517 | 97.4% |
| ov_SC06_011 | 2407 | 1749 | 0 | 2411 | 2468 | 97.7% |
| ov_SC06_011 | 2408 | 1749 | 0 | 2412 | 2468 | 97.7% |
| ov_SC06_013 | 2397 | 1749 | 0 | 2398 | 2425 | 98.9% |
| ov_SC06_014 | 2408 | 1749 | 0 | 2410 | 2453 | 98.2% |
| ov_SC06_015 | 2402 | 1749 | 0 | 2402 | 2421 | 99.2% |
| ov_SC06_016 | 2444 | 1749 | 0 | 2446 | 2549 | 96.0% |
| ov_SC06_018 | 2476 | 1751 | 0 | 2483 | 2665 | 93.2% |
| ov_SC06_018 | 2477 | 1751 | 0 | 2484 | 2665 | 93.2% |
| ov_SC06_020 | 2432 | 1751 | 0 | 2433 | 2518 | 96.6% |
| ov_SC06_022 | 2462 | 1749 | 0 | 2470 | 2642 | 93.5% |
| ov_SC06_024 | 2481 | 1749 | 0 | 2487 | 2667 | 93.3% |
@@ -147,7 +147,7 @@ FLEET matchable : 353721
| ov_SC06_027 | 2384 | 1749 | 0 | 2385 | 2408 | 99.0% |
| ov_SC06_029 | 2466 | 1749 | 0 | 2478 | 2662 | 93.1% |
| ov_SC06_030 | 2405 | 1749 | 0 | 2405 | 2456 | 97.9% |
| ov_SC06_032 | 2468 | 1750 | 0 | 2475 | 2658 | 93.1% |
| ov_SC06_032 | 2469 | 1750 | 0 | 2476 | 2658 | 93.2% |
| ov_SC06_033 | 2467 | 1750 | 0 | 2474 | 2631 | 94.0% |
| ov_SC07_000 | 2425 | 1753 | 0 | 2427 | 2521 | 96.3% |
| ov_SC07_001 | 2397 | 1749 | 0 | 2399 | 2454 | 97.8% |
+24 -1
View File
@@ -2243,7 +2243,30 @@ void func_80131FDC(void *a0) {
}
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80132018);
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
extern void func_8001C214(int, int);
extern void (*D_8017F130[])(void);
extern s32 D_8017F134[];
void func_80132018(void *a0)
{
s32 v0;
v0 = ((int (*)(void))func_8012C1B8)();
*(s32 *)((s32)a0 + 0x20) = v0;
if (v0 == 0) {
func_8012CAE4(a0);
} else {
func_8001C214(v0, 0);
*(s16 *)((s32)a0 + 0x5c) = 0x80;
*(u16 *)((s32)a0 + 0x2) += 1;
*(s32 *)((s32)a0 + 0x58) = (s32)&D_8017F134[(*(u16 *)((s32)a0 + 0x70) & 0xfff) * 5];
*(s32 *)((s32)a0 + 0xdc) = (s32)D_8017F130[(*(u16 *)((s32)a0 + 0x70) & 0xfff) * 5];
*(u16 *)((s32)a0 + 0xfc) = (*(u16 *)((s32)a0 + 0x70) >> 0xc) << 9;
}
}
DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */
+42 -1
View File
@@ -2945,7 +2945,48 @@ s32 func_80175820(void)
}
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801734BC", func_801758FC);
/* func_801758FC — twin of the byte-matched func_80175820 / func_801759D8 in this same TU.
* Same three-part body (part1: mask-merge a word at ptr[N] with a masked read from
* D_8011F7A8+idx*4+B; part2: mask-merge *p2 (p2 = D_8011F7A8+idx*4+A) with the old ptr[N] value;
* part3: D_800AF634[idx].g0 accumulates ((D_8011F7A8+idx*4+B) - ((D_8011F7A8+idx*4+A) - 0x14)) >> 2),
* here with N=3 (offset 0xC), A=0x28 (D_8011F7D0), B=0x30 (D_8011F7D8).
* The two __asm__ memory fences keep the three parts from CSE-ing their base addresses together,
* matching func_80175820 / func_801759D8 exactly (same idiom, different slot/offsets).
*/
typedef struct { u32 *f0; s32 pad[4]; } S_AE7BC_801758FC; /* size 0x14 */
typedef struct { s32 g0; s32 pad[2]; } S_AF634_801758FC; /* size 0x0C */
s32 func_801758FC(void)
{
extern s16 D_800B9A02;
extern S_AE7BC_801758FC D_800AE7BC[];
extern S_AF634_801758FC D_800AF634[];
extern u8 D_8011F7A8;
u8 *p = (u8 *)&D_8011F7A8;
u16 *q;
u32 *ptr;
u32 old;
u32 *p2;
q = (u16 *)&(*(u16 *)&D_800B9A02);
ptr = D_800AE7BC[*q].f0;
old = ptr[3];
ptr[3] = (old & 0xff000000) | (*(u32 *)(p + *q * 4 + 0x30) & 0xffffff);
__asm__("" ::: "memory");
p2 = *(u32 **)(p + *q * 4 + 0x28);
*p2 = (*p2 & 0xff000000) | (old & 0xffffff);
__asm__("" ::: "memory");
{
s32 acc = D_800AF634[*q].g0;
s32 t = *(s32 *)(p + *q * 4 + 0x28) - 0x14;
D_800AF634[*q].g0 = acc + ((*(s32 *)(p + *q * 4 + 0x30) - t) >> 2);
}
}
+209 -2
View File
@@ -4824,7 +4824,79 @@ void func_8017DD34(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_8017DE10);
/* func_8017DE10 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10;
void func_8017DE10(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
@@ -5097,7 +5169,142 @@ void func_8017E5E8(void) {
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_8017E5F0);
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_8017E72C);
/* func_8017E72C -- ov_SC02_011, TU ov_SC02_011_jr_8017AE2C.c
*
* §136c sibling-first: near-twin is the already-banked func_8017C290 in
* src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c (same "jr_8017AE2C" family).
* Reused verbatim from it: the MATRIX/SVECTOR/PW (packed align-1, 4 byte)
* type trio, the gte_ldv0/gte_rt/gte_stsv inline-asm macros, the whole
* statement shape and order, and the extern decls for func_80013F3C /
* RotMatrixZ / func_8004914C / func_800491AC / func_80017714 / rand.
* Only the data symbols differ (D_801EB4C8 in place of D_801EA8C0, etc.) --
* none of them appear anywhere else in this TU, so fresh local types are
* declared here under a _8017E72C suffix.
*/
typedef struct { s16 m[3][3]; s16 pad; s32 t[3]; } MATRIX_8017E72C;
typedef struct { u16 vx, vy, vz, pad; } SVECTOR_8017E72C;
struct PW8017E72C { int w; } __attribute__((packed, aligned(1)));
extern void func_80013F3C(s32 a0);
extern void RotMatrixZ(s32, void *);
extern void func_8004914C(void *a0);
extern void func_800491AC(void *a0);
extern int rand(void);
extern void func_80017714(void *);
extern SVECTOR_8017E72C D_801EB4C8[4];
extern struct PW8017E72C D_801EB4E8;
extern struct PW8017E72C D_801EB4EC;
extern u8 D_801EB4F0, D_801EB4F1, D_801EB4F2, D_801EB4F4, D_801EB4F5, D_801EB4F6;
extern int D_801EB4F8;
extern struct PW8017E72C D_80194BA4[];
#define gte_ldv0(r0) __asm__ __volatile__( \
"lwc2 $0, 0(%0)\n" \
"lwc2 $1, 4(%0)\n" \
: : "r"(r0) : "memory")
#define gte_rt() __asm__ __volatile__( \
"nop\n" \
"nop\n" \
"mvmva 1, 0, 0, 0, 0\n" \
: : : "memory")
#define gte_stsv(r0) __asm__ __volatile__( \
"mfc2 $12, $9\n" \
"mfc2 $13, $10\n" \
"mfc2 $14, $11\n" \
"sh $12, 0(%0)\n" \
"sh $13, 2(%0)\n" \
"sh $14, 4(%0)\n" \
: : "r"(r0) : "$12", "$13", "$14", "memory")
void func_8017E72C(int a, s16 *b, SVECTOR_8017E72C *c, SVECTOR_8017E72C *d,
SVECTOR_8017E72C *e, SVECTOR_8017E72C *f, s16 *g)
{
MATRIX_8017E72C m;
SVECTOR_8017E72C *r0_00;
SVECTOR_8017E72C *pSVar6;
SVECTOR_8017E72C *r0;
int r;
int mask;
func_80013F3C((s32)&m);
RotMatrixZ(g[0], &m);
m.t[0] = b[0];
m.t[1] = b[1];
m.t[2] = 0;
func_8004914C(&m);
func_800491AC(&m);
r0_00 = &D_801EB4C8[0];
if (*(s16 *)(a + 0x12) == 0) {
D_801EB4F8 = 0x50000000;
D_801EB4E8 = D_80194BA4[*(s32 *)(a + 0x2C)];
D_801EB4EC = D_80194BA4[*(s32 *)(a + 0x2C)];
D_801EB4F0 = 0;
D_801EB4F1 = 0;
D_801EB4F2 = 0;
D_801EB4F4 = 0;
D_801EB4F5 = 0;
D_801EB4F6 = 0;
}
f->vx = f->vx + c->vx;
f->vy = f->vy + c->vy;
r = rand();
mask = f->pad & r;
if (*(u16 *)(a + 0x12) & 1)
f->vx = f->vx + mask;
else
f->vx = f->vx - mask;
r = rand();
{ int t = f->vy - 0x10; f->vy = t + (r & 0x1f); }
gte_ldv0(c);
gte_rt();
gte_stsv(r0_00);
gte_ldv0(f);
gte_rt();
gte_stsv(r0_00 + 1);
gte_ldv0(d);
gte_rt();
r0 = r0_00 + 2;
gte_stsv(r0);
*d = *f;
r = rand();
d->vx = d->vx - (f->pad & r);
gte_ldv0(d);
gte_rt();
pSVar6 = r0_00 + 3;
gte_stsv(pSVar6);
r0_00->vz = ((u16 *)b)[2];
func_80017714(r0_00);
gte_ldv0(e);
gte_rt();
gte_stsv(r0);
*e = *f;
r = rand();
e->vx = e->vx + (f->pad & r);
gte_ldv0(e);
gte_rt();
gte_stsv(pSVar6);
r0_00->vz = ((u16 *)b)[2];
func_80017714(r0_00);
*c = *f;
}
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_8017EAC0);
+21 -1
View File
@@ -6542,7 +6542,27 @@ void func_80185634(void *a0) {
}
INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8017C180", func_801856E4);
#include "common.h"
/* §37 data asm-label alias: D_800A5EA8/D_800A5EB0/struct B16_80185634 are already declared
* above the splice point (func_80185634's block, same TU). Redeclaring the struct TAG body
* verbatim would be a C89 duplicate-definition error there, so alias a private identifier
* onto the same linker symbol -- zero blast radius, identical %hi/%lo(D_800A5EA8) codegen. */
struct B16_801856E4 { s32 w[4]; };
extern struct B16_801856E4 aD800A5EA8 __asm__("D_800A5EA8");
extern struct B16_801856E4 D_801CCC30;
extern s32 D_800A5EB0;
extern s32 func_8004787C(s32 a0);
extern void func_80028620(s32 a0, void *a1);
void func_801856E4(void *a0) {
aD800A5EA8 = D_801CCC30;
D_800A5EB0 = func_8004787C(*(s16 *)((s32)a0 + 0xFE)) * 6 / 4096 - 3;
*(u16 *)((s32)a0 + 0xFE) = (*(u16 *)((s32)a0 + 0xFE) + 0x71) & 0xFFF;
func_80028620(2, &aD800A5EA8);
}
#include "common.h"
+75 -1
View File
@@ -5457,7 +5457,81 @@ void func_8017ED60(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8017AE2C", func_8017EE3C);
/* func_8017EE3C -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017EE3C;
void func_8017EE3C(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017EE3C D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017EE3C m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+95 -1
View File
@@ -4275,7 +4275,101 @@ void func_8017DEE8(void *arg0) {
}
INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8017AE2C", func_8017DF78);
extern u8 D_80078EB1;
extern u8 D_80078E78[];
extern u8 D_800AF630[];
extern Ent_8017D6EC_8017DEE8 D_801EE888[];
extern s32 func_8004787C(s32 a0);
extern void func_8012AD44(s32 *a0, s16 a1);
extern void func_8017E1B4(void *a0);
extern void func_8017E2C0(void *arg0);
void func_8017DF78(void *arg0)
{
u8 *m;
u8 *e78;
s32 k;
m = D_800AF630;
e78 = D_80078E78;
if (D_80078EB1 >= 9) {
s32 count;
s32 i;
u8 *base;
base = (u8 *)D_801EE888;
count = 0;
for (i = 0; i < 4; i++) {
if (*(s32 *)(base + i * 0x24 + 0x1C) == 0) {
count++;
}
}
if (count == 0) {
func_8012AD44((s32 *)arg0, 0);
return;
}
}
for (k = 0; k < 4; k++) {
u8 *p = (u8 *)D_801EE888 + k * 0x24;
s32 c;
if (*(s32 *)(p + 0x1C) != 0) {
continue;
}
{
s16 val = *(s16 *)(p + 0xC);
if (val < 0x401) {
*(s16 *)(p + 0xC) = val + 0xB;
} else if (*(s32 *)(p + 0x18) != 0) {
*(s32 *)(p + 0x18) -= 1;
} else {
*(s16 *)(p + 0xC) = val + 0xB;
}
}
if (*(s16 *)(p + 0xC) >= 0x801) {
*(s16 *)(p + 0xC) = 0;
}
c = (func_8004787C(*(s16 *)(p + 0xC)) / 64) & 0xFF;
c = c | (c << 16 | c << 8);
*(s32 *)(p + 0x4) = c;
c = (func_8004787C(*(s16 *)(p + 0xC)) / 256) & 0xFF;
c = c | (c << 16 | c << 8);
*(s32 *)(p + 0x8) = c;
if ((*(u16 *)(m + 0xA3AA) & 1) == 0) {
s16 cnt = *(u16 *)(p + 0xE) + 1;
*(u16 *)(p + 0xE) = cnt;
if (cnt >= 0x40) {
*(u16 *)(p + 0xE) = 0;
}
}
{
s32 val2 = *(s16 *)(p + 0xC);
if (val2 == 0) {
*(s32 *)(p + 0x1C) = 1;
} else if (val2 >= 0x556) {
if (*(s32 *)(p + 0x20) == 0) {
*(s32 *)(p + 0x20) = 1;
if (e78[0x39] < 9) {
func_8017E1B4(p);
}
}
}
}
func_8017E2C0(p);
}
}
INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8017AE2C", func_8017E1B4);
+75 -1
View File
@@ -5249,7 +5249,81 @@ void func_8017E634(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_8017E710);
/* func_8017E710 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017E710;
void func_8017E710(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017E710 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017E710 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -3855,7 +3855,81 @@ void func_8017FAEC(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8017DF84", func_8017FBC8);
/* func_8017FBC8 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017FBC8;
void func_8017FBC8(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017FBC8 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017FBC8 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -4341,7 +4341,81 @@ void func_8017D294(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017AE2C", func_8017D370);
/* func_8017D370 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017D370;
void func_8017D370(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017D370 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017D370 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+376 -2
View File
@@ -7477,9 +7477,383 @@ INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_801886B
INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_8018879C);
INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_801887E8);
#include "common.h"
/* func_801887E8 -- ov_SC03_089, TU src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c
*
* This is the SAME routine (family of 10) as the already-BANKED
* func_80182FD4 in src/ov_SC02_028/ov_SC02_028_jr_8017D898.c -- identical
* shape confirmed instruction-for-instruction against the target .s:
* - offset 0x20: source point-offset table pointer (Src->pt[12], stride 4,
* u16 vx,vy each, table starts at +0x10 within the struct)
* - offset 0x2E/0x30/0x32: base position (u16 vx,vy,vz)
* - offset 0x34: dispatch func_8001E094()/func_8001E378(a0)
* - single-point gte_ldv0/rtps/stsxy(&buf[0]) + gte_stflg + gte_stszotz
* - flag & ~0x1000 early-out
* - offset 0x2C: w; z = otz+1, adjusted by (w&0xC000) 0x4000/0x8000/0xC000
* cases, clamped >=0, early-out if z>=0x1000
* - offset 0x1E bit 0x8000: two different traversal orders over pt[],
* both ending in a call taking (a0, a1, &buf[0], ot [+z]).
* Only the callee at the very end differs (func_80188C04 here vs
* func_801833F0 there) and the per-overlay local type names.
*/
void func_801887E8(void *a0, void *a1)
{
typedef struct { u16 vx, vy; } Pt2_801887E8;
typedef struct { u8 pad[0x10]; Pt2_801887E8 pt[12]; } Src_801887E8;
typedef struct { u16 vx, vy, vz, pad; } Vec8_801887E8;
extern void func_8001E094(void);
extern void func_8001E378(void *a0);
extern void func_80188C04(void *a0, void *a1, u32 *a2, u32 *a3);
extern u8 D_800A6610[];
extern short D_800B9A02;
Vec8_801887E8 base;
Vec8_801887E8 v[3];
u32 buf[19];
long flag;
long otz;
long flag2;
Src_801887E8 *s;
u32 *ot;
s32 z;
s32 i;
u16 w;
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_ldv3(r0, r1, r2) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 );" \
"lwc2 $2, 0( %1 );" \
"lwc2 $3, 4( %1 );" \
"lwc2 $4, 0( %2 );" \
"lwc2 $5, 4( %2 )" \
: \
: "r"( r0 ), "r"( r1 ), "r"( r2 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_rtpt() __asm__ volatile ("nop;nop;rtpt")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsxy3(r0, r1, r2) __asm__ volatile ( \
"swc2 $12, 0( %0 );" \
"swc2 $13, 0( %1 );" \
"swc2 $14, 0( %2 )" \
: \
: "r"( r0 ), "r"( r1 ), "r"( r2 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
ot = (u32 *)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
s = *(Src_801887E8 **)((s32)a0 + 0x20);
if (s == 0) {
return;
}
if (*(s32 *)((s32)a0 + 0x34) != 0) {
func_8001E094();
} else {
func_8001E378(a0);
}
base.vx = *(u16 *)((s32)a0 + 0x2E);
base.vy = *(u16 *)((s32)a0 + 0x30);
base.vz = *(u16 *)((s32)a0 + 0x32);
gte_ldv0(&base);
gte_rtps();
gte_stsxy(&buf[0]);
gte_stflg(&flag);
gte_stszotz(&otz);
if (flag & ~0x1000) {
return;
}
w = *(u16 *)((s32)a0 + 0x2C);
z = otz + 1;
if ((w & 0xC000) != 0) {
if ((w & 0xC000) == 0xC000) {
z -= (w & 0xFFF);
if (z < 0) {
z = 0;
}
} else {
z += (w & 0xFFF);
}
}
if (z >= 0x1000) {
return;
}
if (*(s16 *)((s32)a0 + 0x1E) & 0x8000) {
for (i = 0; i < 12; i += 6) {
v[0].vx = base.vx + s->pt[i].vx;
v[0].vy = base.vy + s->pt[i].vy;
v[0].vz = base.vz;
v[1].vx = base.vx + s->pt[i + 2].vx;
v[1].vy = base.vy + s->pt[i + 2].vy;
v[1].vz = base.vz;
v[2].vx = base.vx + s->pt[i + 4].vx;
v[2].vy = base.vy + s->pt[i + 4].vy;
v[2].vz = base.vz;
gte_ldv3(&v[0], &v[1], &v[2]);
gte_rtpt();
gte_stsxy3(&buf[i + 1], &buf[i + 3], &buf[i + 5]);
}
for (i = 1; i < 12; i += 2) {
v[0].vx = base.vx + s->pt[i].vx;
v[0].vy = base.vy + s->pt[i].vy;
v[0].vz = base.vz;
gte_ldv0(&v[0]);
gte_rtps();
gte_stsxy(&buf[i + 1]);
gte_stflg(&flag2);
gte_stszotz(&otz);
buf[13 + (i >> 1)] = otz + 1;
}
func_80188C04(a0, a1, &buf[0], ot);
} else {
for (i = 0; i < 12; i += 3) {
v[0].vx = base.vx + s->pt[i].vx;
v[0].vy = base.vy + s->pt[i].vy;
v[0].vz = base.vz;
v[1].vx = base.vx + s->pt[i + 1].vx;
v[1].vy = base.vy + s->pt[i + 1].vy;
v[1].vz = base.vz;
v[2].vx = base.vx + s->pt[i + 2].vx;
v[2].vy = base.vy + s->pt[i + 2].vy;
v[2].vz = base.vz;
gte_ldv3(&v[0], &v[1], &v[2]);
gte_rtpt();
gte_stsxy3(&buf[i + 1], &buf[i + 2], &buf[i + 3]);
}
func_80188C04(a0, a1, &buf[0], ot + z);
}
}
/* func_80188C04 - ov_SC03_089 (328 ins, frame 0x38, leaf, 10-member family).
*
* §136c SIBLING-FIRST: this is a BYTE-IDENTICAL clone of the already-banked
* func_801833F0 in src/ov_SC02_028/ov_SC02_028_jr_8017D898.c:4441.
* diff of the two nonmatchings .s files (addresses/encodings stripped) is
* EMPTY - verified against asm/ov_SC03_090/.../func_8018B028.s, the same
* family template. So the banked body is reused VERBATIM, only the
* file-local type/macro suffixes renamed to _80188C04.
*
* DECLARATION SURFACE (whole-TU one-pass grep, D2):
* - src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c has NO prototype and NO call
* for func_80188C04 (only the INCLUDE_ASM at :7482). `D_80188C04` hits
* elsewhere in src/ are a DIFFERENT symbol in other overlays.
* - `extern u8 *D_800A5E60;` is function-scope here, identical in shape to
* the TU's own function-scope decls at :2815 and :3431.
* - The TU expands ZERO DEFINE_func_*()/DEFINE_data_*() macros from
* engine_core.h (noted in-file at :5728), and engine_core.h contains no
* PTag_/Ft4_/Drm_/SR3_/ADDPRIM_ names at all - no type/macro collision,
* no repeated-typedef / repeated bare-struct-tag C89 error.
*
* The levers that make this body byte-true are documented in full on the
* banked twin (giv record order, the 1-unit allocno priority flip closed by
* the trailing zero-byte dead read on `vtx`, the two real dead computations,
* the volatile OT index that preserves the q biv, the uu/vv split copies).
* They are reproduced here unchanged; the trailing
* __asm__ __volatile__("" ::"r"(vtx));
* placement is load-bearing - do not move it.
*/
#include "common.h"
typedef struct {
u32 addr : 24;
u32 len : 8;
} PTag_80188C04;
typedef struct {
PTag_80188C04 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_80188C04;
typedef struct {
PTag_80188C04 tag;
u32 code0;
} Drm_80188C04;
#define ADDPRIM_80188C04(o, p) \
(((PTag_80188C04 *)(p))->addr = ((PTag_80188C04 *)(o))->addr, \
((PTag_80188C04 *)(o))->addr = (u32)(p))
/* lhu / sll 16 / sra 19 : signed 13-bit field held at bit 3 of a u16 */
#define SR3_80188C04(a) (((s32)(*(u16 *)(a) << 16)) >> 19)
void func_80188C04(void *ent, void *spr, u32 *q, u32 *ot)
{
extern u8 *D_800A5E60;
register s32 zr __asm__("$0");
Ft4_80188C04 *poly;
Drm_80188C04 *dm;
s32 vtx;
u32 flags;
s32 tp, abr, code, shift;
u16 x;
u32 y;
s32 tpage, clut, cy;
s32 su, sv, uu, vv;
u16 fl;
s32 i, m;
u32 b;
poly = (Ft4_80188C04 *)D_800A5E60;
fl = *(u16 *)((s32)ent + 0x1E) & 0x8000;
flags = *(u32 *)((s32)ent + 4);
tp = (flags >> 24) & 3;
shift = 2 - tp;
x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift);
y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6);
vtx = *(s32 *)((s32)ent + 0x20);
D_800A5E60 += 0xF0;
if (flags & 0x40000000) {
code = 0x2E;
abr = (flags >> 28) & 3;
} else {
code = 0x2C;
abr = 1;
}
tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) |
((y & 0x200) << 2);
b = *(u8 *)((s32)ent + 0x27);
cy = (b + 0x100) << 6;
if (b < 0xE0) {
clut = cy | 0x16;
} else {
clut = cy | 0x10;
}
{
s32 t = ((x - ((tpage & 0xF) << 6)) << shift) +
(*(u16 *)((s32)spr + 4) & ((1 << shift) - 1));
su = t + zr;
__asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1));
__asm__ __volatile__("" ::"r"(t));
}
y = y & 0xFFFF;
if (tpage & 0x10) {
sv = y - 0x100;
} else {
sv = y + zr;
}
__asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1));
i = 1;
uu = su;
vv = sv;
for (; i < 13; i += 2, poly++) {
s32 k = (i - 1) * 4;
__asm__ __volatile__("" ::"r"(i));
poly->tag.len = 9;
poly->code = code;
poly->tpage = tpage;
poly->u2 = su;
poly->v2 = sv;
poly->u0 = SR3_80188C04(vtx + k + 0x10) + uu;
poly->v0 = SR3_80188C04(vtx + k + 0x12) + vv;
poly->u1 = SR3_80188C04(vtx + i * 4 + 0x10) + uu;
poly->v1 = SR3_80188C04(vtx + i * 4 + 0x12) + vv;
/* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv. */
{
s32 k2 = (i + 1) * 4;
poly->u3 = SR3_80188C04(vtx + k2 + 0x10) + uu;
poly->v3 = SR3_80188C04(vtx + k2 + 0x12) + vv;
}
poly->clut = clut;
__asm__ __volatile__("" ::"r"(i), "r"(i));
poly->r0 = *(u8 *)((s32)ent + 0x24);
poly->g0 = *(u8 *)((s32)ent + 0x25);
poly->b0 = *(u8 *)((s32)ent + 0x26);
poly->x0 = ((u16 *)q)[i * 2];
poly->y0 = ((u16 *)q)[i * 2 + 1];
poly->x1 = ((u16 *)q)[i * 2 + 2];
poly->y1 = ((u16 *)q)[i * 2 + 3];
poly->x2 = ((u16 *)q)[0];
poly->y2 = ((u16 *)q)[1];
poly->x3 = ((u16 *)q)[i * 2 + 4];
poly->y3 = ((u16 *)q)[i * 2 + 5];
if (fl != 0) {
ADDPRIM_80188C04(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly);
} else {
ADDPRIM_80188C04(ot, poly);
}
}
poly[-1].x3 = ((u16 *)q)[2];
poly[-1].y3 = ((u16 *)q)[3];
poly[-1].u3 = su + SR3_80188C04(vtx + 0x10);
poly[-1].v3 = sv + SR3_80188C04(vtx + 0x12);
if (flags & 0x40000000) {
dm = (Drm_80188C04 *)poly;
if (fl != 0) {
m = 0;
D_800A5E60 += 0x30;
do {
m++;
dm->tag.len = 1;
dm->code0 = (abr << 5) | 0xE100000A;
ADDPRIM_80188C04(&ot[*(volatile s32 *)((s32)q + 0x34)], dm);
q = (u32 *)((s32)q + 4);
dm++;
} while (m < 6);
} else {
dm->code0 = (abr << 5) | 0xE100000A;
D_800A5E60 += 8;
dm->tag.len = 1;
ADDPRIM_80188C04(ot, dm);
/* Zero-byte live-range stretch: puts vtx's allocno priority inside
* the only admissible window. Placement is load-bearing. */
__asm__ __volatile__("" ::"r"(vtx));
}
}
}
INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_80188C04);
void func_80189124(void) {
}
+75 -1
View File
@@ -3857,7 +3857,81 @@ void func_8017C880(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8017AE2C", func_8017C95C);
/* func_8017C95C -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017C95C;
void func_8017C95C(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017C95C D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017C95C m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -4140,7 +4140,81 @@ void func_8017E79C(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8017C294", func_8017E878);
/* func_8017E878 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017E878;
void func_8017E878(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017E878 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017E878 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+258 -1
View File
@@ -3420,7 +3420,264 @@ void func_8017E170(void *a0) {
INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8017BEBC", func_8017E270);
INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8017BEBC", func_8017E2EC);
/* func_8017E2EC — ov_SC03_114 (296 ins, match_one MATCH).
*
* Billboard sprite: RTPS the entity origin through the global matrix D_800AF648,
* cull on the GTE flag + OT index range, build a Z-rotated 2D basis with
* RotMatrixZ, RTPS the +0x20 corner offset, emit TWO POLY_F4 packets out of the
* D_800A5E60 bump allocator, addPrim() both into the OT slot, and (when
* flags & 0x40000000) append a third 8-byte DR_MODE (0xE1......) packet.
*
* LEVERS (each byte-checked against asm/.../func_8017E2EC.s)
* §135-4 MATRIX init is written in NATURAL row order (m00,m01,m02,m10,m11,...).
* The `lhu 0x18($s1)` loads are register-based and therefore ordered
* against EVERY $sp store (sched.md §14), so the 2nd load's source
* position is what fixes the whole 16-insn window; the two `sh` stores
* it feeds then sink on their own. Writing m11 last (to mimic the asm's
* store order) pins the 2nd load past all the stores = 15 mismatches.
* §135-4 `D_800A5E60 = p2;` must be written BEFORE the last `addPrim` half —
* the two stores are disambiguated (/s + symbol vs register base), so
* SOURCE order decides, and it is what puts `sw $v0,0($a2)` in the
* `beqz $t2` delay slot instead of a stolen `addiu $v0,$a1,0x38`.
* §137/S2 THE TAG TEMPS. Each `getaddr` read (`lw 0x0($a1)` / `0x18($a1)` /
* `0x30($a1)`) is a single-set pseudo => sched1's BIRTHING BOOST sinks
* it to just before its `and`, costing the 4th filler slot in the
* vertex-store window (nop at idx 221, +1 insn). Binding them to ONE
* reused local kills the boost (REG_N_SETS>1) and the loads take their
* target positions — but a 2-death local is REFUSED by local-alloc
* (local-alloc.c:472 needs reg_n_deaths==1), so it becomes a GLOBAL
* allocno and loses the low register ($a0 instead of $v1, and the `and`
* can no longer coalesce destructively). The two `register` pins
* restore exactly the target's dispositions; both are load-bearing
* (pin-trim: drop $a0 => 34 mismatches, drop $v1 => 6, drop both => 24).
* S2 `pkt` must be SINGLE-SET: the 2nd `D_800A5E60` read goes to its own
* local `pkb`, which boosts `lw $a1,D_800A5E60` and wins the pri-1 tie
* against `lhu 0x66($sp)` at idx 124. That tie is INVARIANT under every
* statement permutation (8 probed) — the lever is the boost, not LUID.
* §135-1 `idx` is u32 (unsigned compare `sltiu`); the sign test is the
* explicit `(s32)idx < 0` that emits `bgez`.
* T-form `otp = (u32 *)((idx << 2) + ot)` — index FIRST, giving
* `addu $a2,$v0,$s4`; `ot + (idx << 2)` emits the operands reversed.
*
* DECLARATIONS: the TU already defines gte_ldv0/gte_rtps/gte_stsxy/gte_stflg/
* gte_stszotz at file scope (L2697-2806) — reproduced here VERBATIM so the
* redefinition is identical (C89 legal, no diagnostic). gte_SetRotMatrix,
* gte_SetTransMatrix, gte_stsz, RD16 and RW32 appear nowhere under src/.
* D_800B9A02 is spelled `short` exactly as the TU's file-scope L2468 and
* func_8017BEBC's L2822 do; D_800AF648, D_800A5E60, D_800A6610 and RotMatrixZ
* have no file-scope decl in this TU (engine_core.h carries D_800AF648 /
* D_800B9A02 only inside DEFINE_func macro BODIES, i.e. block scope), so each is
* block-scoped here to keep the blast radius on the rest of the TU at zero
* (§103/T51, the func_80185944 precedent).
*/
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_8017E2EC(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern short D_800B9A02;
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
+75 -1
View File
@@ -4291,7 +4291,81 @@ void func_8017E948(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8017AE2C", func_8017EA24);
/* func_8017EA24 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017EA24;
void func_8017EA24(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017EA24 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017EA24 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -4285,7 +4285,81 @@ void func_8017E948(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8017AE2C", func_8017EA24);
/* func_8017EA24 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017EA24;
void func_8017EA24(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017EA24 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017EA24 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -4245,7 +4245,81 @@ void func_8017CFE0(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8017AE2C", func_8017D0BC);
/* func_8017D0BC -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017D0BC;
void func_8017D0BC(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017D0BC D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017D0BC m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+224 -1
View File
@@ -6010,7 +6010,230 @@ void func_8018EEB0(void *a0) {
INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_8018EFB0);
INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_8018F02C);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_8018F02C(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
+224 -1
View File
@@ -3549,7 +3549,230 @@ void func_8017F72C(void *a0) {
INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8017BEBC", func_8017F82C);
INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8017BEBC", func_8017F8A8);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_8017F8A8(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
+75 -1
View File
@@ -4245,7 +4245,81 @@ void func_8017CFE0(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8017AE2C", func_8017D0BC);
/* func_8017D0BC -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017D0BC;
void func_8017D0BC(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017D0BC D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017D0BC m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -3834,7 +3834,81 @@ void func_8017DA24(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8017BEBC", func_8017DB00);
/* func_8017DB00 -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017DB00;
void func_8017DB00(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017DB00 D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017DB00 m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+75 -1
View File
@@ -4245,7 +4245,81 @@ void func_8017CFE0(s16 *a0) {
}
INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8017AE2C", func_8017D0BC);
/* func_8017D0BC -- ov_SC02_011 / ov_SC02_011_jr_8017AE2C [target: 133 ins]
*
* Structural twin of func_8017D0BC (ov_SC03_002/ov_SC03_002_jr_8017AE2C.c),
* banked [MATCH, 133 ins] this session -- same jr_8017AE2C shared layout,
* identical struct-offset chain (a0+0x6/0xA/0xE/0x10/0x12/0x16/0x18/0x1A) and
* identical call sequence (func_80133784 -> ratan2 x2 -> angle-wrap ->
* RotMatrixY -> ApplyMatrixSV -> func_8012CEB0). Reused verbatim per §136c
* sibling-first (declaration + expression forms are already byte-proven for
* this exact body).
*
* §136 L1/RC-5 note carried from the twin: `ang` (second ratan2 result) is a
* GLOBAL allocno spanning the +/-0x480 arms, while the `ang - base` compare
* temp is a LOCAL allocno in the same block; unpinned gcc hands the local
* temp $v0 and pushes `ang` to $v1 (REGALLOC-PERM). Pinning `ang` to $v0
* fixes the swap, and reusing the now-dead `ang` as the a0[0x6] scratch
* (instead of a fresh local) avoids stealing back the $v0 slot.
*/
typedef struct { s32 w[8]; } Mtx8_8017DE10_8017D0BC;
void func_8017D0BC(s32 a0) {
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern s32 ratan2(s32 a0, s32 a1);
extern s16 D_801152B0;
extern s16 D_801152B4;
extern s32 func_80133784(s32 a0, void *a1, s32 a2);
extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Mtx8_8017DE10_8017D0BC D_800AE620;
u8 in[8];
u8 out[8];
Mtx8_8017DE10_8017D0BC m;
s32 base;
register s32 ang __asm__("$2");
s16 arg;
*(s16 *)(in + 0) = *(u16 *)(a0 + 0x6) + *(u16 *)(a0 + 0x12);
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE) + *(u16 *)(a0 + 0x1A);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + 8;
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE);
if ((func_80133784(1, &in[0], (s32)&out[0]) & 0xC000) != 0) {
base = ratan2(D_801152B0, D_801152B4) & 0xFFF;
ang = ratan2(*(s32 *)(a0 + 0x10), *(s32 *)(a0 + 0x18)) & 0xFFF;
if ((s16)(ang - base) < 0) {
ang += 0x480;
} else {
ang -= 0x480;
}
arg = base - ang;
ang = *(u16 *)(a0 + 0x6);
*(s16 *)(in + 0) = ang;
*(s16 *)(in + 2) = *(u16 *)(a0 + 0xA);
*(s16 *)(in + 4) = *(u16 *)(a0 + 0xE);
m = D_800AE620;
RotMatrixY(arg, &m);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x12);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0x16);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0x1A);
ApplyMatrixSV(&m, &out[0], &out[0]);
*(s16 *)(out + 0) = *(u16 *)(a0 + 0x6) + ((s16)*(u16 *)(out + 0) >> 1);
*(s16 *)(out + 2) = *(u16 *)(a0 + 0xA) + ((s16)*(u16 *)(out + 2) >> 1);
*(s16 *)(out + 4) = *(u16 *)(a0 + 0xE) + ((s16)*(u16 *)(out + 4) >> 1);
if ((func_8012CEB0((s32)&in[0], (s32)&out[0], 0) & 0x2000) != 0) {
*(s16 *)(a0 + 0x6) = *(u16 *)(out + 0);
*(s16 *)(a0 + 0xA) = *(u16 *)(out + 2);
*(s16 *)(a0 + 0xE) = *(u16 *)(out + 4);
}
}
}
extern int func_80178970(void);
+228 -2
View File
@@ -4046,7 +4046,6 @@ typedef struct { u32 xx, yy, zz; u32 nprim; u32 *prim; } Part35C;
extern s32 func_800491EC(void);
extern void func_800547D8(s32, Mtx35C *);
extern void func_80052E38(Mtx35C *);
extern u8 D_800A6610[];
extern s16 D_800B9A02;
#define gte_ldv0(r0) __asm__ volatile ( \
@@ -4141,6 +4140,10 @@ extern s16 D_800B9A02;
void func_8017E35C(s32 arg0)
{
/* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every
LATER function in this TU, which blocks a byte-true decl of a different type.
Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */
extern u8 D_800A6610[];
/* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every
LATER function in this TU, which blocks a byte-true decl of a different type.
Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */
@@ -7322,7 +7325,230 @@ void func_801879B8(void *a0) {
INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8017AE2C", func_80187AB8);
INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8017AE2C", func_80187B34);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_80187B34(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
+224 -1
View File
@@ -3875,7 +3875,230 @@ void func_801814DC(void *a0) {
INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8017BEBC", func_801815DC);
INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8017BEBC", func_80181658);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_80181658(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
+239 -1
View File
@@ -3639,7 +3639,245 @@ s32 func_8017E5C8(void) {
}
INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8017BEBC", func_8017E5D0);
/* func_8017E5D0 — draws a 4-segment perspective-scaled "trail/shadow" fan of
* gouraud-shaded quads (POLY_G4-shaped, stride 0x24) behind an object.
*
* Derivation notes (no banked sibling existed — first crack of a 6-member family):
* - GTE matrix load + RotTransSV + RotTransPers pipeline matches the byte-proven
* gte_SetRotMatrix/gte_SetTransMatrix macros (ov_SC03_099_jr_8017BEBC.c) and the
* engine_core.h RotTransPers canonical form.
* - D_800A651C OT-table lookup uses the canonical engine_core.h idiom:
* `*(s32*)((s8*)&D_800A651C + ((u16)D_800B9A02 * 0x14))` (DEFINE_func_8012D4B4 et al).
* - The per-prim struct (0x24-byte stride) decodes as a libgpu POLY_G4: tag(4,
* AddPrim-owned except the `len` top byte we set), 4x{rgb+code/pad(4), x,y(4)}.
* All 14 fields matched a `base = s0 - 0x22` model with s0 anchored at the LAST
* field (y3) — negative-offset addressing off that anchor pointer.
* - D_8019E198/199/19A/19B, D_8019E178/179/17A/17B, D_8019E188/189/18A/18B are each
* individually-addressed consecutive byte tables (cookbook idiom: multi-symbol
* byte array, same class as ov_SC03_101's D_8019E170..D_8019E178 chain) — accessed
* via `*(u8*)((s32)&D_8019Exxx + i)`, NOT array indexing.
* - RotTransSV / func_8004914C / func_800491AC are ALREADY file-scope declared
* above the splice point in this TU (void* params) — reused verbatim, not redeclared.
*
* CLOSING RESIDUAL (S34, gcc-2.7.2-map/sched.md §S2 — "CREATE the boost"):
* The 262/265 draft emitted `lhu $a2,0x54(sp)` BEFORE the `lui/lhu %hi/%lo(D_800B9A02)`
* pair; the target has the pair first. All four insns tie at pri 1, so the pick was
* decided by adjust_priority's BIRTHING BOOST (sched.c:2507 / birthing_insn_p:2469):
* a SET(REG,..) whose dest has REG_N_SETS==1 is raised to max_priority and, because
* schedule_block runs BACKWARD, is PICKED EARLY == PLACED LATE. `sy` had TWO sets
* (`sy = L.sy0` then `sy = sy + sc`) so its load was never boosted and could not sink
* past the D_800B9A02 pair. Giving the accumulate its own single-set local (`sye`)
* makes `sy = L.sy0` a single-set def -> boosted -> the whole 4-load group lands in
* the target order. (Splitting `sx` the same way OVER-shoots: it re-groups the
* 0x36/0x40 store cluster — 9 mismatches. ONLY `sy` is split. Byte-verified: the
* three tested variants scored sx-only 9, both 5, sy-only 0.)
*/
extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3);
extern void *func_80010A08(s32 a0);
extern s32 GetTPage(s32 a0, s32 a1, s32 a2, s32 a3);
extern s32 func_8005A600(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4);
extern s32 AddPrim(s32 a0, void *a1);
extern u8 D_8019E164;
extern s32 D_8019E16C[];
extern u8 D_8019E178;
extern u8 D_8019E179;
extern u8 D_8019E17A;
extern u8 D_8019E17B;
extern u8 D_8019E188;
extern u8 D_8019E189;
extern u8 D_8019E18A;
extern u8 D_8019E18B;
extern u8 D_8019E198;
extern u8 D_8019E199;
extern u8 D_8019E19A;
extern u8 D_8019E19B;
extern s32 D_800A651C;
extern s32 D_80126950;
extern s16 D_800B9A02;
extern void func_8004914C(void *a0);
extern void func_800491AC(void *a0);
extern void RotTransSV(void *a0, void *a1, void *a2);
#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" )
/* §37/§124 SELF-axis: the TU declares `extern void func_8017E5D0(void);` (L3765) but the
byte-true definition takes a pointer. Define under a private C name bound to the real
symbol so both live in one TU — zero blast radius on every caller. */
extern void aF8017E5D0(void *a0) __asm__("func_8017E5D0");
void aF8017E5D0(void *a0)
{
extern u8 D_800AF648;
s32 primPtrs[4]; /* sp+0x18 */
s16 sv0[4]; /* sp+0x28 : RotTransSV out */
s16 sxArr[8]; /* sp+0x30 */
s16 syArr[8]; /* sp+0x40 */
struct {
s32 flag; /* sp+0x50 */
u16 sx0; /* sp+0x54 */
u16 sy0; /* sp+0x56 */
s32 p; /* sp+0x58 */
} L;
s32 m;
register s32 cnt __asm__("$8");
s32 sc;
s32 sx, sy;
s32 sye; /* single-set split of sy (see header note: §S2 birthing boost) */
s32 d;
register s32 ot __asm__("$9");
s32 otAddr;
void *buf;
s32 tpage;
u8 *prim;
register s8 *fp __asm__("$16");
s32 i;
m = *(s32 *)((s32)a0 + 0x20) + 0x34;
gte_SetRotMatrix(m);
gte_SetTransMatrix(m);
RotTransSV(&D_8019E164, sv0, &L.flag);
func_8004914C(&D_800AF648);
func_800491AC(&D_800AF648);
cnt = RotTransPers((s32)sv0, (s32)&L.sx0, &L.p, &L.flag);
if (cnt <= 0) {
return;
}
if (L.flag < 0) {
return;
}
cnt = cnt << 2;
sc = ((D_80126950 + 0x1F4) * 3) << 4;
sc = sc / cnt;
ot = *(s32 *)((s8 *)&D_800A651C + ((u16)D_800B9A02 * 0x14));
sx = L.sx0;
sy = L.sy0;
sxArr[2] = sx;
syArr[2] = sy;
otAddr = ot + cnt;
{
register s32 t __asm__("$2");
t = sx - sc;
sxArr[0] = t;
d = (sc * 179) >> 8;
t = sx - d;
sxArr[1] = t;
t = sx + d;
sxArr[3] = t;
sx = sx + sc;
t = sy - sc;
syArr[0] = t;
t = sy - d;
sxArr[4] = sx;
syArr[1] = t;
syArr[3] = sy + d;
sye = sy + sc;
}
syArr[4] = sye;
buf = func_80010A08(0x9C);
if (buf == 0) {
return;
}
tpage = GetTPage(0, 1, 0, 0);
func_8005A600((s32)buf, 0, 0, (u16)tpage, 0);
{
register s32 t0c __asm__("$2");
t0c = (s32)((u8 *)buf + 0xC);
prim = (u8 *)t0c;
}
primPtrs[1] = (s32)((u8 *)buf + 0x30);
primPtrs[2] = (s32)((u8 *)buf + 0x54);
primPtrs[0] = (s32)prim;
primPtrs[3] = (s32)((u8 *)buf + 0x78);
{
register s32 *table __asm__("$21");
register s8 *cbase __asm__("$18");
table = D_8019E16C;
cbase = (s8 *)primPtrs;
fp = (s8 *)prim + 0x22;
i = 0;
for (; i < 0x10; i += 4) {
*(s32 *)(fp - 0x1E) = table[*(u8 *)((s32)&D_8019E198 + i)];
*(s32 *)(fp - 0x16) = table[*(u8 *)((s32)&D_8019E199 + i)];
*(s32 *)(fp - 0xE) = table[*(u8 *)((s32)&D_8019E19A + i)];
{
s32 rgb3 = table[*(u8 *)((s32)&D_8019E19B + i)];
*(u8 *)(fp - 0x1F) = 8;
*(u8 *)(fp - 0x1B) = 0x3A;
*(s32 *)(fp - 0x6) = rgb3;
}
*(s16 *)(fp - 0x1A) = *(s16 *)(cbase + 0x18 + (*(u8 *)((s32)&D_8019E178 + i) << 1));
*(s16 *)(fp - 0x12) = *(s16 *)(cbase + 0x18 + (*(u8 *)((s32)&D_8019E179 + i) << 1));
*(s16 *)(fp - 0xA) = *(s16 *)(cbase + 0x18 + (*(u8 *)((s32)&D_8019E17A + i) << 1));
*(s16 *)(fp - 0x2) = *(s16 *)(cbase + 0x18 + (*(u8 *)((s32)&D_8019E17B + i) << 1));
*(s16 *)(fp - 0x18) = *(s16 *)(cbase + 0x28 + (*(u8 *)((s32)&D_8019E188 + i) << 1));
*(s16 *)(fp - 0x10) = *(s16 *)(cbase + 0x28 + (*(u8 *)((s32)&D_8019E189 + i) << 1));
*(s16 *)(fp - 0x8) = *(s16 *)(cbase + 0x28 + (*(u8 *)((s32)&D_8019E18A + i) << 1));
*(s16 *)(fp - 0x0) = *(s16 *)(cbase + 0x28 + (*(u8 *)((s32)&D_8019E18B + i) << 1));
AddPrim(otAddr, prim);
prim += 0x24;
fp += 0x24;
}
}
AddPrim(otAddr, buf);
}
extern u16 D_80126B62;
extern u16 D_80126B66;
+224 -1
View File
@@ -7645,7 +7645,230 @@ INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8017C24C", func_8018CB8
INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8017C24C", func_8018CC88);
INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8017C24C", func_8018CD04);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_8018CD04(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing
// @stuck: none — MATCH (99 ins). short* for param_2/param_3: gcc emits lh where sign is live (<<1 for signed div), lhu where truncated to short (arith result / direct copy)
+224 -1
View File
@@ -5800,7 +5800,230 @@ void func_80187D60(void *a0) {
INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8017C24C", func_80187E60);
INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8017C24C", func_80187EDC);
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#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" )
#define gte_ldv0(r0) __asm__ volatile ( \
"lwc2 $0, 0( %0 );" \
"lwc2 $1, 4( %0 )" \
: \
: "r"( r0 ) )
#define gte_rtps() __asm__ volatile ("nop;nop;rtps")
#define gte_stsxy(r0) __asm__ volatile ( \
"swc2 $14, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stsz(r0) __asm__ volatile ( \
"swc2 $19, 0( %0 )" \
: \
: "r"( r0 ) \
: "memory" )
#define gte_stszotz(r0) __asm__ volatile ( \
"mfc2 $12, $19;" \
"nop;" \
"sra $12, $12, 2;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define gte_stflg(r0) __asm__ volatile ( \
"cfc2 $12, $31;" \
"nop;" \
"sw $12, 0( %0 )" \
: \
: "r"( r0 ) \
: "$12", "memory" )
#define RD16(p) (((struct { u16 v; } *)(p))->v)
#define RW32(p) (((struct { u32 v; } *)(p))->v)
void func_80187EDC(void *a0)
{
extern u8 D_800AF648;
extern u8 *D_800A5E60;
extern u8 D_800A6610[];
extern void RotMatrixZ(s32 a0, void *a1);
u8 stk[0x60]; /* sp+0x10 .. sp+0x6F */
u32 flags;
u32 idx;
u32 ot;
u32 t2;
u8 *pkt;
u8 *p1;
u8 *p2;
u8 *pkb;
s32 d;
u32 *otp;
register u32 tv __asm__("$3"); /* §137 pin — see header */
register u32 tv2 __asm__("$4"); /* §137 pin — see header */
u8 *rotm;
flags = *(u32 *)((s32)a0 + 4);
rotm = &D_800AF648;
gte_SetRotMatrix(rotm);
gte_SetTransMatrix(rotm);
gte_ldv0((s32)a0 + 8);
gte_rtps();
gte_stsxy(stk);
gte_stflg(stk + 0x48);
gte_stsz(stk + 0x4c);
gte_stszotz(stk + 0x50);
if ((*(u32 *)(stk + 0x48) & 0xFFFFEFFF) == 0) {
idx = *(s32 *)(stk + 0x50) + 1;
ot = (u32)&D_800A6610[(*(u16 *)&D_800B9A02) << 14];
{
u16 flags2 = *(u16 *)((s32)a0 + 0x2c);
if ((flags2 & 0xC000) != 0) {
if ((flags2 & 0xC000) == 0xC000) {
idx = idx - (flags2 & 0xFFF);
if ((s32)idx < 0) idx = 0;
} else {
idx = idx + (flags2 & 0xFFF);
}
}
}
if (idx < 0x1000) {
d = (s32)&stk[0x08];
*(u16 *)(stk + 0x08) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x0a) = 0;
*(u16 *)(stk + 0x0c) = 0;
*(u16 *)(stk + 0x0e) = 0;
*(u16 *)(stk + 0x10) = *(u16 *)((s32)a0 + 0x18);
*(u16 *)(stk + 0x12) = 0;
*(u16 *)(stk + 0x14) = 0;
*(u16 *)(stk + 0x16) = 0;
*(u16 *)(stk + 0x18) = 0x1000;
*(u32 *)(stk + 0x24) = 0;
*(u32 *)(stk + 0x20) = 0;
*(u32 *)(stk + 0x1c) = 0;
RotMatrixZ(*(s16 *)((s32)a0 + 0x14), (void *)d);
gte_SetRotMatrix((void *)d);
gte_SetTransMatrix((void *)d);
*(u16 *)(stk + 0x28) = 0x20;
*(u16 *)(stk + 0x2a) = 0;
*(s16 *)(stk + 0x2c) = (s16)*(u32 *)(stk + 0x4c);
gte_ldv0(stk + 0x28);
gte_rtps();
gte_stsxy(stk + 0x54);
d = (u16)((s16)(RD16(stk + 0x54)) >> 3);
d |= (s32)((s16)(RD16(stk + 0x56)) >> 3) << 16;
pkt = D_800A5E60;
p1 = pkt + 0x18;
*(u8 *)(pkt + 0x3) = 5;
*(u8 *)(pkt + 0x7) = 0x28;
*(u8 *)(p1 + 0x3) = 5;
t2 = flags & 0x40000000;
*(u8 *)(p1 + 0x7) = 0x28;
if (t2 != 0) {
*(u8 *)(pkt + 0x7) = *(u8 *)(pkt + 0x7) | 2;
*(u8 *)(p1 + 0x7) = *(u8 *)(p1 + 0x7) | 2;
}
*(u8 *)(pkt + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(pkt + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(pkt + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(u8 *)(p1 + 0x4) = *(u8 *)((s32)a0 + 0x24);
*(u8 *)(p1 + 0x5) = *(u8 *)((s32)a0 + 0x25);
*(u8 *)(p1 + 0x6) = *(u8 *)((s32)a0 + 0x26);
*(s16 *)(pkt + 0x8) = RD16(stk) + RD16(stk + 0x54);
*(s16 *)(pkt + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x56);
*(s16 *)(pkt + 0xc) = RD16(stk) - (d >> 16);
*(s16 *)(pkt + 0xe) = RD16(stk + 0x02) + d;
*(s16 *)(pkt + 0x10) = RD16(stk) + (d >> 16);
*(s16 *)(pkt + 0x12) = RD16(stk + 0x02) - d;
*(s16 *)(pkt + 0x14) = RD16(stk) - RD16(stk + 0x54);
*(s16 *)(pkt + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x56);
*(s16 *)(p1 + 0x8) = RD16(stk) - RD16(stk + 0x56);
*(s16 *)(p1 + 0xa) = RD16(stk + 0x02) + RD16(stk + 0x54);
*(s16 *)(p1 + 0xc) = RD16(stk) - d;
*(s16 *)(p1 + 0xe) = RD16(stk + 0x02) - (d >> 16);
*(s16 *)(p1 + 0x10) = RD16(stk) + d;
*(s16 *)(p1 + 0x12) = RD16(stk + 0x02) + (d >> 16);
*(s16 *)(p1 + 0x14) = RD16(stk) + RD16(stk + 0x56);
*(s16 *)(p1 + 0x16) = RD16(stk + 0x02) - RD16(stk + 0x54);
/* addPrim(otp, pkt); addPrim(otp, p1); */
otp = (u32 *)((idx << 2) + ot);
tv = RW32(pkt);
RW32(pkt) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)pkt & 0xFFFFFF);
tv = RW32(p1);
RW32(p1) = (tv & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
pkb = D_800A5E60;
p2 = pkb + 0x30;
D_800A5E60 = p2;
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p1 & 0xFFFFFF);
if (t2 != 0) {
D_800A5E60 = pkb + 0x38;
*(u8 *)(p2 + 3) = 1;
RW32(p2 + 4) = ((flags >> 23) & 0x60) | 0xE1000000;
tv2 = RW32(p2);
RW32(p2) = (tv2 & 0xFF000000) | (RW32(otp) & 0xFFFFFF);
RW32(otp) = (RW32(otp) & 0xFF000000) | ((u32)p2 & 0xFFFFFF);
}
}
}
}
// @class: loose-typing