From 53433df1b320f751b6accbd339787eb08d95c4b7 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:30:43 -0600 Subject: [PATCH] feat(phase-29): func_8013D53C 14/137 + NSD hardened (rewrite-to-canonical, (void) fix) + Cmd lift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - func_8013D53C: NSD (self-decl caller-thread) + a byte-neutral Cmd_8013D53C type-lift clear the plumbing -> 14/137 h_seq members bank; 123 have genuine per-member codegen DIFFs (hard cse.c-wall crack -> permuter fuel). Reverted the 123 bankless byte-neutral NSD edits (churn on matched code, §57a NB). - NSD hardened, 2 bug-fixes validated on D53C: REWRITE the divergent decl to canonical instead of DROPPING it (drop broke def-after-caller forward visibility -> 'func undeclared'); and '(void)' is a genuine 0-param conflict, not skippable like a true no-proto '()' (the bug that filed D53C's arity class as 'not this pass'). - earlier this session: broad --fix-def-sig sweep = HONEST +137 only (staging != banking, R14/R35); NSD is SURGICAL-ONLY (broad application poisons whole groups; --fix-def-sig is broad-safe). cookbook §57a. - R22 clean-fleet 140/140 byte-identical; tools-health OK (dedup 1846/0, C1 234205/234205); 0 NON_MATCHING (G4). fleet 75.2% instr / 60.6% distinct / 87.04% fn-count. session-total from 74.6: +0.6pp instr, ~+421 members. --- docs/matching-cookbook.md | 40 +++ docs/progress.fleet.md | 284 +++++++++++----------- phase-ends/CURRENT_PHASE.md | 23 ++ src/ov_SC01_077/ov_SC01_077.c | 13 +- src/ov_SC03_001/ov_SC03_001_jr_801380E0.c | 137 ++++++++++- src/ov_SC03_002/ov_SC03_002_jr_801380E0.c | 137 ++++++++++- src/ov_SC03_105/ov_SC03_105_jr_801380E0.c | 137 ++++++++++- src/ov_SC03_124/ov_SC03_124_jr_801380E0.c | 137 ++++++++++- src/ov_SC03_125/ov_SC03_125_jr_801380E0.c | 137 ++++++++++- src/ov_SC04_015/ov_SC04_015_jr_801380E0.c | 137 ++++++++++- src/ov_SC04_018/ov_SC04_018_jr_801380E0.c | 137 ++++++++++- src/ov_SC04_019/ov_SC04_019_jr_801380E0.c | 137 ++++++++++- src/ov_SC04_020/ov_SC04_020_jr_801380E0.c | 137 ++++++++++- src/ov_SC05_017/ov_SC05_017_jr_801380E0.c | 137 ++++++++++- src/ov_SC05_018/ov_SC05_018_jr_801380E0.c | 137 ++++++++++- src/ov_SC06_011/ov_SC06_011_jr_801380E0.c | 137 ++++++++++- src/ov_SC07_000/ov_SC07_000_jr_801380E0.c | 137 ++++++++++- src/ov_SC07_007/ov_SC07_007_jr_80131340.c | 137 ++++++++++- src/shared/engine_types.h | 11 + tools/normalize_self_decls.py | 36 ++- 20 files changed, 2120 insertions(+), 205 deletions(-) diff --git a/docs/matching-cookbook.md b/docs/matching-cookbook.md index 427376418..698c6b35d 100644 --- a/docs/matching-cookbook.md +++ b/docs/matching-cookbook.md @@ -4278,3 +4278,43 @@ ACTUAL blocker (splice one member, read cc1) before stacking plumbing flags (R35 **Not every type-lifted family needs this:** `func_8016CBC0` (also 137-member, also blocked) has NO divergent self-decl (survey the members: `grep 'func_X(' the-member-TUs`) — its blocker is a local-typedef lift (§ type-lift, like func_8012956C), a different lever. Route by the real cc1 error, not by "it's a stuck 137-family." + +### §57a — Two NSD corrections + the SURGICAL-ONLY law + the honest broad-sweep yield (Phase 29, 2026-07-18) + +Three findings from applying §57 at scale, all byte-grounded: + +**(1) REWRITE the divergent decl to canonical — do NOT drop it (the def-after-caller trap).** The first §57 +build DROPPED the divergent decl. That is byte-neutral only when F's def sits ABOVE the caller in the TU (so the +def itself provides the caller's forward visibility — `func_801670E4`, def-before-caller). `func_8013D53C` is +def-AFTER-caller: a FILE-scope `void f(void)` forward decl, F's def spliced BELOW it — drop the decl and the +caller gets `func_8013D53C undeclared`. The fix is exactly what `cast_call_sites` does: **rewrite** the decl to +the def's canonical sig (matches the def → no conflict, AND keeps forward visibility), then cast the calls to the +decl's ORIGINAL sig (byte-exact). Works both ways (a canonical forward decl above/below the def is compatible). + +**(2) `(void)` is NOT no-proto — do not skip it.** The first build skipped `params in ('', 'void')`. But `void +f(void)` is a 0-param PROTOTYPE that genuinely conflicts with a >0-param def (`cdecl.compatible(void f(void*), +void f(void)) == False`), while a true no-proto `void f()` is compatible in either order (§51g). Skip ONLY the +literal empty `()` (also the §32 no-proto-mis-cast guard); let `cdecl.compatible` judge `(void)`. This was why the +BUILD SPEC filed D53C's `(void)`/(T) arity class as "not this pass" — it was a tool gap, now closed. + +**(3) NSD is SURGICAL-ONLY; `--fix-def-sig` is broad-safe — the blast-radius asymmetry.** `--normalize-self-decls` +edits the **TU file** (F's callers live in F's own TU), so a non-neutral edit poisons the ENTIRE `(overlay,split)` +group — and unlike a bad DRAFT (which `harvest_verify` bisects away per-member), a bad TU edit can't be isolated; +the whole group's build MISMATCHes and the backstop reverts all of it. A broad `--band substantial +--normalize-self-decls` (esp. combined with `--fix-def-sig`, whose canonical-rewrite changes NSD's reference sig) +banked **7** with ~752 groups backstop-reverted. `--fix-def-sig` edits DRAFTS (bisect-safe per member), so it IS +broad-safe. **Law: apply NSD per-family (`--only`, on a surveyed self-decl blocker); apply `--fix-def-sig` broadly.** +The backstop makes broad NSD SAFE (0 false banks) but useless. + +**(4) The honest broad-sweep yield (R14/R35): staging ≠ banking.** The 60 substantial matched-ov077 families with +2,163 stubbed members STAGE 2,169 drafts, but a broad `--fix-def-sig` sweep banks only **137** (one def-sig family + +stragglers) — 2,032 fail. The substantial-family frontier is NOT broadly mechanical; each family carries its own +blocker (self-decl / type-lift / def-sig+caller / genuine codegen). **Gate-probe a SAMPLE before scaling a yield +estimate off the STAGED count** — the phase's own invariant, which I violated by projecting ~1,500 from 2,169 staged. +`func_8013D53C` is the archetype: NSD + a `Cmd_8013D53C` type-lift clear its plumbing (it now COMPILES), and the +sweep banks **14/137** — the h_seq members whose bodies happen to match the exemplar — while **123** carry a genuine +per-member codegen DIFF (the hard cse.c-wall crack does not fully template). So it is a PARTLY-mechanical family: +the plumbing levers harvest the easy fraction ×0 tokens, the residual 123 are permuter/Fable fuel. **NB the NSD +edits are byte-neutral even where the member does NOT bank (the caller's canonical decl + cast matches with F still +a stub), so they persist on all 137 TUs — revert the ones that didn't bank (still carry the stub) so you commit +banks, not churn on matched code.** The classifier's `PLUMBING` count is a §56 memcpy red-herring; read full cc1 stderr. diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index 04ca76df8..04db10ea3 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -4,156 +4,156 @@ # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. # THREE progress metrics (all matter — see the labels): -FLEET fn-count byte-ident: 307733 / 353722 = 87.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) -FLEET instr-weighted : 9826239 / 13081451 = 75.1% (shipped .text across resident+138 overlays; the decomp.dev-DISPLAY number) -FLEET distinct-code(uniq): 3375766 / 5574674 = 60.6% (61329/87459 unique fns; the DISTINCT-RE number) +FLEET fn-count byte-ident: 307884 / 353722 = 87.04% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 9842328 / 13081451 = 75.2% (shipped .text across resident+138 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 3379153 / 5574674 = 60.6% (61345/87459 unique fns; the DISTINCT-RE number) MAIN game-code weighted : 436 / 60201 = 0.7% (Phase-27 T10; SEPARATE — LINKED-excluding Ghidra sig dated 2026-06-14, PROVISIONAL until a fresh/complete main sig; NOT folded into the fleet number) -FLEET REAL substantive : 305878 (of which dedup-shared 234161 via 1846 groups / 234205 instances) +FLEET REAL substantive : 306029 (of which dedup-shared 234161 via 1846 groups / 234205 instances) FLEET LINKED PsyQ objs : 959 FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 45982 +FLEET INCLUDE_ASM stubs : 45831 FLEET matchable : 353722 | 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 | 2190 | 1704 | 0 | 2190 | 2403 | 91.1% | -| ov_SC01_001 | 2195 | 1704 | 0 | 2197 | 2466 | 89.1% | -| ov_SC01_004 | 2188 | 1695 | 0 | 2189 | 2414 | 90.7% | -| ov_SC01_005 | 2217 | 1717 | 0 | 2217 | 2503 | 88.6% | -| ov_SC01_006 | 2217 | 1717 | 0 | 2217 | 2503 | 88.6% | -| ov_SC01_008 | 2188 | 1695 | 0 | 2190 | 2426 | 90.3% | -| ov_SC01_009 | 2213 | 1696 | 0 | 2214 | 2507 | 88.3% | -| ov_SC01_074 | 2191 | 1696 | 0 | 2193 | 2425 | 90.4% | +| ov_SC01_000 | 2191 | 1704 | 0 | 2191 | 2403 | 91.2% | +| ov_SC01_001 | 2196 | 1704 | 0 | 2198 | 2466 | 89.1% | +| ov_SC01_004 | 2189 | 1695 | 0 | 2190 | 2414 | 90.7% | +| ov_SC01_005 | 2218 | 1717 | 0 | 2218 | 2503 | 88.6% | +| ov_SC01_006 | 2218 | 1717 | 0 | 2218 | 2503 | 88.6% | +| ov_SC01_008 | 2189 | 1695 | 0 | 2191 | 2426 | 90.3% | +| ov_SC01_009 | 2214 | 1696 | 0 | 2215 | 2507 | 88.4% | +| ov_SC01_074 | 2192 | 1696 | 0 | 2194 | 2425 | 90.5% | | ov_SC01_077 | 2384 | 1664 | 0 | 2386 | 2585 | 92.3% | -| ov_SC01_080 | 2229 | 1699 | 0 | 2229 | 2512 | 88.7% | -| ov_SC01_084 | 2237 | 1699 | 0 | 2242 | 2579 | 86.9% | -| ov_SC02_000 | 2288 | 1734 | 0 | 2288 | 2683 | 85.3% | -| ov_SC02_003 | 2288 | 1734 | 0 | 2288 | 2683 | 85.3% | -| ov_SC02_004 | 2196 | 1699 | 0 | 2196 | 2401 | 91.5% | -| ov_SC02_005 | 2303 | 1695 | 0 | 2313 | 2927 | 79.0% | -| ov_SC02_011 | 2312 | 1702 | 0 | 2323 | 2893 | 80.3% | -| ov_SC02_015 | 2197 | 1701 | 0 | 2197 | 2414 | 91.0% | -| ov_SC02_016 | 2227 | 1701 | 0 | 2230 | 2545 | 87.6% | -| ov_SC02_017 | 2273 | 1701 | 0 | 2281 | 2732 | 83.5% | -| ov_SC02_021 | 2203 | 1701 | 0 | 2203 | 2437 | 90.4% | -| ov_SC02_026 | 2218 | 1699 | 0 | 2224 | 2572 | 86.5% | -| ov_SC02_027 | 2241 | 1699 | 0 | 2250 | 2692 | 83.6% | -| ov_SC02_028 | 2242 | 1699 | 0 | 2252 | 2701 | 83.4% | -| ov_SC02_031 | 2228 | 1700 | 0 | 2233 | 2562 | 87.2% | -| ov_SC02_035 | 2204 | 1699 | 0 | 2207 | 2520 | 87.6% | -| ov_SC02_039 | 2189 | 1699 | 0 | 2189 | 2416 | 90.6% | -| ov_SC02_041 | 2224 | 1699 | 0 | 2227 | 2561 | 87.0% | -| ov_SC03_001 | 2323 | 1700 | 0 | 2340 | 2869 | 81.6% | -| ov_SC03_002 | 2250 | 1704 | 0 | 2265 | 2631 | 86.1% | -| ov_SC03_003 | 2199 | 1699 | 0 | 2200 | 2423 | 90.8% | -| ov_SC03_006 | 2262 | 1705 | 0 | 2271 | 2767 | 82.1% | -| ov_SC03_007 | 2243 | 1699 | 0 | 2247 | 2623 | 85.7% | -| ov_SC03_010 | 2205 | 1699 | 0 | 2205 | 2470 | 89.3% | -| ov_SC03_011 | 2213 | 1699 | 0 | 2219 | 2527 | 87.8% | -| ov_SC03_012 | 2191 | 1699 | 0 | 2192 | 2406 | 91.1% | -| ov_SC03_013 | 2210 | 1699 | 0 | 2210 | 2492 | 88.7% | -| ov_SC03_014 | 2268 | 1724 | 0 | 2268 | 2685 | 84.5% | -| ov_SC03_015 | 2269 | 1724 | 0 | 2269 | 2685 | 84.5% | -| ov_SC03_023 | 2197 | 1699 | 0 | 2198 | 2435 | 90.3% | -| ov_SC03_024 | 2255 | 1704 | 0 | 2262 | 2641 | 85.6% | -| ov_SC03_028 | 2237 | 1699 | 0 | 2241 | 2664 | 84.1% | -| ov_SC03_029 | 2239 | 1701 | 0 | 2249 | 2644 | 85.1% | -| ov_SC03_030 | 2211 | 1704 | 0 | 2213 | 2495 | 88.7% | -| ov_SC03_031 | 2209 | 1699 | 0 | 2212 | 2514 | 88.0% | -| ov_SC03_089 | 2223 | 1699 | 0 | 2230 | 2581 | 86.4% | -| ov_SC03_090 | 2225 | 1699 | 0 | 2233 | 2625 | 85.1% | -| ov_SC03_091 | 2228 | 1699 | 0 | 2236 | 2640 | 84.7% | -| ov_SC03_092 | 2239 | 1699 | 0 | 2251 | 2587 | 87.0% | -| ov_SC03_093 | 2215 | 1699 | 0 | 2219 | 2563 | 86.6% | -| ov_SC03_094 | 2210 | 1699 | 0 | 2216 | 2577 | 86.0% | -| ov_SC03_095 | 2200 | 1699 | 0 | 2203 | 2474 | 89.0% | -| ov_SC03_096 | 2200 | 1699 | 0 | 2203 | 2465 | 89.4% | -| ov_SC03_097 | 2229 | 1699 | 0 | 2236 | 2603 | 85.9% | -| ov_SC03_098 | 2208 | 1699 | 0 | 2211 | 2541 | 87.0% | -| ov_SC03_099 | 2201 | 1699 | 0 | 2204 | 2504 | 88.0% | -| ov_SC03_100 | 2211 | 1699 | 0 | 2215 | 2539 | 87.2% | -| ov_SC03_101 | 2211 | 1699 | 0 | 2215 | 2528 | 87.6% | -| ov_SC03_102 | 2203 | 1699 | 0 | 2206 | 2492 | 88.5% | -| ov_SC03_103 | 2206 | 1701 | 0 | 2209 | 2510 | 88.0% | -| ov_SC03_104 | 2231 | 1699 | 0 | 2238 | 2616 | 85.6% | -| ov_SC03_105 | 2224 | 1699 | 0 | 2231 | 2597 | 85.9% | -| ov_SC03_108 | 2193 | 1699 | 0 | 2193 | 2443 | 89.8% | -| ov_SC03_109 | 2194 | 1699 | 0 | 2196 | 2424 | 90.6% | -| ov_SC03_110 | 2199 | 1699 | 0 | 2199 | 2468 | 89.1% | -| ov_SC03_111 | 2211 | 1699 | 0 | 2214 | 2510 | 88.2% | -| ov_SC03_112 | 2204 | 1701 | 0 | 2206 | 2526 | 87.3% | -| ov_SC03_113 | 2197 | 1701 | 0 | 2200 | 2468 | 89.1% | -| ov_SC03_114 | 2187 | 1699 | 0 | 2189 | 2415 | 90.6% | -| ov_SC03_115 | 2204 | 1699 | 0 | 2206 | 2472 | 89.2% | -| ov_SC03_116 | 2194 | 1699 | 0 | 2197 | 2438 | 90.1% | -| ov_SC03_117 | 2222 | 1699 | 0 | 2228 | 2557 | 87.1% | -| ov_SC03_118 | 2269 | 1723 | 0 | 2270 | 2685 | 84.5% | -| ov_SC03_119 | 2267 | 1723 | 0 | 2268 | 2685 | 84.5% | -| ov_SC03_121 | 2201 | 1699 | 0 | 2204 | 2459 | 89.6% | -| ov_SC03_124 | 2280 | 1695 | 0 | 2300 | 2741 | 83.9% | -| ov_SC03_125 | 2237 | 1699 | 0 | 2249 | 2588 | 86.9% | -| ov_SC03_126 | 2200 | 1701 | 0 | 2200 | 2423 | 90.8% | -| ov_SC04_000 | 2216 | 1703 | 0 | 2225 | 2546 | 87.4% | -| ov_SC04_002 | 2232 | 1699 | 0 | 2236 | 2636 | 84.8% | -| ov_SC04_003 | 2210 | 1699 | 0 | 2214 | 2502 | 88.5% | -| ov_SC04_004 | 2219 | 1699 | 0 | 2221 | 2558 | 86.8% | -| ov_SC04_005 | 2227 | 1699 | 0 | 2233 | 2612 | 85.5% | -| ov_SC04_006 | 2200 | 1699 | 0 | 2202 | 2454 | 89.7% | -| ov_SC04_007 | 2220 | 1699 | 0 | 2224 | 2569 | 86.6% | -| ov_SC04_008 | 2190 | 1699 | 0 | 2190 | 2415 | 90.7% | -| ov_SC04_009 | 2206 | 1699 | 0 | 2209 | 2441 | 90.5% | -| ov_SC04_010 | 2197 | 1699 | 0 | 2198 | 2419 | 90.9% | -| ov_SC04_011 | 2253 | 1699 | 0 | 2259 | 2803 | 80.6% | -| ov_SC04_012 | 2193 | 1699 | 0 | 2194 | 2420 | 90.7% | -| ov_SC04_015 | 2256 | 1700 | 0 | 2267 | 2611 | 86.8% | -| ov_SC04_016 | 2196 | 1699 | 0 | 2198 | 2440 | 90.1% | -| ov_SC04_018 | 2307 | 1734 | 0 | 2307 | 2857 | 80.7% | -| ov_SC04_019 | 2312 | 1734 | 0 | 2312 | 2857 | 80.9% | -| ov_SC04_020 | 2224 | 1699 | 0 | 2236 | 2567 | 87.1% | -| ov_SC04_021 | 2201 | 1701 | 0 | 2201 | 2423 | 90.8% | -| ov_SC05_000 | 2197 | 1703 | 0 | 2200 | 2422 | 90.8% | -| ov_SC05_001 | 2220 | 1699 | 0 | 2225 | 2574 | 86.4% | -| ov_SC05_002 | 2202 | 1699 | 0 | 2205 | 2442 | 90.3% | -| ov_SC05_003 | 2199 | 1699 | 0 | 2200 | 2481 | 88.7% | -| ov_SC05_004 | 2194 | 1699 | 0 | 2196 | 2464 | 89.1% | -| ov_SC05_005 | 2201 | 1699 | 0 | 2202 | 2491 | 88.4% | -| ov_SC05_006 | 2193 | 1699 | 0 | 2193 | 2430 | 90.2% | -| ov_SC05_007 | 2203 | 1699 | 0 | 2208 | 2482 | 89.0% | -| ov_SC05_008 | 2220 | 1699 | 0 | 2222 | 2543 | 87.4% | -| ov_SC05_009 | 2198 | 1699 | 0 | 2202 | 2438 | 90.3% | -| ov_SC05_010 | 2224 | 1699 | 0 | 2228 | 2588 | 86.1% | -| ov_SC05_011 | 2196 | 1699 | 0 | 2197 | 2409 | 91.2% | -| ov_SC05_017 | 2303 | 1696 | 0 | 2314 | 2842 | 81.4% | -| ov_SC05_018 | 2250 | 1699 | 0 | 2263 | 2673 | 84.7% | -| ov_SC05_019 | 2201 | 1701 | 0 | 2201 | 2423 | 90.8% | -| ov_SC06_000 | 2261 | 1708 | 0 | 2264 | 2691 | 84.1% | -| ov_SC06_006 | 2216 | 1699 | 0 | 2217 | 2511 | 88.3% | -| ov_SC06_008 | 2226 | 1701 | 0 | 2232 | 2542 | 87.8% | -| ov_SC06_010 | 2210 | 1699 | 0 | 2215 | 2517 | 88.0% | -| ov_SC06_011 | 2204 | 1699 | 0 | 2208 | 2468 | 89.5% | -| ov_SC06_013 | 2198 | 1699 | 0 | 2199 | 2425 | 90.7% | -| ov_SC06_014 | 2204 | 1699 | 0 | 2206 | 2453 | 89.9% | -| ov_SC06_015 | 2201 | 1699 | 0 | 2201 | 2421 | 90.9% | -| ov_SC06_016 | 2218 | 1699 | 0 | 2220 | 2549 | 87.1% | -| ov_SC06_018 | 2215 | 1702 | 0 | 2222 | 2665 | 83.4% | -| ov_SC06_020 | 2208 | 1701 | 0 | 2209 | 2518 | 87.7% | -| ov_SC06_022 | 2222 | 1699 | 0 | 2230 | 2642 | 84.4% | -| ov_SC06_024 | 2227 | 1699 | 0 | 2233 | 2667 | 83.7% | -| ov_SC06_025 | 2219 | 1699 | 0 | 2224 | 2572 | 86.5% | -| ov_SC06_027 | 2187 | 1699 | 0 | 2188 | 2408 | 90.9% | -| ov_SC06_029 | 2245 | 1699 | 0 | 2257 | 2662 | 84.8% | -| ov_SC06_030 | 2200 | 1699 | 0 | 2200 | 2456 | 89.6% | -| ov_SC06_032 | 2212 | 1700 | 0 | 2219 | 2658 | 83.5% | -| ov_SC06_033 | 2215 | 1700 | 0 | 2222 | 2631 | 84.5% | -| ov_SC07_000 | 2214 | 1703 | 0 | 2216 | 2521 | 87.9% | -| ov_SC07_001 | 2200 | 1699 | 0 | 2202 | 2454 | 89.7% | -| ov_SC07_002 | 2227 | 1699 | 0 | 2231 | 2579 | 86.5% | -| ov_SC07_006 | 1970 | 1547 | 0 | 2050 | 2456 | 83.5% | -| ov_SC07_007 | 1986 | 1548 | 0 | 2070 | 2614 | 79.2% | -| ov_SC07_008 | 2184 | 1699 | 0 | 2184 | 2386 | 91.5% | -| ov_SC07_009 | 2194 | 1699 | 0 | 2196 | 2430 | 90.4% | -| ov_SC07_010 | 2000 | 1548 | 0 | 2083 | 2526 | 82.5% | -| ov_SC07_011 | 1986 | 1547 | 0 | 2066 | 2450 | 84.3% | +| ov_SC01_080 | 2230 | 1699 | 0 | 2230 | 2512 | 88.8% | +| ov_SC01_084 | 2238 | 1699 | 0 | 2243 | 2579 | 87.0% | +| ov_SC02_000 | 2289 | 1734 | 0 | 2289 | 2683 | 85.3% | +| ov_SC02_003 | 2289 | 1734 | 0 | 2289 | 2683 | 85.3% | +| ov_SC02_004 | 2197 | 1699 | 0 | 2197 | 2401 | 91.5% | +| ov_SC02_005 | 2304 | 1695 | 0 | 2314 | 2927 | 79.1% | +| ov_SC02_011 | 2313 | 1702 | 0 | 2324 | 2893 | 80.3% | +| ov_SC02_015 | 2198 | 1701 | 0 | 2198 | 2414 | 91.1% | +| ov_SC02_016 | 2228 | 1701 | 0 | 2231 | 2545 | 87.7% | +| ov_SC02_017 | 2274 | 1701 | 0 | 2282 | 2732 | 83.5% | +| ov_SC02_021 | 2204 | 1701 | 0 | 2204 | 2437 | 90.4% | +| ov_SC02_026 | 2219 | 1699 | 0 | 2225 | 2572 | 86.5% | +| ov_SC02_027 | 2242 | 1699 | 0 | 2251 | 2692 | 83.6% | +| ov_SC02_028 | 2243 | 1699 | 0 | 2253 | 2701 | 83.4% | +| ov_SC02_031 | 2229 | 1700 | 0 | 2234 | 2562 | 87.2% | +| ov_SC02_035 | 2205 | 1699 | 0 | 2208 | 2520 | 87.6% | +| ov_SC02_039 | 2190 | 1699 | 0 | 2190 | 2416 | 90.6% | +| ov_SC02_041 | 2225 | 1699 | 0 | 2228 | 2561 | 87.0% | +| ov_SC03_001 | 2325 | 1700 | 0 | 2342 | 2869 | 81.6% | +| ov_SC03_002 | 2252 | 1704 | 0 | 2267 | 2631 | 86.2% | +| ov_SC03_003 | 2200 | 1699 | 0 | 2201 | 2423 | 90.8% | +| ov_SC03_006 | 2263 | 1705 | 0 | 2272 | 2767 | 82.1% | +| ov_SC03_007 | 2244 | 1699 | 0 | 2248 | 2623 | 85.7% | +| ov_SC03_010 | 2206 | 1699 | 0 | 2206 | 2470 | 89.3% | +| ov_SC03_011 | 2214 | 1699 | 0 | 2220 | 2527 | 87.9% | +| ov_SC03_012 | 2192 | 1699 | 0 | 2193 | 2406 | 91.1% | +| ov_SC03_013 | 2211 | 1699 | 0 | 2211 | 2492 | 88.7% | +| ov_SC03_014 | 2269 | 1724 | 0 | 2269 | 2685 | 84.5% | +| ov_SC03_015 | 2270 | 1724 | 0 | 2270 | 2685 | 84.5% | +| ov_SC03_023 | 2198 | 1699 | 0 | 2199 | 2435 | 90.3% | +| ov_SC03_024 | 2256 | 1704 | 0 | 2263 | 2641 | 85.7% | +| ov_SC03_028 | 2238 | 1699 | 0 | 2242 | 2664 | 84.2% | +| ov_SC03_029 | 2240 | 1701 | 0 | 2250 | 2644 | 85.1% | +| ov_SC03_030 | 2212 | 1704 | 0 | 2214 | 2495 | 88.7% | +| ov_SC03_031 | 2210 | 1699 | 0 | 2213 | 2514 | 88.0% | +| ov_SC03_089 | 2224 | 1699 | 0 | 2231 | 2581 | 86.4% | +| ov_SC03_090 | 2226 | 1699 | 0 | 2234 | 2625 | 85.1% | +| ov_SC03_091 | 2229 | 1699 | 0 | 2237 | 2640 | 84.7% | +| ov_SC03_092 | 2240 | 1699 | 0 | 2252 | 2587 | 87.1% | +| ov_SC03_093 | 2216 | 1699 | 0 | 2220 | 2563 | 86.6% | +| ov_SC03_094 | 2211 | 1699 | 0 | 2217 | 2577 | 86.0% | +| ov_SC03_095 | 2201 | 1699 | 0 | 2204 | 2474 | 89.1% | +| ov_SC03_096 | 2201 | 1699 | 0 | 2204 | 2465 | 89.4% | +| ov_SC03_097 | 2230 | 1699 | 0 | 2237 | 2603 | 85.9% | +| ov_SC03_098 | 2209 | 1699 | 0 | 2212 | 2541 | 87.1% | +| ov_SC03_099 | 2202 | 1699 | 0 | 2205 | 2504 | 88.1% | +| ov_SC03_100 | 2212 | 1699 | 0 | 2216 | 2539 | 87.3% | +| ov_SC03_101 | 2212 | 1699 | 0 | 2216 | 2528 | 87.7% | +| ov_SC03_102 | 2204 | 1699 | 0 | 2207 | 2492 | 88.6% | +| ov_SC03_103 | 2207 | 1701 | 0 | 2210 | 2510 | 88.0% | +| ov_SC03_104 | 2232 | 1699 | 0 | 2239 | 2616 | 85.6% | +| ov_SC03_105 | 2226 | 1699 | 0 | 2233 | 2597 | 86.0% | +| ov_SC03_108 | 2194 | 1699 | 0 | 2194 | 2443 | 89.8% | +| ov_SC03_109 | 2195 | 1699 | 0 | 2197 | 2424 | 90.6% | +| ov_SC03_110 | 2200 | 1699 | 0 | 2200 | 2468 | 89.1% | +| ov_SC03_111 | 2212 | 1699 | 0 | 2215 | 2510 | 88.2% | +| ov_SC03_112 | 2205 | 1701 | 0 | 2207 | 2526 | 87.4% | +| ov_SC03_113 | 2198 | 1701 | 0 | 2201 | 2468 | 89.2% | +| ov_SC03_114 | 2188 | 1699 | 0 | 2190 | 2415 | 90.7% | +| ov_SC03_115 | 2205 | 1699 | 0 | 2207 | 2472 | 89.3% | +| ov_SC03_116 | 2195 | 1699 | 0 | 2198 | 2438 | 90.2% | +| ov_SC03_117 | 2223 | 1699 | 0 | 2229 | 2557 | 87.2% | +| ov_SC03_118 | 2270 | 1723 | 0 | 2271 | 2685 | 84.6% | +| ov_SC03_119 | 2268 | 1723 | 0 | 2269 | 2685 | 84.5% | +| ov_SC03_121 | 2202 | 1699 | 0 | 2205 | 2459 | 89.7% | +| ov_SC03_124 | 2282 | 1695 | 0 | 2302 | 2741 | 84.0% | +| ov_SC03_125 | 2239 | 1699 | 0 | 2251 | 2588 | 87.0% | +| ov_SC03_126 | 2201 | 1701 | 0 | 2201 | 2423 | 90.8% | +| ov_SC04_000 | 2217 | 1703 | 0 | 2226 | 2546 | 87.4% | +| ov_SC04_002 | 2233 | 1699 | 0 | 2237 | 2636 | 84.9% | +| ov_SC04_003 | 2211 | 1699 | 0 | 2215 | 2502 | 88.5% | +| ov_SC04_004 | 2220 | 1699 | 0 | 2222 | 2558 | 86.9% | +| ov_SC04_005 | 2228 | 1699 | 0 | 2234 | 2612 | 85.5% | +| ov_SC04_006 | 2201 | 1699 | 0 | 2203 | 2454 | 89.8% | +| ov_SC04_007 | 2221 | 1699 | 0 | 2225 | 2569 | 86.6% | +| ov_SC04_008 | 2191 | 1699 | 0 | 2191 | 2415 | 90.7% | +| ov_SC04_009 | 2207 | 1699 | 0 | 2210 | 2441 | 90.5% | +| ov_SC04_010 | 2198 | 1699 | 0 | 2199 | 2419 | 90.9% | +| ov_SC04_011 | 2254 | 1699 | 0 | 2260 | 2803 | 80.6% | +| ov_SC04_012 | 2194 | 1699 | 0 | 2195 | 2420 | 90.7% | +| ov_SC04_015 | 2258 | 1700 | 0 | 2269 | 2611 | 86.9% | +| ov_SC04_016 | 2197 | 1699 | 0 | 2199 | 2440 | 90.1% | +| ov_SC04_018 | 2309 | 1734 | 0 | 2309 | 2857 | 80.8% | +| ov_SC04_019 | 2314 | 1734 | 0 | 2314 | 2857 | 81.0% | +| ov_SC04_020 | 2226 | 1699 | 0 | 2238 | 2567 | 87.2% | +| ov_SC04_021 | 2202 | 1701 | 0 | 2202 | 2423 | 90.9% | +| ov_SC05_000 | 2198 | 1703 | 0 | 2201 | 2422 | 90.9% | +| ov_SC05_001 | 2221 | 1699 | 0 | 2226 | 2574 | 86.5% | +| ov_SC05_002 | 2203 | 1699 | 0 | 2206 | 2442 | 90.3% | +| ov_SC05_003 | 2200 | 1699 | 0 | 2201 | 2481 | 88.7% | +| ov_SC05_004 | 2195 | 1699 | 0 | 2197 | 2464 | 89.2% | +| ov_SC05_005 | 2202 | 1699 | 0 | 2203 | 2491 | 88.4% | +| ov_SC05_006 | 2194 | 1699 | 0 | 2194 | 2430 | 90.3% | +| ov_SC05_007 | 2204 | 1699 | 0 | 2209 | 2482 | 89.0% | +| ov_SC05_008 | 2221 | 1699 | 0 | 2223 | 2543 | 87.4% | +| ov_SC05_009 | 2199 | 1699 | 0 | 2203 | 2438 | 90.4% | +| ov_SC05_010 | 2225 | 1699 | 0 | 2229 | 2588 | 86.1% | +| ov_SC05_011 | 2197 | 1699 | 0 | 2198 | 2409 | 91.2% | +| ov_SC05_017 | 2305 | 1696 | 0 | 2316 | 2842 | 81.5% | +| ov_SC05_018 | 2252 | 1699 | 0 | 2265 | 2673 | 84.7% | +| ov_SC05_019 | 2202 | 1701 | 0 | 2202 | 2423 | 90.9% | +| ov_SC06_000 | 2262 | 1708 | 0 | 2265 | 2691 | 84.2% | +| ov_SC06_006 | 2217 | 1699 | 0 | 2218 | 2511 | 88.3% | +| ov_SC06_008 | 2227 | 1701 | 0 | 2233 | 2542 | 87.8% | +| ov_SC06_010 | 2211 | 1699 | 0 | 2216 | 2517 | 88.0% | +| ov_SC06_011 | 2206 | 1699 | 0 | 2210 | 2468 | 89.5% | +| ov_SC06_013 | 2199 | 1699 | 0 | 2200 | 2425 | 90.7% | +| ov_SC06_014 | 2205 | 1699 | 0 | 2207 | 2453 | 90.0% | +| ov_SC06_015 | 2202 | 1699 | 0 | 2202 | 2421 | 91.0% | +| ov_SC06_016 | 2219 | 1699 | 0 | 2221 | 2549 | 87.1% | +| ov_SC06_018 | 2216 | 1702 | 0 | 2223 | 2665 | 83.4% | +| ov_SC06_020 | 2209 | 1701 | 0 | 2210 | 2518 | 87.8% | +| ov_SC06_022 | 2223 | 1699 | 0 | 2231 | 2642 | 84.4% | +| ov_SC06_024 | 2228 | 1699 | 0 | 2234 | 2667 | 83.8% | +| ov_SC06_025 | 2220 | 1699 | 0 | 2225 | 2572 | 86.5% | +| ov_SC06_027 | 2188 | 1699 | 0 | 2189 | 2408 | 90.9% | +| ov_SC06_029 | 2246 | 1699 | 0 | 2258 | 2662 | 84.8% | +| ov_SC06_030 | 2201 | 1699 | 0 | 2201 | 2456 | 89.6% | +| ov_SC06_032 | 2213 | 1700 | 0 | 2220 | 2658 | 83.5% | +| ov_SC06_033 | 2216 | 1700 | 0 | 2223 | 2631 | 84.5% | +| ov_SC07_000 | 2216 | 1703 | 0 | 2218 | 2521 | 88.0% | +| ov_SC07_001 | 2201 | 1699 | 0 | 2203 | 2454 | 89.8% | +| ov_SC07_002 | 2228 | 1699 | 0 | 2232 | 2579 | 86.5% | +| ov_SC07_006 | 1971 | 1547 | 0 | 2051 | 2456 | 83.5% | +| ov_SC07_007 | 1988 | 1548 | 0 | 2072 | 2614 | 79.3% | +| ov_SC07_008 | 2185 | 1699 | 0 | 2185 | 2386 | 91.6% | +| ov_SC07_009 | 2195 | 1699 | 0 | 2197 | 2430 | 90.4% | +| ov_SC07_010 | 2001 | 1548 | 0 | 2084 | 2526 | 82.5% | +| ov_SC07_011 | 1987 | 1547 | 0 | 2067 | 2450 | 84.4% | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index bad8d09f4..23a04d2a9 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -482,3 +482,26 @@ conditional) · main-EXE/B9 + GLM/B6 + resident's 14 walls (P30) · behemoths B7 > (the DISTINCT void*-def-sig + per-sibling caller-thread class — NOT the self-decl pass), the SC07 span-composition > tails (§8e-2), and the permuter/Fable close-1..N backlog (Task 6). The decl-normalize pass is now a standing > `family_sweep` stage for any future family whose members' own callers declare F divergently. + +- **✅ 2026-07-18 — BROAD SWEEP (honest yield +137) + func_8013D53C (14/137) + NSD HARDENED (2 bug-fixes).** + After the SESSION-3 checkpoint: ran the broad substantial-family sweep, then attacked func_8013D53C. All findings + → cookbook **§57a**. **(1) The substantial-family frontier is NOT broadly mechanical (R14/R35):** 60 families / + 2,169 stubbed members STAGE but only **137 bank** with --fix-def-sig — staging ≠ banking; I over-projected ~1,500 + from the staged count instead of gate-probing a sample (the phase's own invariant, violated). Banked func_801502EC + ×134 + func_80131B14 ×3 (commit `commit:0714`). **(2) NSD is SURGICAL-ONLY:** broad `--normalize-self-decls` (esp. + combined with `--fix-def-sig`, which changes NSD's reference sig) makes byte-neutral-but-wrong TU edits that poison + whole (overlay,split) groups — the backstop reverts them (0 false banks) but banked **7** / reverted **752**. + `--fix-def-sig` edits DRAFTS (bisect-safe per member) so it IS broad-safe. Law: NSD per-family, --fix-def-sig broad. + **(3) NSD HARDENED — 2 real bug-fixes (validated on D53C):** rewrite-to-canonical instead of DROP (dropping broke + def-AFTER-caller forward visibility → `func undeclared`); and `(void)` is a genuine 0-param conflict, NOT skippable + like a true no-proto `()` (the bug that filed D53C's arity class as "not this pass"). **(4) func_8013D53C = + PARTLY-mechanical:** NSD + a byte-neutral `Cmd_8013D53C` type-lift clear its plumbing → **14/137 bank** (the h_seq + members whose bodies template); **123** carry genuine per-member codegen DIFFs (the hard cse.c-wall crack does not + fully template → permuter/Fable fuel). Reverted the 123 bankless NSD edits (byte-neutral but churn on matched code + — §57a NB). R22 clean-fleet **140/140**; tools-health OK (dedup 1846/0, C1 234205/234205); 0 NON_MATCHING (G4). + Fleet **75.2% instr · 60.6% distinct · 87.04% fn-count**. **SESSION-TOTAL from 74.6/59.4/86.92: +0.6pp instr, + +1.2pp distinct, ~+421 members** across 4 commits (commit:0711, commit:0712, commit:0714, + this). + **REFRAME (the session's strategic finding):** the family campaign is **per-family cracking, not one broad sweep** — + each substantial family carries its own blocker (self-decl / type-lift / def-sig+caller / genuine codegen), and the + mechanical fraction is small (~137 broad + 14 D53C). Remaining Task-4/6 levers: the permuter backlog (551 close-1..4 + drafts, high-reach) + per-family type-lift/crack of the ~50 remaining substantial families + the tiny/mid bands. diff --git a/src/ov_SC01_077/ov_SC01_077.c b/src/ov_SC01_077/ov_SC01_077.c index dc226079f..5392ec514 100644 --- a/src/ov_SC01_077/ov_SC01_077.c +++ b/src/ov_SC01_077/ov_SC01_077.c @@ -493,15 +493,6 @@ void func_8013D3D4(int param_1, int param_2) typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ -typedef struct { - u16 cmd; /* 0x0 */ - u16 pad2; /* 0x2 */ - u16 pad4; /* 0x4 */ - u16 pad6; /* 0x6 */ - s16 w; /* 0x8 */ - s16 h; /* 0xA */ - u16 *data; /* 0xC */ -} Cmd; /* 0x10 */ extern s32 D_801D95A0; extern u8 D_80078EAF; @@ -530,7 +521,7 @@ extern s32 D_801D95A8; extern void *D_801D9578; void func_8013D53C(void *arg0v) { - Cmd *arg0 = arg0v; + Cmd_8013D53C *arg0 = arg0v; extern u8 D_80187488[]; extern u8 D_8018748C[]; @@ -583,7 +574,7 @@ void func_8013D53C(void *arg0v) { t8v = p[2]; } - (*(Cmd * *)&D_801D957C) = arg0; + (*(Cmd_8013D53C * *)&D_801D957C) = arg0; if (arg0 != 0) { if (D_801D95A8 != 0) { s32 *p = (s32 *)(D_801D9588 * 12 + (s32) (*(s32 * *)&D_801D9578)); diff --git a/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c b/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c index ff9828c38..4b07edff9 100644 --- a/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c +++ b/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c @@ -1933,7 +1933,7 @@ extern u8 D_8018DDA0[]; extern u8 D_8018DE20[]; extern u8 D_8018DCF8[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1954,7 +1954,7 @@ void func_8013D3D4(int param_1, int param_2) D_801ED434 = D_8018DE20; D_801ED438 = D_8018DCF8; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801ED468 != 0) { func_8013DD68(); @@ -1978,7 +1978,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801ED460; +extern s32 D_801ED448; + + +extern u8 D_801EF3F2; +extern u8 D_801EF466; +extern u8 D_801EF2F2; +extern u8 D_801EF3BC; +extern u8 D_801EF2C8; +extern u8 D_801EF2F1; + + +extern s32 D_801EF3C0; +extern s32 D_801ED45C; +extern s32 D_801ED458; +extern s32 D_801ED440; +extern s32 D_801ED44C; +extern s32 D_801ED450; + +extern void *D_801ED430; +extern s32 D_801ED468; +extern void *D_801ED438; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018DE3C[]; + extern Rec12 D_8018DE74[]; + extern u8 D_80078EAF; + extern u8 D_801EF398; + extern s32 D_801ED454; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018DE78[]; + extern u8 D_8018DE7C[]; + extern unsigned char D_801EF2E8; + extern s16 *D_801ED43C; + extern s32 D_801ED46C; + extern s32 D_801ED470; + extern s32 D_801ED474; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801ED460 & 1)) { + D_801ED448 = 1; + } else { + D_801ED448 = D_80078EAF; + } + + b0 = ((u8 *)D_8018DE74)[D_801ED448 * 12]; + D_801EF3F2 = b0; + D_801EF466 = b0; + b1 = D_8018DE78[D_801ED448 * 12]; + D_801EF2F2 = b1; + D_801EF3BC = b1; + b2 = D_8018DE7C[D_801ED448 * 12]; + D_801EF2C8 = b2; + D_801EF2F1 = b2; + + (*(S9 *)&D_801EF2E8) = ((S9 *)D_8018DE3C)[D_801ED448]; + (*(S9 *)&D_801EF398) = *(S9 *)(&D_801EF2C8 + 0x20); /* same addr as (*(S9 *)&D_801EF2E8); distinct sym defeats cse, keeps %hi/%lo */ + + D_801EF3C0 = 1; + D_801ED45C = -1; + D_801ED458 = 0; + D_801ED454 = -1; + D_801ED440 = 0; + D_801ED44C = 0; + D_801ED450 = 0; + + if ((D_801ED460 & 2) && (D_801ED448 == 4)) { + s0v = (*(s32 * *)&D_801ED430)[18]; + t9v = (*(s32 * *)&D_801ED430)[19]; + t8v = (*(s32 * *)&D_801ED430)[20]; + } else { + s32 *p = (s32 *)(D_801ED448 * 12 + (s32) (*(s32 * *)&D_801ED430)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801ED43C) = arg0; + if (arg0 != 0) { + if (D_801ED468 != 0) { + s32 *p = (s32 *)(D_801ED448 * 12 + (s32) (*(s32 * *)&D_801ED438)); + D_801ED46C = p[0]; + D_801ED470 = p[1]; + D_801ED474 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c b/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c index a6dc85bed..8193badb5 100644 --- a/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c +++ b/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c @@ -1933,7 +1933,7 @@ extern u8 D_80185D90[]; extern u8 D_80185E10[]; extern u8 D_80185CE8[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1954,7 +1954,7 @@ void func_8013D3D4(int param_1, int param_2) D_801CA4B4 = D_80185E10; D_801CA4B8 = D_80185CE8; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801CA4E8 != 0) { func_8013DD68(); @@ -1978,7 +1978,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801CA4E0; +extern s32 D_801CA4C8; + + +extern u8 D_801CBADA; +extern u8 D_801CBB4E; +extern u8 D_801CB9DA; +extern u8 D_801CBAA4; +extern u8 D_801CB9B0; +extern u8 D_801CB9D9; + + +extern s32 D_801CBAA8; +extern s32 D_801CA4DC; +extern s32 D_801CA4D8; +extern s32 D_801CA4C0; +extern s32 D_801CA4CC; +extern s32 D_801CA4D0; + +extern void *D_801CA4B0; +extern s32 D_801CA4E8; +extern void *D_801CA4B8; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80185E2C[]; + extern Rec12 D_80185E64[]; + extern u8 D_80078EAF; + extern u8 D_801CBA80; + extern s32 D_801CA4D4; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_80185E68[]; + extern u8 D_80185E6C[]; + extern unsigned char D_801CB9D0; + extern s16 *D_801CA4BC; + extern s32 D_801CA4EC; + extern s32 D_801CA4F0; + extern s32 D_801CA4F4; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801CA4E0 & 1)) { + D_801CA4C8 = 1; + } else { + D_801CA4C8 = D_80078EAF; + } + + b0 = ((u8 *)D_80185E64)[D_801CA4C8 * 12]; + D_801CBADA = b0; + D_801CBB4E = b0; + b1 = D_80185E68[D_801CA4C8 * 12]; + D_801CB9DA = b1; + D_801CBAA4 = b1; + b2 = D_80185E6C[D_801CA4C8 * 12]; + D_801CB9B0 = b2; + D_801CB9D9 = b2; + + (*(S9 *)&D_801CB9D0) = ((S9 *)D_80185E2C)[D_801CA4C8]; + (*(S9 *)&D_801CBA80) = *(S9 *)(&D_801CB9B0 + 0x20); /* same addr as (*(S9 *)&D_801CB9D0); distinct sym defeats cse, keeps %hi/%lo */ + + D_801CBAA8 = 1; + D_801CA4DC = -1; + D_801CA4D8 = 0; + D_801CA4D4 = -1; + D_801CA4C0 = 0; + D_801CA4CC = 0; + D_801CA4D0 = 0; + + if ((D_801CA4E0 & 2) && (D_801CA4C8 == 4)) { + s0v = (*(s32 * *)&D_801CA4B0)[18]; + t9v = (*(s32 * *)&D_801CA4B0)[19]; + t8v = (*(s32 * *)&D_801CA4B0)[20]; + } else { + s32 *p = (s32 *)(D_801CA4C8 * 12 + (s32) (*(s32 * *)&D_801CA4B0)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801CA4BC) = arg0; + if (arg0 != 0) { + if (D_801CA4E8 != 0) { + s32 *p = (s32 *)(D_801CA4C8 * 12 + (s32) (*(s32 * *)&D_801CA4B8)); + D_801CA4EC = p[0]; + D_801CA4F0 = p[1]; + D_801CA4F4 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c b/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c index 7ecd98dfb..a218af568 100644 --- a/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c +++ b/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_8018ABDC[]; extern u8 D_8018AC5C[]; extern u8 D_8018AB34[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801B83F4 = D_8018AC5C; D_801B83F8 = D_8018AB34; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801B8428 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801B8420; +extern s32 D_801B8408; + + +extern u8 D_801BCCAA; +extern u8 D_801BCD1E; +extern u8 D_801BCBD2; +extern u8 D_801BCC8C; +extern u8 D_801BCBA8; +extern u8 D_801BCBD1; + + +extern s32 D_801BCC90; +extern s32 D_801B841C; +extern s32 D_801B8418; +extern s32 D_801B8400; +extern s32 D_801B840C; +extern s32 D_801B8410; + +extern void *D_801B83F0; +extern s32 D_801B8428; +extern void *D_801B83F8; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018AC78[]; + extern Rec12 D_8018ACB0[]; + extern u8 D_80078EAF; + extern u8 D_801BCC68; + extern s32 D_801B8414; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018ACB4[]; + extern u8 D_8018ACB8[]; + extern unsigned char D_801BCBC8; + extern s16 *D_801B83FC; + extern s32 D_801B842C; + extern s32 D_801B8430; + extern s32 D_801B8434; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801B8420 & 1)) { + D_801B8408 = 1; + } else { + D_801B8408 = D_80078EAF; + } + + b0 = ((u8 *)D_8018ACB0)[D_801B8408 * 12]; + D_801BCCAA = b0; + D_801BCD1E = b0; + b1 = D_8018ACB4[D_801B8408 * 12]; + D_801BCBD2 = b1; + D_801BCC8C = b1; + b2 = D_8018ACB8[D_801B8408 * 12]; + D_801BCBA8 = b2; + D_801BCBD1 = b2; + + (*(S9 *)&D_801BCBC8) = ((S9 *)D_8018AC78)[D_801B8408]; + (*(S9 *)&D_801BCC68) = *(S9 *)(&D_801BCBA8 + 0x20); /* same addr as (*(S9 *)&D_801BCBC8); distinct sym defeats cse, keeps %hi/%lo */ + + D_801BCC90 = 1; + D_801B841C = -1; + D_801B8418 = 0; + D_801B8414 = -1; + D_801B8400 = 0; + D_801B840C = 0; + D_801B8410 = 0; + + if ((D_801B8420 & 2) && (D_801B8408 == 4)) { + s0v = (*(s32 * *)&D_801B83F0)[18]; + t9v = (*(s32 * *)&D_801B83F0)[19]; + t8v = (*(s32 * *)&D_801B83F0)[20]; + } else { + s32 *p = (s32 *)(D_801B8408 * 12 + (s32) (*(s32 * *)&D_801B83F0)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801B83FC) = arg0; + if (arg0 != 0) { + if (D_801B8428 != 0) { + s32 *p = (s32 *)(D_801B8408 * 12 + (s32) (*(s32 * *)&D_801B83F8)); + D_801B842C = p[0]; + D_801B8430 = p[1]; + D_801B8434 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c b/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c index f9385f4da..9c10a2683 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_8018B444[]; extern u8 D_8018B4C4[]; extern u8 D_8018B39C[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801E05AC = D_8018B4C4; D_801E05B0 = D_8018B39C; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801E05E0 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801E05D8; +extern s32 D_801E05C0; + + +extern u8 D_801E2572; +extern u8 D_801E25E6; +extern u8 D_801E2472; +extern u8 D_801E253C; +extern u8 D_801E2448; +extern u8 D_801E2471; + + +extern s32 D_801E2540; +extern s32 D_801E05D4; +extern s32 D_801E05D0; +extern s32 D_801E05B8; +extern s32 D_801E05C4; +extern s32 D_801E05C8; + +extern void *D_801E05A8; +extern s32 D_801E05E0; +extern void *D_801E05B0; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018B4E0[]; + extern Rec12 D_8018B518[]; + extern u8 D_80078EAF; + extern u8 D_801E2518; + extern s32 D_801E05CC; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018B51C[]; + extern u8 D_8018B520[]; + extern unsigned char D_801E2468; + extern s16 *D_801E05B4; + extern s32 D_801E05E4; + extern s32 D_801E05E8; + extern s32 D_801E05EC; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801E05D8 & 1)) { + D_801E05C0 = 1; + } else { + D_801E05C0 = D_80078EAF; + } + + b0 = ((u8 *)D_8018B518)[D_801E05C0 * 12]; + D_801E2572 = b0; + D_801E25E6 = b0; + b1 = D_8018B51C[D_801E05C0 * 12]; + D_801E2472 = b1; + D_801E253C = b1; + b2 = D_8018B520[D_801E05C0 * 12]; + D_801E2448 = b2; + D_801E2471 = b2; + + (*(S9 *)&D_801E2468) = ((S9 *)D_8018B4E0)[D_801E05C0]; + (*(S9 *)&D_801E2518) = *(S9 *)(&D_801E2448 + 0x20); /* same addr as (*(S9 *)&D_801E2468); distinct sym defeats cse, keeps %hi/%lo */ + + D_801E2540 = 1; + D_801E05D4 = -1; + D_801E05D0 = 0; + D_801E05CC = -1; + D_801E05B8 = 0; + D_801E05C4 = 0; + D_801E05C8 = 0; + + if ((D_801E05D8 & 2) && (D_801E05C0 == 4)) { + s0v = (*(s32 * *)&D_801E05A8)[18]; + t9v = (*(s32 * *)&D_801E05A8)[19]; + t8v = (*(s32 * *)&D_801E05A8)[20]; + } else { + s32 *p = (s32 *)(D_801E05C0 * 12 + (s32) (*(s32 * *)&D_801E05A8)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801E05B4) = arg0; + if (arg0 != 0) { + if (D_801E05E0 != 0) { + s32 *p = (s32 *)(D_801E05C0 * 12 + (s32) (*(s32 * *)&D_801E05B0)); + D_801E05E4 = p[0]; + D_801E05E8 = p[1]; + D_801E05EC = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c b/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c index d04b5f4ea..4ccba9c65 100644 --- a/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c +++ b/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_80184614[]; extern u8 D_80184694[]; extern u8 D_8018456C[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801C2EA4 = D_80184694; D_801C2EA8 = D_8018456C; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801C2ED8 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801C2ED0; +extern s32 D_801C2EB8; + + +extern u8 D_801C44CA; +extern u8 D_801C453E; +extern u8 D_801C43CA; +extern u8 D_801C4494; +extern u8 D_801C43A0; +extern u8 D_801C43C9; + + +extern s32 D_801C4498; +extern s32 D_801C2ECC; +extern s32 D_801C2EC8; +extern s32 D_801C2EB0; +extern s32 D_801C2EBC; +extern s32 D_801C2EC0; + +extern void *D_801C2EA0; +extern s32 D_801C2ED8; +extern void *D_801C2EA8; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_801846B0[]; + extern Rec12 D_801846E8[]; + extern u8 D_80078EAF; + extern u8 D_801C4470; + extern s32 D_801C2EC4; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_801846EC[]; + extern u8 D_801846F0[]; + extern unsigned char D_801C43C0; + extern s16 *D_801C2EAC; + extern s32 D_801C2EDC; + extern s32 D_801C2EE0; + extern s32 D_801C2EE4; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801C2ED0 & 1)) { + D_801C2EB8 = 1; + } else { + D_801C2EB8 = D_80078EAF; + } + + b0 = ((u8 *)D_801846E8)[D_801C2EB8 * 12]; + D_801C44CA = b0; + D_801C453E = b0; + b1 = D_801846EC[D_801C2EB8 * 12]; + D_801C43CA = b1; + D_801C4494 = b1; + b2 = D_801846F0[D_801C2EB8 * 12]; + D_801C43A0 = b2; + D_801C43C9 = b2; + + (*(S9 *)&D_801C43C0) = ((S9 *)D_801846B0)[D_801C2EB8]; + (*(S9 *)&D_801C4470) = *(S9 *)(&D_801C43A0 + 0x20); /* same addr as (*(S9 *)&D_801C43C0); distinct sym defeats cse, keeps %hi/%lo */ + + D_801C4498 = 1; + D_801C2ECC = -1; + D_801C2EC8 = 0; + D_801C2EC4 = -1; + D_801C2EB0 = 0; + D_801C2EBC = 0; + D_801C2EC0 = 0; + + if ((D_801C2ED0 & 2) && (D_801C2EB8 == 4)) { + s0v = (*(s32 * *)&D_801C2EA0)[18]; + t9v = (*(s32 * *)&D_801C2EA0)[19]; + t8v = (*(s32 * *)&D_801C2EA0)[20]; + } else { + s32 *p = (s32 *)(D_801C2EB8 * 12 + (s32) (*(s32 * *)&D_801C2EA0)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801C2EAC) = arg0; + if (arg0 != 0) { + if (D_801C2ED8 != 0) { + s32 *p = (s32 *)(D_801C2EB8 * 12 + (s32) (*(s32 * *)&D_801C2EA8)); + D_801C2EDC = p[0]; + D_801C2EE0 = p[1]; + D_801C2EE4 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c b/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c index 9cdfbf2e9..acf0d0695 100644 --- a/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c +++ b/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_80184DCC[]; extern u8 D_80184E4C[]; extern u8 D_80184D24[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801C770C = D_80184E4C; D_801C7710 = D_80184D24; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801C7740 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801C7738; +extern s32 D_801C7720; + + +extern u8 D_801C936A; +extern u8 D_801C93DE; +extern u8 D_801C926A; +extern u8 D_801C9334; +extern u8 D_801C9240; +extern u8 D_801C9269; + + +extern s32 D_801C9338; +extern s32 D_801C7734; +extern s32 D_801C7730; +extern s32 D_801C7718; +extern s32 D_801C7724; +extern s32 D_801C7728; + +extern void *D_801C7708; +extern s32 D_801C7740; +extern void *D_801C7710; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80184E68[]; + extern Rec12 D_80184EA0[]; + extern u8 D_80078EAF; + extern u8 D_801C9310; + extern s32 D_801C772C; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_80184EA4[]; + extern u8 D_80184EA8[]; + extern unsigned char D_801C9260; + extern s16 *D_801C7714; + extern s32 D_801C7744; + extern s32 D_801C7748; + extern s32 D_801C774C; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801C7738 & 1)) { + D_801C7720 = 1; + } else { + D_801C7720 = D_80078EAF; + } + + b0 = ((u8 *)D_80184EA0)[D_801C7720 * 12]; + D_801C936A = b0; + D_801C93DE = b0; + b1 = D_80184EA4[D_801C7720 * 12]; + D_801C926A = b1; + D_801C9334 = b1; + b2 = D_80184EA8[D_801C7720 * 12]; + D_801C9240 = b2; + D_801C9269 = b2; + + (*(S9 *)&D_801C9260) = ((S9 *)D_80184E68)[D_801C7720]; + (*(S9 *)&D_801C9310) = *(S9 *)(&D_801C9240 + 0x20); /* same addr as (*(S9 *)&D_801C9260); distinct sym defeats cse, keeps %hi/%lo */ + + D_801C9338 = 1; + D_801C7734 = -1; + D_801C7730 = 0; + D_801C772C = -1; + D_801C7718 = 0; + D_801C7724 = 0; + D_801C7728 = 0; + + if ((D_801C7738 & 2) && (D_801C7720 == 4)) { + s0v = (*(s32 * *)&D_801C7708)[18]; + t9v = (*(s32 * *)&D_801C7708)[19]; + t8v = (*(s32 * *)&D_801C7708)[20]; + } else { + s32 *p = (s32 *)(D_801C7720 * 12 + (s32) (*(s32 * *)&D_801C7708)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801C7714) = arg0; + if (arg0 != 0) { + if (D_801C7740 != 0) { + s32 *p = (s32 *)(D_801C7720 * 12 + (s32) (*(s32 * *)&D_801C7710)); + D_801C7744 = p[0]; + D_801C7748 = p[1]; + D_801C774C = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c b/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c index 408922578..c251ef382 100644 --- a/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c +++ b/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c @@ -1933,7 +1933,7 @@ extern u8 D_8018DAA8[]; extern u8 D_8018DB28[]; extern u8 D_8018DA00[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1954,7 +1954,7 @@ void func_8013D3D4(int param_1, int param_2) D_801E5B04 = D_8018DB28; D_801E5B08 = D_8018DA00; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801E5B38 != 0) { func_8013DD68(); @@ -1978,7 +1978,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801E5B30; +extern s32 D_801E5B18; + + +extern u8 D_801E7AB2; +extern u8 D_801E7B26; +extern u8 D_801E79B2; +extern u8 D_801E7A7C; +extern u8 D_801E7988; +extern u8 D_801E79B1; + + +extern s32 D_801E7A80; +extern s32 D_801E5B2C; +extern s32 D_801E5B28; +extern s32 D_801E5B10; +extern s32 D_801E5B1C; +extern s32 D_801E5B20; + +extern void *D_801E5B00; +extern s32 D_801E5B38; +extern void *D_801E5B08; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018DB44[]; + extern Rec12 D_8018DB7C[]; + extern u8 D_80078EAF; + extern u8 D_801E7A58; + extern s32 D_801E5B24; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018DB80[]; + extern u8 D_8018DB84[]; + extern unsigned char D_801E79A8; + extern s16 *D_801E5B0C; + extern s32 D_801E5B3C; + extern s32 D_801E5B40; + extern s32 D_801E5B44; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801E5B30 & 1)) { + D_801E5B18 = 1; + } else { + D_801E5B18 = D_80078EAF; + } + + b0 = ((u8 *)D_8018DB7C)[D_801E5B18 * 12]; + D_801E7AB2 = b0; + D_801E7B26 = b0; + b1 = D_8018DB80[D_801E5B18 * 12]; + D_801E79B2 = b1; + D_801E7A7C = b1; + b2 = D_8018DB84[D_801E5B18 * 12]; + D_801E7988 = b2; + D_801E79B1 = b2; + + (*(S9 *)&D_801E79A8) = ((S9 *)D_8018DB44)[D_801E5B18]; + (*(S9 *)&D_801E7A58) = *(S9 *)(&D_801E7988 + 0x20); /* same addr as (*(S9 *)&D_801E79A8); distinct sym defeats cse, keeps %hi/%lo */ + + D_801E7A80 = 1; + D_801E5B2C = -1; + D_801E5B28 = 0; + D_801E5B24 = -1; + D_801E5B10 = 0; + D_801E5B1C = 0; + D_801E5B20 = 0; + + if ((D_801E5B30 & 2) && (D_801E5B18 == 4)) { + s0v = (*(s32 * *)&D_801E5B00)[18]; + t9v = (*(s32 * *)&D_801E5B00)[19]; + t8v = (*(s32 * *)&D_801E5B00)[20]; + } else { + s32 *p = (s32 *)(D_801E5B18 * 12 + (s32) (*(s32 * *)&D_801E5B00)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801E5B0C) = arg0; + if (arg0 != 0) { + if (D_801E5B38 != 0) { + s32 *p = (s32 *)(D_801E5B18 * 12 + (s32) (*(s32 * *)&D_801E5B08)); + D_801E5B3C = p[0]; + D_801E5B40 = p[1]; + D_801E5B44 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c b/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c index 8fa09c9ff..79386c791 100644 --- a/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c +++ b/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c @@ -1933,7 +1933,7 @@ extern u8 D_8018DAA8[]; extern u8 D_8018DB28[]; extern u8 D_8018DA00[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1954,7 +1954,7 @@ void func_8013D3D4(int param_1, int param_2) D_801E5B04 = D_8018DB28; D_801E5B08 = D_8018DA00; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801E5B38 != 0) { func_8013DD68(); @@ -1978,7 +1978,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801E5B30; +extern s32 D_801E5B18; + + +extern u8 D_801E7AB2; +extern u8 D_801E7B26; +extern u8 D_801E79B2; +extern u8 D_801E7A7C; +extern u8 D_801E7988; +extern u8 D_801E79B1; + + +extern s32 D_801E7A80; +extern s32 D_801E5B2C; +extern s32 D_801E5B28; +extern s32 D_801E5B10; +extern s32 D_801E5B1C; +extern s32 D_801E5B20; + +extern void *D_801E5B00; +extern s32 D_801E5B38; +extern void *D_801E5B08; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018DB44[]; + extern Rec12 D_8018DB7C[]; + extern u8 D_80078EAF; + extern u8 D_801E7A58; + extern s32 D_801E5B24; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018DB80[]; + extern u8 D_8018DB84[]; + extern unsigned char D_801E79A8; + extern s16 *D_801E5B0C; + extern s32 D_801E5B3C; + extern s32 D_801E5B40; + extern s32 D_801E5B44; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801E5B30 & 1)) { + D_801E5B18 = 1; + } else { + D_801E5B18 = D_80078EAF; + } + + b0 = ((u8 *)D_8018DB7C)[D_801E5B18 * 12]; + D_801E7AB2 = b0; + D_801E7B26 = b0; + b1 = D_8018DB80[D_801E5B18 * 12]; + D_801E79B2 = b1; + D_801E7A7C = b1; + b2 = D_8018DB84[D_801E5B18 * 12]; + D_801E7988 = b2; + D_801E79B1 = b2; + + (*(S9 *)&D_801E79A8) = ((S9 *)D_8018DB44)[D_801E5B18]; + (*(S9 *)&D_801E7A58) = *(S9 *)(&D_801E7988 + 0x20); /* same addr as (*(S9 *)&D_801E79A8); distinct sym defeats cse, keeps %hi/%lo */ + + D_801E7A80 = 1; + D_801E5B2C = -1; + D_801E5B28 = 0; + D_801E5B24 = -1; + D_801E5B10 = 0; + D_801E5B1C = 0; + D_801E5B20 = 0; + + if ((D_801E5B30 & 2) && (D_801E5B18 == 4)) { + s0v = (*(s32 * *)&D_801E5B00)[18]; + t9v = (*(s32 * *)&D_801E5B00)[19]; + t8v = (*(s32 * *)&D_801E5B00)[20]; + } else { + s32 *p = (s32 *)(D_801E5B18 * 12 + (s32) (*(s32 * *)&D_801E5B00)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801E5B0C) = arg0; + if (arg0 != 0) { + if (D_801E5B38 != 0) { + s32 *p = (s32 *)(D_801E5B18 * 12 + (s32) (*(s32 * *)&D_801E5B08)); + D_801E5B3C = p[0]; + D_801E5B40 = p[1]; + D_801E5B44 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c b/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c index 285d5a12c..2f5bb1642 100644 --- a/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c +++ b/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_80183BE0[]; extern u8 D_80183C60[]; extern u8 D_80183B38[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801BB114 = D_80183C60; D_801BB118 = D_80183B38; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801BB148 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801BB140; +extern s32 D_801BB128; + + +extern u8 D_801BC73A; +extern u8 D_801BC7AE; +extern u8 D_801BC63A; +extern u8 D_801BC704; +extern u8 D_801BC610; +extern u8 D_801BC639; + + +extern s32 D_801BC708; +extern s32 D_801BB13C; +extern s32 D_801BB138; +extern s32 D_801BB120; +extern s32 D_801BB12C; +extern s32 D_801BB130; + +extern void *D_801BB110; +extern s32 D_801BB148; +extern void *D_801BB118; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80183C7C[]; + extern Rec12 D_80183CB4[]; + extern u8 D_80078EAF; + extern u8 D_801BC6E0; + extern s32 D_801BB134; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_80183CB8[]; + extern u8 D_80183CBC[]; + extern unsigned char D_801BC630; + extern s16 *D_801BB11C; + extern s32 D_801BB14C; + extern s32 D_801BB150; + extern s32 D_801BB154; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801BB140 & 1)) { + D_801BB128 = 1; + } else { + D_801BB128 = D_80078EAF; + } + + b0 = ((u8 *)D_80183CB4)[D_801BB128 * 12]; + D_801BC73A = b0; + D_801BC7AE = b0; + b1 = D_80183CB8[D_801BB128 * 12]; + D_801BC63A = b1; + D_801BC704 = b1; + b2 = D_80183CBC[D_801BB128 * 12]; + D_801BC610 = b2; + D_801BC639 = b2; + + (*(S9 *)&D_801BC630) = ((S9 *)D_80183C7C)[D_801BB128]; + (*(S9 *)&D_801BC6E0) = *(S9 *)(&D_801BC610 + 0x20); /* same addr as (*(S9 *)&D_801BC630); distinct sym defeats cse, keeps %hi/%lo */ + + D_801BC708 = 1; + D_801BB13C = -1; + D_801BB138 = 0; + D_801BB134 = -1; + D_801BB120 = 0; + D_801BB12C = 0; + D_801BB130 = 0; + + if ((D_801BB140 & 2) && (D_801BB128 == 4)) { + s0v = (*(s32 * *)&D_801BB110)[18]; + t9v = (*(s32 * *)&D_801BB110)[19]; + t8v = (*(s32 * *)&D_801BB110)[20]; + } else { + s32 *p = (s32 *)(D_801BB128 * 12 + (s32) (*(s32 * *)&D_801BB110)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801BB11C) = arg0; + if (arg0 != 0) { + if (D_801BB148 != 0) { + s32 *p = (s32 *)(D_801BB128 * 12 + (s32) (*(s32 * *)&D_801BB118)); + D_801BB14C = p[0]; + D_801BB150 = p[1]; + D_801BB154 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c b/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c index bed7d14cf..9f9c42daa 100644 --- a/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c +++ b/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_8018DA6C[]; extern u8 D_8018DAEC[]; extern u8 D_8018D9C4[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801EB95C = D_8018DAEC; D_801EB960 = D_8018D9C4; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801EB990 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801EB988; +extern s32 D_801EB970; + + +extern u8 D_801ED912; +extern u8 D_801ED986; +extern u8 D_801ED812; +extern u8 D_801ED8DC; +extern u8 D_801ED7E8; +extern u8 D_801ED811; + + +extern s32 D_801ED8E0; +extern s32 D_801EB984; +extern s32 D_801EB980; +extern s32 D_801EB968; +extern s32 D_801EB974; +extern s32 D_801EB978; + +extern void *D_801EB958; +extern s32 D_801EB990; +extern void *D_801EB960; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_8018DB08[]; + extern Rec12 D_8018DB40[]; + extern u8 D_80078EAF; + extern u8 D_801ED8B8; + extern s32 D_801EB97C; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018DB44[]; + extern u8 D_8018DB48[]; + extern unsigned char D_801ED808; + extern s16 *D_801EB964; + extern s32 D_801EB994; + extern s32 D_801EB998; + extern s32 D_801EB99C; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801EB988 & 1)) { + D_801EB970 = 1; + } else { + D_801EB970 = D_80078EAF; + } + + b0 = ((u8 *)D_8018DB40)[D_801EB970 * 12]; + D_801ED912 = b0; + D_801ED986 = b0; + b1 = D_8018DB44[D_801EB970 * 12]; + D_801ED812 = b1; + D_801ED8DC = b1; + b2 = D_8018DB48[D_801EB970 * 12]; + D_801ED7E8 = b2; + D_801ED811 = b2; + + (*(S9 *)&D_801ED808) = ((S9 *)D_8018DB08)[D_801EB970]; + (*(S9 *)&D_801ED8B8) = *(S9 *)(&D_801ED7E8 + 0x20); /* same addr as (*(S9 *)&D_801ED808); distinct sym defeats cse, keeps %hi/%lo */ + + D_801ED8E0 = 1; + D_801EB984 = -1; + D_801EB980 = 0; + D_801EB97C = -1; + D_801EB968 = 0; + D_801EB974 = 0; + D_801EB978 = 0; + + if ((D_801EB988 & 2) && (D_801EB970 == 4)) { + s0v = (*(s32 * *)&D_801EB958)[18]; + t9v = (*(s32 * *)&D_801EB958)[19]; + t8v = (*(s32 * *)&D_801EB958)[20]; + } else { + s32 *p = (s32 *)(D_801EB970 * 12 + (s32) (*(s32 * *)&D_801EB958)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801EB964) = arg0; + if (arg0 != 0) { + if (D_801EB990 != 0) { + s32 *p = (s32 *)(D_801EB970 * 12 + (s32) (*(s32 * *)&D_801EB960)); + D_801EB994 = p[0]; + D_801EB998 = p[1]; + D_801EB99C = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c b/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c index cea86a79f..ecfd3152e 100644 --- a/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c +++ b/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_801871C8[]; extern u8 D_80187248[]; extern u8 D_80187120[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801E509C = D_80187248; D_801E50A0 = D_80187120; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801E50D0 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801E50C8; +extern s32 D_801E50B0; + + +extern u8 D_801E681A; +extern u8 D_801E688E; +extern u8 D_801E6712; +extern u8 D_801E67E4; +extern u8 D_801E66E8; +extern u8 D_801E6711; + + +extern s32 D_801E67E8; +extern s32 D_801E50C4; +extern s32 D_801E50C0; +extern s32 D_801E50A8; +extern s32 D_801E50B4; +extern s32 D_801E50B8; + +extern void *D_801E5098; +extern s32 D_801E50D0; +extern void *D_801E50A0; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80187264[]; + extern Rec12 D_8018729C[]; + extern u8 D_80078EAF; + extern u8 D_801E67C0; + extern s32 D_801E50BC; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_801872A0[]; + extern u8 D_801872A4[]; + extern unsigned char D_801E6708; + extern s16 *D_801E50A4; + extern s32 D_801E50D4; + extern s32 D_801E50D8; + extern s32 D_801E50DC; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801E50C8 & 1)) { + D_801E50B0 = 1; + } else { + D_801E50B0 = D_80078EAF; + } + + b0 = ((u8 *)D_8018729C)[D_801E50B0 * 12]; + D_801E681A = b0; + D_801E688E = b0; + b1 = D_801872A0[D_801E50B0 * 12]; + D_801E6712 = b1; + D_801E67E4 = b1; + b2 = D_801872A4[D_801E50B0 * 12]; + D_801E66E8 = b2; + D_801E6711 = b2; + + (*(S9 *)&D_801E6708) = ((S9 *)D_80187264)[D_801E50B0]; + (*(S9 *)&D_801E67C0) = *(S9 *)(&D_801E66E8 + 0x20); /* same addr as (*(S9 *)&D_801E6708); distinct sym defeats cse, keeps %hi/%lo */ + + D_801E67E8 = 1; + D_801E50C4 = -1; + D_801E50C0 = 0; + D_801E50BC = -1; + D_801E50A8 = 0; + D_801E50B4 = 0; + D_801E50B8 = 0; + + if ((D_801E50C8 & 2) && (D_801E50B0 == 4)) { + s0v = (*(s32 * *)&D_801E5098)[18]; + t9v = (*(s32 * *)&D_801E5098)[19]; + t8v = (*(s32 * *)&D_801E5098)[20]; + } else { + s32 *p = (s32 *)(D_801E50B0 * 12 + (s32) (*(s32 * *)&D_801E5098)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801E50A4) = arg0; + if (arg0 != 0) { + if (D_801E50D0 != 0) { + s32 *p = (s32 *)(D_801E50B0 * 12 + (s32) (*(s32 * *)&D_801E50A0)); + D_801E50D4 = p[0]; + D_801E50D8 = p[1]; + D_801E50DC = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c b/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c index 3b4067392..2c9319bce 100644 --- a/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c +++ b/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c @@ -1938,7 +1938,7 @@ extern u8 D_80180CE4[]; extern u8 D_80180D64[]; extern u8 D_80180C3C[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1959,7 +1959,7 @@ void func_8013D3D4(int param_1, int param_2) D_801AA98C = D_80180D64; D_801AA990 = D_80180C3C; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801AA9C0 != 0) { func_8013DD68(); @@ -1983,7 +1983,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801AA9B8; +extern s32 D_801AA9A0; + + +extern u8 D_801ABCE2; +extern u8 D_801ABD56; +extern u8 D_801ABC0A; +extern u8 D_801ABCC4; +extern u8 D_801ABBE0; +extern u8 D_801ABC09; + + +extern s32 D_801ABCC8; +extern s32 D_801AA9B4; +extern s32 D_801AA9B0; +extern s32 D_801AA998; +extern s32 D_801AA9A4; +extern s32 D_801AA9A8; + +extern void *D_801AA988; +extern s32 D_801AA9C0; +extern void *D_801AA990; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80180D80[]; + extern Rec12 D_80180DB8[]; + extern u8 D_80078EAF; + extern u8 D_801ABCA0; + extern s32 D_801AA9AC; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_80180DBC[]; + extern u8 D_80180DC0[]; + extern unsigned char D_801ABC00; + extern s16 *D_801AA994; + extern s32 D_801AA9C4; + extern s32 D_801AA9C8; + extern s32 D_801AA9CC; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801AA9B8 & 1)) { + D_801AA9A0 = 1; + } else { + D_801AA9A0 = D_80078EAF; + } + + b0 = ((u8 *)D_80180DB8)[D_801AA9A0 * 12]; + D_801ABCE2 = b0; + D_801ABD56 = b0; + b1 = D_80180DBC[D_801AA9A0 * 12]; + D_801ABC0A = b1; + D_801ABCC4 = b1; + b2 = D_80180DC0[D_801AA9A0 * 12]; + D_801ABBE0 = b2; + D_801ABC09 = b2; + + (*(S9 *)&D_801ABC00) = ((S9 *)D_80180D80)[D_801AA9A0]; + (*(S9 *)&D_801ABCA0) = *(S9 *)(&D_801ABBE0 + 0x20); /* same addr as (*(S9 *)&D_801ABC00); distinct sym defeats cse, keeps %hi/%lo */ + + D_801ABCC8 = 1; + D_801AA9B4 = -1; + D_801AA9B0 = 0; + D_801AA9AC = -1; + D_801AA998 = 0; + D_801AA9A4 = 0; + D_801AA9A8 = 0; + + if ((D_801AA9B8 & 2) && (D_801AA9A0 == 4)) { + s0v = (*(s32 * *)&D_801AA988)[18]; + t9v = (*(s32 * *)&D_801AA988)[19]; + t8v = (*(s32 * *)&D_801AA988)[20]; + } else { + s32 *p = (s32 *)(D_801AA9A0 * 12 + (s32) (*(s32 * *)&D_801AA988)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801AA994) = arg0; + if (arg0 != 0) { + if (D_801AA9C0 != 0) { + s32 *p = (s32 *)(D_801AA9A0 * 12 + (s32) (*(s32 * *)&D_801AA990)); + D_801AA9C4 = p[0]; + D_801AA9C8 = p[1]; + D_801AA9CC = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c b/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c index 9646671d5..1a6b3acac 100644 --- a/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c +++ b/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c @@ -1933,7 +1933,7 @@ extern u8 D_80182F10[]; extern u8 D_80182F90[]; extern u8 D_80182E68[]; -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -1954,7 +1954,7 @@ void func_8013D3D4(int param_1, int param_2) D_801CE8A4 = D_80182F90; D_801CE8A8 = D_80182E68; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801CE8D8 != 0) { func_8013DD68(); @@ -1978,7 +1978,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + +extern s32 D_801CE8D0; +extern s32 D_801CE8B8; + + +extern u8 D_801D0C72; +extern u8 D_801D0CE6; +extern u8 D_801D0B92; +extern u8 D_801D0C54; +extern u8 D_801D0B68; +extern u8 D_801D0B91; + + +extern s32 D_801D0C58; +extern s32 D_801CE8CC; +extern s32 D_801CE8C8; +extern s32 D_801CE8B0; +extern s32 D_801CE8BC; +extern s32 D_801CE8C0; + +extern void *D_801CE8A0; +extern s32 D_801CE8D8; +extern void *D_801CE8A8; + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80182FAC[]; + extern Rec12 D_80182FE4[]; + extern u8 D_80078EAF; + extern u8 D_801D0C30; + extern s32 D_801CE8C4; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_80182FE8[]; + extern u8 D_80182FEC[]; + extern unsigned char D_801D0B88; + extern s16 *D_801CE8AC; + extern s32 D_801CE8DC; + extern s32 D_801CE8E0; + extern s32 D_801CE8E4; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801CE8D0 & 1)) { + D_801CE8B8 = 1; + } else { + D_801CE8B8 = D_80078EAF; + } + + b0 = ((u8 *)D_80182FE4)[D_801CE8B8 * 12]; + D_801D0C72 = b0; + D_801D0CE6 = b0; + b1 = D_80182FE8[D_801CE8B8 * 12]; + D_801D0B92 = b1; + D_801D0C54 = b1; + b2 = D_80182FEC[D_801CE8B8 * 12]; + D_801D0B68 = b2; + D_801D0B91 = b2; + + (*(S9 *)&D_801D0B88) = ((S9 *)D_80182FAC)[D_801CE8B8]; + (*(S9 *)&D_801D0C30) = *(S9 *)(&D_801D0B68 + 0x20); /* same addr as (*(S9 *)&D_801D0B88); distinct sym defeats cse, keeps %hi/%lo */ + + D_801D0C58 = 1; + D_801CE8CC = -1; + D_801CE8C8 = 0; + D_801CE8C4 = -1; + D_801CE8B0 = 0; + D_801CE8BC = 0; + D_801CE8C0 = 0; + + if ((D_801CE8D0 & 2) && (D_801CE8B8 == 4)) { + s0v = (*(s32 * *)&D_801CE8A0)[18]; + t9v = (*(s32 * *)&D_801CE8A0)[19]; + t8v = (*(s32 * *)&D_801CE8A0)[20]; + } else { + s32 *p = (s32 *)(D_801CE8B8 * 12 + (s32) (*(s32 * *)&D_801CE8A0)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801CE8AC) = arg0; + if (arg0 != 0) { + if (D_801CE8D8 != 0) { + s32 *p = (s32 *)(D_801CE8B8 * 12 + (s32) (*(s32 * *)&D_801CE8A8)); + D_801CE8DC = p[0]; + D_801CE8E0 = p[1]; + D_801CE8E4 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D8FC); diff --git a/src/ov_SC07_007/ov_SC07_007_jr_80131340.c b/src/ov_SC07_007/ov_SC07_007_jr_80131340.c index 99462790d..adaaf5d14 100644 --- a/src/ov_SC07_007/ov_SC07_007_jr_80131340.c +++ b/src/ov_SC07_007/ov_SC07_007_jr_80131340.c @@ -3365,7 +3365,7 @@ void func_8013D330(void) { -extern void func_8013D53C(void); +extern void func_8013D53C(void *arg0v); extern void func_8013DD68(void); extern void func_8013D8FC(void); extern void func_8013CF68(void); @@ -3401,7 +3401,7 @@ void func_8013D3D4(int param_1, int param_2) D_801C65B4 = D_80183844; D_801C65B8 = D_8018371C; } - func_8013D53C(); + ((void (*)(void))func_8013D53C)(); if ((param_2 & 1) != 0) { if (D_801C65E8 != 0) { func_8013DD68(); @@ -3425,7 +3425,138 @@ void func_8013D3D4(int param_1, int param_2) } -INCLUDE_ASM("asm/ov_SC07_007/nonmatchings/ov_SC07_007_jr_80131340", func_8013D53C); + +typedef struct { u8 b[9]; } S9; /* 9-byte, align-1 -> unaligned block copy */ + + + + + + + + +void func_8013D53C(void *arg0v) { + + extern Rec9 D_80183860[]; + extern Rec12 D_80183898[]; + extern s32 D_801C65E0; + extern u8 D_80078EAF; + extern s32 D_801C65C8; + extern u8 D_801C7AC2; + extern u8 D_801C7B36; + extern u8 D_801C79E2; + extern u8 D_801C7AA4; + extern u8 D_801C79B8; + extern u8 D_801C79E1; + extern u8 D_801C7A80; + extern s32 D_801C7AA8; + extern s32 D_801C65DC; + extern s32 D_801C65D8; + extern s32 D_801C65D4; + extern s32 D_801C65C0; + extern s32 D_801C65CC; + extern s32 D_801C65D0; + extern void *D_801C65B0; + extern s32 D_801C65E8; + extern void *D_801C65B8; + Cmd_8013D53C *arg0 = arg0v; + + extern u8 D_8018389C[]; + extern u8 D_801838A0[]; + extern unsigned char D_801C79D8; + extern s16 *D_801C65BC; + extern s32 D_801C65EC; + extern s32 D_801C65F0; + extern s32 D_801C65F4; + s32 s0v; + s32 t9v; + s32 t8v; + u8 b0, b1, b2; + u8 pad[8]; /* dead BLKmode local: frame 0x10 -> 0x18, zero code */ + + if (!(D_801C65E0 & 1)) { + D_801C65C8 = 1; + } else { + D_801C65C8 = D_80078EAF; + } + + b0 = ((u8 *)D_80183898)[D_801C65C8 * 12]; + D_801C7AC2 = b0; + D_801C7B36 = b0; + b1 = D_8018389C[D_801C65C8 * 12]; + D_801C79E2 = b1; + D_801C7AA4 = b1; + b2 = D_801838A0[D_801C65C8 * 12]; + D_801C79B8 = b2; + D_801C79E1 = b2; + + (*(S9 *)&D_801C79D8) = ((S9 *)D_80183860)[D_801C65C8]; + (*(S9 *)&D_801C7A80) = *(S9 *)(&D_801C79B8 + 0x20); /* same addr as (*(S9 *)&D_801C79D8); distinct sym defeats cse, keeps %hi/%lo */ + + D_801C7AA8 = 1; + D_801C65DC = -1; + D_801C65D8 = 0; + D_801C65D4 = -1; + D_801C65C0 = 0; + D_801C65CC = 0; + D_801C65D0 = 0; + + if ((D_801C65E0 & 2) && (D_801C65C8 == 4)) { + s0v = (*(s32 * *)&D_801C65B0)[18]; + t9v = (*(s32 * *)&D_801C65B0)[19]; + t8v = (*(s32 * *)&D_801C65B0)[20]; + } else { + s32 *p = (s32 *)(D_801C65C8 * 12 + (s32) (*(s32 * *)&D_801C65B0)); /* block-local: local-alloc ties sum into mul chain */ + s0v = p[0]; + t9v = p[1]; + t8v = p[2]; + } + + (*(Cmd_8013D53C * *)&D_801C65BC) = arg0; + if (arg0 != 0) { + if (D_801C65E8 != 0) { + s32 *p = (s32 *)(D_801C65C8 * 12 + (s32) (*(s32 * *)&D_801C65B8)); + D_801C65EC = p[0]; + D_801C65F0 = p[1]; + D_801C65F4 = p[2]; + } else { + while ((arg0->cmd & 0xFFFF) != 0xFF) { + if ((arg0->cmd & 0xFFFF) == 9) { + s32 n; + s32 i; + u16 *src; + u16 *dst; + n = arg0->w * arg0->h; + i = 0; + src = arg0->data; + __asm__("" :: "r"(src)); /* +2 refs on src (depth-2): keeps src above i, below the mfhi temp */ + dst = src + n; + if (n > 0) { + do { + u16 px; + s32 r, g, b, out; + __asm__("" :: "r"(i)); /* +3 refs on i (depth-3): lifts i over dst in the $t2 race */ + px = *src; + r = ((px & 0x1F) * s0v) / 2560; + g = (((px & 0x3E0) * t9v) / 2560) & 0x3E0; + b = (((px & 0x7C00) * t8v) / 2560) & 0x7C00; + out = r | g | b | (px & 0x8000); + if (out == 0 && px != 0) { + out = 0x8000; + } + *dst = out; + dst++; + i++; + src++; + } while (i < n); + } + } + arg0++; + } + } + } +} + INCLUDE_ASM("asm/ov_SC07_007/nonmatchings/ov_SC07_007_jr_80131340", func_8013D8FC); diff --git a/src/shared/engine_types.h b/src/shared/engine_types.h index 608c09722..4edcf7f0a 100644 --- a/src/shared/engine_types.h +++ b/src/shared/engine_types.h @@ -680,3 +680,14 @@ typedef struct { s32 w[8]; } Mtx8_8016CBC0; + +/* Phase-29 decl-normalize+lift (func_8013D53C family) */ +typedef struct { + u16 cmd; /* 0x0 */ + u16 pad2; /* 0x2 */ + u16 pad4; /* 0x4 */ + u16 pad6; /* 0x6 */ + s16 w; /* 0x8 */ + s16 h; /* 0xA */ + u16 *data; /* 0xC */ +} Cmd_8013D53C; /* 0x10 */ diff --git a/tools/normalize_self_decls.py b/tools/normalize_self_decls.py index 0f9c59a2b..bb339feca 100644 --- a/tools/normalize_self_decls.py +++ b/tools/normalize_self_decls.py @@ -130,7 +130,18 @@ def fix(tu_text, fn, ref_decl=None): lines = tu_text.split('\n') depths = _brace_depths(tu_text) - remove = set() # decl line indices to drop + # The canonical forward decl we REWRITE each divergent decl to. It matches the def (so no + # `conflicting types`) AND keeps forward visibility for a caller whose reference precedes the def + # in the TU — the func_8013D53C case (a file-scope `void f(void)` forward decl, def spliced BELOW + # it) that *dropping* the decl broke (`func_8013D53C undeclared`). This is cast_call_sites' proven + # shape: rewrite the decl to canonical, then cast every call to its original sig (byte-exact). + canon_line = ref_decl.strip() + if not canon_line.startswith('extern '): + canon_line = 'extern ' + canon_line + if not canon_line.endswith(';'): + canon_line += ';' + + rewrite = {} # decl line idx -> canonical decl replacement casts = [] # (start, end, cast_type_str) notes = [] for i, ln in enumerate(lines): @@ -140,9 +151,13 @@ def fix(tu_text, fn, ref_decl=None): indent, _extern, ret, name, params = m.groups() if name != fn: continue - # A no-prototype `void fn()` NEVER conflicts with a prototyped def in either TU order - # (cdecl §51g) — skip it; only prototypes can be the `conflicting types` culprit here. - if params.strip() in ('', 'void'): + # A TRUE no-prototype `void fn()` (empty param list) NEVER conflicts with a prototyped def in + # either TU order (cdecl §51g), and casting it is the §32 no-proto mis-cast trap — so skip it. + # But `(void)` is NOT no-proto: it is a 0-param PROTOTYPE that genuinely conflicts with a + # >0-param def (func_8013D53C: sibling `void f(void)` vs def `void f(void *)` — cdecl.compatible + # returns False), so let the compatibility check below judge it. Skipping `(void)` here was the + # bug that made this pass miss the (void)/(T) arity class (the BUILD SPEC's "distinct" D53C). + if params.strip() == '': continue clean = f'extern {ret.strip()} {fn}({params});' try: @@ -154,24 +169,25 @@ def fix(tu_text, fn, ref_decl=None): dret, dptypes = _ccs.parse_sig(ret, params) cty = _ccs.cast_type(dret, dptypes) s, e = _scope_of(depths, i, len(lines)) - remove.add(i) + rewrite[i] = indent + canon_line casts.append((s, e, cty)) - notes.append(f'{fn}@{i + 1}: dropped `{clean}`; cast calls in lines {s + 1}..{e + 1} to ({cty})') + notes.append(f'{fn}@{i + 1}: `{clean}` -> `{canon_line}`; cast calls in lines {s + 1}..{e + 1} to ({cty})') - if not remove: + if not rewrite: return tu_text, 0, notes call_re = re.compile(rf'\b{re.escape(fn)}\s*\(') out = [] for i, ln in enumerate(lines): - if i in remove: - continue # drop the divergent decl + if i in rewrite: + out.append(rewrite[i]) # rewrite the divergent decl to canonical (keeps visibility) + continue if not _is_def_or_decl_line(ln, fn): # never cast a decl/def line's `fn(` for (s, e, cty) in casts: if s <= i <= e: ln = call_re.sub(f'(({cty}){fn})(', ln) out.append(ln) - return '\n'.join(out), len(remove), notes + return '\n'.join(out), len(rewrite), notes def main():