From 28ad79673d738f78d821e56531f764697a5f3c73 Mon Sep 17 00:00:00 2001 From: lunavyqo <60808132+lunavyqo@users.noreply.github.com> Date: Fri, 24 Jul 2026 04:16:25 +0300 Subject: [PATCH] Match func_ov063_021162c8 byte-identical (mwccarm 1.2/sp2p3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace NONMATCHING draft with verified match (long-long u64-launder on 0x5d4 bic). Also bank improved near-miss for func_ov002_020d8944 (div 15→10). --- CLAIMS.md | 4 ++-- config/match_attempts.jsonl | 2 ++ config/match_provenance.jsonl | 1 + nearmiss/db.jsonl | 24 +++++++++---------- ...063_021162c8.c => func_ov063_021162c8.cpp} | 10 +++----- 5 files changed, 20 insertions(+), 21 deletions(-) rename src/{func_ov063_021162c8.c => func_ov063_021162c8.cpp} (80%) diff --git a/CLAIMS.md b/CLAIMS.md index 9afa6a64b..9348628c7 100644 --- a/CLAIMS.md +++ b/CLAIMS.md @@ -19,6 +19,8 @@ it is fair to take over: ping the claimant first. | Range | Who | Claimed | Status | |---|---|---|---| +| ov063 func_ov063_021162c8 (0x021162c8, size 0x108) | lunavyqo (Grok) | 2026-07-24 | **done** — verified byte-identical (mwccarm 1.2/sp2p3); long-long u64-launder on 0x5d4 bic | +| ov002 func_ov002_020d8944 (0x020d8944, size 0x10c) | lunavyqo (Grok) | 2026-07-24 | **released** — batch2 improved tip div=15→10 (LDM vs individual particle-call residual); banked in nearmiss/db.jsonl | | ov002 batch7: func_ov002_020ae4cc (0x020ae4cc, size 0xfc) | lunavyqo (Grok) | 2026-07-24 | **active** — batch7 from near-miss div=9 | | ov075 batch7: func_ov075_02116128 (0x02116128, size 0xf4) | lunavyqo (Grok) | 2026-07-24 | **active** — batch7 from near-miss div=29 | | ov062+ov006 batch8: func_ov062_02119af0 (0x02119af0, 0xf0) + func_ov006_020cc8c8 (0x020cc8c8, 0xf0) | lunavyqo (Grok) | 2026-07-24 | **active** — batch8 match (CLAIMS.md only; API key expired/revoked) | @@ -26,8 +28,6 @@ it is fair to take over: ping the claimant first. | ov075 func_ov075_02117d80 (0x02117d80, size 0x104) | lunavyqo (Grok) | 2026-07-24 | **active** — batch4 near-miss refine (prev div=5) | | ov002 func_ov002_020d708c (0x020d708c, size 0x100) | lunavyqo (Grok) | 2026-07-24 | **active** — batch6 near-miss div=19 | | ov080 func_ov080_02125460 (0x02125460, size 0xfc) | lunavyqo (Grok) | 2026-07-24 | **active** — batch6 near-miss div=5 | -| ov002 func_ov002_020d8944 (0x020d8944, size 0x10c) | lunavyqo (Grok) | 2026-07-24 | **active** — batch2 match from near-miss div=15 | -| ov063 func_ov063_021162c8 (0x021162c8, size 0x108) | lunavyqo (Grok) | 2026-07-24 | **active** — batch2 match from near-miss div=12 | | ov002 func_ov002_020f1468 (0x020f1468, size 0x110) + ov006 func_ov006_02124fd8 (0x02124fd8, size 0x10c) | lunavyqo (Grok) | 2026-07-24 | **done** — both verified byte-identical + linkcheck VERIFIED (mwccarm 1.2/sp2p3); batch1 | | ov007 batch3: func_ov007_020c43bc (0x020c43bc, size 0x108) + func_ov007_020b2bd4 (0x020b2bd4, size 0x108) | lunavyqo (Grok) | 2026-07-24 | **active** — API key expired; CLAIMS.md only | | ov007 func_ov007_020c55bc (0x020c55bc, size 0x100) | lunavyqo (Grok) | 2026-07-24 | **active** — batch5 match from near-miss div=9 | diff --git a/config/match_attempts.jsonl b/config/match_attempts.jsonl index 7c3302a8f..959a99aff 100644 --- a/config/match_attempts.jsonl +++ b/config/match_attempts.jsonl @@ -113,3 +113,5 @@ {"schemaVersion":1,"functionId":"ov002:0x020f1468","id":"ov002:0x020f1468","attemptId":"34bb8995b57b4fd6bf2e87415c97c5f7","parentAttemptId":"29e8a482e4514fe1a1c8747b3c86c6dc","module":"ov002","addr":34542696,"name":"func_ov002_020f1468","status":"matched","kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build","author":"lunavyqo","divergences":0,"prevBestDivergences":11,"improvedNearMiss":true,"srcPath":"src/func_ov002_020f1468.c","label":"batch1","note":"MATCH: direct *(c+0x32a) stores keep p out of mid-block so y=r1 base=r0; linkcheck VERIFIED","usedNearMissDraft":true,"usedGhidraDraft":false,"base":{"kind":"previous_attempt","attemptId":"29e8a482e4514fe1a1c8747b3c86c6dc","divergences":11},"sessionScope":"batch","batchSize":2} {"schemaVersion":1,"functionId":"ov006:0x02124fd8","id":"ov006:0x02124fd8","attemptId":"5d99f84b3a0244b1ba1c1905eb0d47e2","parentAttemptId":null,"module":"ov006","addr":34754520,"name":"func_ov006_02124fd8","status":"no_progress","kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build","author":"lunavyqo","divergences":999,"prevBestDivergences":16,"improvedNearMiss":false,"label":"batch1","note":"root near-miss for-loop; size 0xf8 vs 0x10c; missing early ble + predicated return","usedNearMissDraft":true,"usedGhidraDraft":false,"base":{"kind":"near_miss_draft","divergences":16},"sessionScope":"batch","batchSize":2} {"schemaVersion":1,"functionId":"ov006:0x02124fd8","id":"ov006:0x02124fd8","attemptId":"02a90f595e824792809fcdc7d06db8ac","parentAttemptId":"5d99f84b3a0244b1ba1c1905eb0d47e2","module":"ov006","addr":34754520,"name":"func_ov006_02124fd8","status":"matched","kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build","author":"lunavyqo","divergences":0,"prevBestDivergences":16,"improvedNearMiss":true,"srcPath":"src/func_ov006_02124fd8.c","label":"batch1","note":"MATCH: count<=0 early skip; do-while reloads count; if(fp<2)return; u64-mask 0x51b8++ ; linkcheck VERIFIED","usedNearMissDraft":true,"usedGhidraDraft":false,"base":{"kind":"previous_attempt","attemptId":"5d99f84b3a0244b1ba1c1905eb0d47e2","divergences":999},"sessionScope":"batch","batchSize":2} +{"schemaVersion": 1, "functionId": "ov063:0x021162c8", "id": "ov063:0x021162c8", "attemptId": "e0e41ae390644b6499db92cb29ff4eb2", "parentAttemptId": null, "module": "ov063", "addr": 34693832, "name": "func_ov063_021162c8", "status": "matched", "kind": "ai", "model": "grok-4.5", "reasoning": "high", "harness": "grok-build", "author": "lunavyqo", "divergences": 0, "prevBestDivergences": 12, "improvedNearMiss": true, "srcPath": "src/func_ov063_021162c8.cpp", "note": "long-long u64-launder on 0x5d4 bic forces pool materialization; CapEnemy/Actor C++ dispatch from near-miss", "usedNearMissDraft": true, "usedGhidraDraft": false, "base": {"kind": "near_miss_draft", "divergences": 12}, "sessionScope": "batch", "batchSize": 2} +{"schemaVersion": 1, "functionId": "ov002:0x020d8944", "id": "ov002:0x020d8944", "attemptId": "5031a15e7b7d405d8c3dcb24f56ac9fb", "parentAttemptId": null, "module": "ov002", "addr": 34441540, "name": "func_ov002_020d8944", "status": "near_miss", "kind": "ai", "model": "grok-4.5", "reasoning": "high", "harness": "grok-build", "author": "lunavyqo", "divergences": 10, "prevBestDivergences": 15, "improvedNearMiss": true, "srcPath": "src/func_ov002_020d8944.cpp", "note": "p,sum,asr decl order fixes stack; Vector3 by-value NewSimple for frame; residual LDM vs individual ldr for particle call (ABI)", "usedNearMissDraft": true, "usedGhidraDraft": false, "base": {"kind": "near_miss_draft", "divergences": 15}, "sessionScope": "batch", "batchSize": 2} diff --git a/config/match_provenance.jsonl b/config/match_provenance.jsonl index 3c8a21cc5..119c69640 100644 --- a/config/match_provenance.jsonl +++ b/config/match_provenance.jsonl @@ -23,3 +23,4 @@ {"id":"ov002:0x020bb520","module":"ov002","addr":34321696,"name":"func_ov002_020bb520","matchProvenance":{"kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build"},"author":"lunavyqo","srcPath":"src/func_ov002_020bb520.c"} {"id":"ov002:0x020f1468","module":"ov002","addr":34542696,"name":"func_ov002_020f1468","matchProvenance":{"kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build"},"author":"lunavyqo","srcPath":"src/func_ov002_020f1468.c"} {"id":"ov006:0x02124fd8","module":"ov006","addr":34754520,"name":"func_ov006_02124fd8","matchProvenance":{"kind":"ai","model":"grok-4.5","reasoning":"high","harness":"grok-build"},"author":"lunavyqo","srcPath":"src/func_ov006_02124fd8.c"} +{"id": "ov063:0x021162c8", "module": "ov063", "addr": 34693832, "name": "func_ov063_021162c8", "matchProvenance": {"kind": "ai", "model": "grok-4.5", "reasoning": "high", "harness": "grok-build"}, "author": "lunavyqo", "srcPath": "src/func_ov063_021162c8.cpp"} diff --git a/nearmiss/db.jsonl b/nearmiss/db.jsonl index 2606e1e9e..093d1b6c9 100644 --- a/nearmiss/db.jsonl +++ b/nearmiss/db.jsonl @@ -7,7 +7,7 @@ {"module": "ov092", "addr": "0x02131010", "name": "func_ov092_02131010", "size": 416, "target_hex": "10402de928d04de20040a0e1ad7efbeb000050e31500000abeb4feeb000050e30900000a6c019fe5051c84e2002084e0000092e5010580e3000082e5000091e5040080e3000081e5080000ea44019fe5051c84e2002084e0000092e50105c0e3000082e5000091e50400c0e3000081e58ce084e2010b84e2f030dee1f01ed0e18ec084e2902084e2011083e0b010cee1f030dce1f21ed0e1011083e0b010cce1f010d2e1f40ed0e1000081e0b000c2e19c0094e5000050e328d08d021040bd081eff2f010400a0e10010a0e3d37efbebc90f84e2c41cfcebc90f84e27d11fceb000050e328d08d021040bd081eff2f01013b84e200e0a0e3b4eec3e1f40ed3e194209fe50c108de2b20ec3e1f2ced3e10400a0e1b0cec3e198e084e5a8e084e55c3094e50c308de5603094e510308de5643094e514308de5067cfbeb741084e24600a0e34e85fbeb5ce094e518108de200e08de5602094e50400a0e104208de564c094e51e3942e20120a0e308c08de504308de518e08de51c308de520c08de54b7afbeb0000a0e39c0084e528d08de21040bde81eff2fe10405000000c05d00", "lang": "c", "divergences": 2, "c_source": "typedef struct { int x, y, z; } Vector3;\ntypedef short s16;\n#define LA(p) (((long long)(int)(p)) & 0xFFFFFFFFFFFFFFFFLL)\nvoid *_ZN5Actor13ClosestPlayerEv(void *self);\nint func_ov002_020de328(void);\nvoid _ZN5Actor9UpdatePosEP12CylinderClsn(void *self, void *c);\nvoid func_020383fc(void *a);\nint _ZNK12WithMeshClsn10IsOnGroundEv(void *self);\nvoid _ZN5Actor10EarthquakeERK7Vector35Fix12IiE(void *self, const Vector3 *v, int fix);\nvoid func_02012694(int a, int *t);\nvoid _ZN5Actor13LandingDustAtER7Vector3b(void *self, Vector3 *v, int b);\nint func_ov092_02131010(unsigned char *thiz)\n{\n volatile Vector3 tmp;\n Vector3 eq;\n Vector3 dust;\n\n if (_ZN5Actor13ClosestPlayerEv(thiz) != 0) {\n if (func_ov002_020de328() != 0) {\n int *p504 = (int *)LA(thiz + 0x504);\n int *p500 = (int *)LA(thiz + 0x500);\n *p504 |= 0x400000;\n *p500 |= 4;\n } else {\n int *p504 = (int *)LA(thiz + 0x504);\n int *p500 = (int *)LA(thiz + 0x500);\n *p504 &= ~0x400000;\n *p500 &= ~4;\n }\n }\n\n {\n s16 *p8c = (s16 *)LA(thiz + 0x8c);\n s16 *p8e = (s16 *)LA(thiz + 0x8e);\n s16 *p90 = (s16 *)LA(thiz + 0x90);\n *p8c += ((s16 *)(thiz + 0x400))[0xe0 / 2];\n *p8e += ((s16 *)(thiz + 0x400))[0xe2 / 2];\n *p90 += ((s16 *)(thiz + 0x400))[0xe4 / 2];\n }\n\n {\n int v = *(int *)(thiz + 0x9c);\n if (v == 0) return v;\n }\n\n _ZN5Actor9UpdatePosEP12CylinderClsn(thiz, 0);\n func_020383fc(thiz + 0x324);\n {\n int g = _ZNK12WithMeshClsn10IsOnGroundEv(thiz + 0x324);\n if (g == 0) return g;\n }\n\n {\n short lr = 0;\n ((short *)(thiz + 0x400))[0xe4 / 2] = lr;\n ((short *)(thiz + 0x400))[0xe2 / 2] = ((short *)(thiz + 0x400))[0xe4 / 2];\n ((short *)(thiz + 0x400))[0xe0 / 2] = ((short *)(thiz + 0x400))[0xe2 / 2];\n *(int *)(thiz + 0x98) = lr;\n *(int *)(thiz + 0xa8) = lr;\n }\n\n eq.x = *(int *)(thiz + 0x5c);\n eq.y = *(int *)(thiz + 0x60);\n eq.z = *(int *)(thiz + 0x64);\n _ZN5Actor10EarthquakeERK7Vector35Fix12IiE(thiz, &eq, 0x5dc000);\n func_02012694(0x46, (int *)(thiz + 0x74));\n\n {\n int x, y, z;\n x = *(int *)(thiz + 0x5c);\n tmp.x = x;\n y = *(int *)(thiz + 0x60);\n tmp.y = y;\n z = *(int *)(thiz + 0x64);\n y = y - 0x78000;\n tmp.z = z;\n tmp.y = y;\n dust.x = x;\n dust.y = y;\n dust.z = z;\n }\n _ZN5Actor13LandingDustAtER7Vector3b(thiz, &dust, 1);\n\n *(int *)(thiz + 0x9c) = 0;\n return 0;\n}\n", "source": "session-improved", "floor": {"class": "ordering", "evidence": "one-slot mov-vs-volatile-str swap after ldr (LandingDustAt bool arg); ~30 spellings (arg naming/reassign, comma hoist, fake dep, C++ copy-temp, cast-away volatile, stmt perms, pragmas, 6o equal-arm ternaries) + 25min PERM_RANDOMIZE-focused permuter all inert; same family as func_ov060_02113740", "date": "2026-07-11"}} {"module": "ov002", "addr": "0x020dd9f8", "name": "_ZN6Player19St_GroundPound_MainEv", "size": 1016, "target_hex": "10402de910d04de20040a0e1061c84e2d31ed1e1000051e3300000da0000a0e3a80084e5e306d4e5020050e30a0aa003a80084050400a0e1d884ffeb000050e3dd00000a88039fe5001084e00000d1e5010040e20000c1e5e306d4e5000050e30a00000a0307d4e500c0a0e33c10a0e3000050e3a210a0130400a0e10121a0e3013aa0e300c08de52985ffebca0000ea0307d4e500c0a0e33d10a0e3000050e3a110a0130400a0e10121a0e3013aa0e300c08de51e85ffeb320aa0e3000060e2a80084e5d906d4e5742084e21510a0e3a1d1fceb600094e5840684e5b60000ea000051e39f00001a0410a0e10e0d84e2ed4500eb060c84e2b40ad0e1000050e31d00000a010050e30e00001a0400a0e11595ffeb00c0a0e30400a0e14210a0e30121a0e3013aa0e300c08de50085ffebff00a0e3e306c4e5bb1f84e2000091e52000c0e3000081e5060c84e2be0cd0e1010000e20008a0e12008b0e19600000a0400a0e10110a0e3ff89ffeb10d08de20100a0e31040bde81eff2fe1de06d4e5000050e37000001a0400a0e13e1400eb020050e310d08d020100a0031040bd081eff2f010400a0e158ffffeb0307d4e5000050e30300000a741084e2d300a0e3a3d2fceb030000ea6c0694e5741084e2900080e29ed2fceb5c1094e504108de5600094e508008de5643094e50c308de50307d4e5000050e31900000a602094e55700a0e3052982e208208de5a314fdeb04109de508209de50c309de55800a0e39e14fdeb0707d4e5000050e33d00001a04109de508209de50c309de55a00a0e39614fdeb600094e504109de50f2980e20c309de55900a0e308208de58f14fdeb300000ea080094e5020050e31400000a602094e5d300a0e30a2a82e208208de58614fdeb0707d4e5000050e32500001a600094e504109de50f2980e20c309de508208de5d400a0e37c14fdeb04109de508209de50c309de5d500a0e37714fdeb180000ea602094e54d0fa0e30a2a82e208208de57114fdeb04109de508209de50c309de5ec009fe56c14fdeb0707d4e5000050e30b00001a600094e504109de5322a80e20c309de5cc009fe508208de56214fdeb04109de508209de50c309de5b8009fe55d14fdebb4009fe5b4209fe5000090e55c1084e2e4befceb060c84e20610a0e3b41ac0e11b0000ea0400a0e1d1f7ffebc50f84e2b3dcfcebc50f84e2a4dcfceb140000ea7c209fe51810a0e30030d2e574209fe5930101e0f11092e1000051e30200001a0484ffeb000050e30600000a58109fe50400a0e1c11400eb10d08de20100a0e31040bde81eff2fe10400a0e10110a0e348d6ffeb0400a0e10584ffeb0100a0e310d08de21040bde81eff2fe1e306000035010000360100003701000018f3090200805700400e0a02a0f409023c011102", "lang": "cpp", "divergences": 2, "c_source": "//cpp\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\n\nstruct Vector3 { int x, y, z; };\n\nextern \"C\" {\nint _ZN6Player12FinishedAnimEv(char* self);\nvoid _ZN6Player7SetAnimEji5Fix12IiEj(char* self, unsigned int anim, int a, int b, unsigned int c);\nvoid _ZN5Sound13PlayCharVoiceEjjRK7Vector3(unsigned int a, unsigned int b, const Vector3* v);\nvoid func_ov002_020ef2a4(char* c, char* arg);\nvoid func_ov002_020c2f64(char* c);\nvoid func_ov002_020c0364(char* c, u32 arg);\nint func_ov002_020e2c84(char* self);\nvoid func_ov002_020dd908(char* sb);\nvoid _ZN5Sound9PlayBank0EjRK7Vector3(unsigned int id, const Vector3* v);\nvoid _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(unsigned int id, int x, int y, int z);\nvoid func_0200d8c8(void* cam, const void* v, int strength);\nvoid func_ov002_020dbc94(char* c);\nvoid _ZN12CylinderClsn5ClearEv(char* self);\nvoid _ZN12CylinderClsn6UpdateEv(char* self);\nvoid _ZN6Player11ChangeStateERNS_5StateE(char* self, void* state);\nint func_ov002_020d36d8(char* c, int arg);\nvoid func_ov002_020bedd4(char* self);\n}\n\nextern void* data_0209f318;\nextern u8 data_020a0e40;\nextern char data_0209f4a0[];\nextern int data_ov002_0211013c;\n\n#pragma opt_strength_reduction off\n#pragma opt_common_subs off\n\nextern \"C\" int _ZN6Player19St_GroundPound_MainEv(char* self)\n{\n s8 timer = *(s8*)(self + 0x6e3);\n if (timer > 0) {\n *(int*)(self + 0xa8) = 0;\n if (*(u8*)(self + 0x6e3) == 2)\n *(int*)(self + 0xa8) = 0xa000;\n if (_ZN6Player12FinishedAnimEv(self) != 0) {\n *(u8*)((((int)self) + 0x6e3) & 0xFFFFFFFFFFFFFFFFLL) -= 1;\n if (*(u8*)(self + 0x6e3) != 0) {\n u32 anim = 0x3c;\n if (*(u8*)(self + 0x703) != 0) anim = 0xa2;\n _ZN6Player7SetAnimEji5Fix12IiEj(self, anim, 0x40000000, 0x1000, 0);\n } else {\n u32 anim = 0x3d;\n if (*(u8*)(self + 0x703) != 0) anim = 0xa1;\n _ZN6Player7SetAnimEji5Fix12IiEj(self, anim, 0x40000000, 0x1000, 0);\n *(int*)(self + 0xa8) = -0x32000;\n _ZN5Sound13PlayCharVoiceEjjRK7Vector3(*(u8*)(self + 0x6d9), 0x15, (Vector3*)(self + 0x74));\n *(int*)(self + 0x684) = *(int*)(self + 0x60);\n }\n }\n } else if (timer == 0) {\n u16 st;\n func_ov002_020ef2a4(self + 0x380, self);\n st = *(u16*)(self + 0x6a4);\n if (st != 0) {\n if (st == 1) {\n func_ov002_020c2f64(self);\n _ZN6Player7SetAnimEji5Fix12IiEj(self, 0x42, 0x40000000, 0x1000, 0);\n *(u8*)(self + 0x6e3) = 0xff;\n *(u32*)((((int)self) + 0x2ec) & 0xFFFFFFFFFFFFFFFFLL) &= ~0x20;\n }\n {\n u16 f = *(u16*)(self + 0x6ce) & 1;\n if (f != 0) {\n func_ov002_020c0364(self, 1);\n return 1;\n }\n }\n } else {\n if (*(u8*)(self + 0x6de) == 0) {\n if (func_ov002_020e2c84(self) == 2)\n return 1;\n func_ov002_020dd908(self);\n if (*(u8*)(self + 0x703) != 0) {\n _ZN5Sound9PlayBank0EjRK7Vector3(0xd3, (Vector3*)(self + 0x74));\n } else {\n _ZN5Sound9PlayBank0EjRK7Vector3(*(u32*)(self + 0x66c) + 0x90, (Vector3*)(self + 0x74));\n }\n {\n volatile Vector3 v;\n int x = *(int*)(self + 0x5c);\n v.x = x;\n v.y = *(int*)(self + 0x60);\n int z = *(int*)(self + 0x64);\n v.z = z;\n if (*(u8*)(self + 0x703) != 0) {\n int yy = *(int*)(self + 0x60) + 0x14000;\n v.y = yy;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x57, x, yy, z);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x58, v.x, v.y, v.z);\n if (*(u8*)(self + 0x707) == 0) {\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x5a, v.x, v.y, v.z);\n int y2 = *(int*)(self + 0x60) + 0x3c000;\n int xx = v.x;\n int zz = v.z;\n v.y = y2;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x59, xx, y2, zz);\n }\n } else if (*(int*)(self + 8) != 2) {\n int yy = *(int*)(self + 0x60) + 0xa000;\n v.y = yy;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0xd3, x, yy, z);\n if (*(u8*)(self + 0x707) == 0) {\n int y2 = *(int*)(self + 0x60) + 0x3c000;\n int xx = v.x;\n int zz = v.z;\n v.y = y2;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0xd4, xx, y2, zz);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0xd5, v.x, v.y, v.z);\n }\n } else {\n int yy = *(int*)(self + 0x60) + 0xa000;\n v.y = yy;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x134, x, yy, z);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x135, v.x, v.y, v.z);\n if (*(u8*)(self + 0x707) == 0) {\n int y2 = *(int*)(self + 0x60) + 0x32000;\n int xx = v.x;\n int zz = v.z;\n v.y = y2;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x136, xx, y2, zz);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x137, v.x, v.y, v.z);\n }\n }\n }\n func_0200d8c8(data_0209f318, self + 0x5c, 0x578000);\n *(u16*)(self + 0x6a4) = 6;\n } else {\n func_ov002_020dbc94(self);\n _ZN12CylinderClsn5ClearEv(self + 0x314);\n _ZN12CylinderClsn6UpdateEv(self + 0x314);\n }\n }\n } else {\n if (*(short*)(data_0209f4a0 + data_020a0e40 * 0x18) != 0 || _ZN6Player12FinishedAnimEv(self) != 0) {\n _ZN6Player11ChangeStateERNS_5StateE(self, &data_ov002_0211013c);\n return 1;\n }\n func_ov002_020d36d8(self, 1);\n }\n func_ov002_020bedd4(self);\n return 1;\n}\n", "source": "fanout-fable"} {"module": "ov002", "addr": "0x020ade78", "name": "_ZN5Enemy14UpdateYoshiEatER12WithMeshClsn", "size": 972, "target_hex": "f0432de904d04de20060a0e1b02096e50150a0e1010712e20100a0130000a003000050e31700000ad00096e5000050e3b0108602000091050107c003000081050a00000a5c2080e2000092e5601086e25c0086e5040092e5600086e5080092e5640086e5000091e5030880e2000081e50000a0e30701c6e504d08de20200a0e3f043bde81eff2fe1020812e20100a0130000a003000050e30000a0130701c61504d08d120100a013f043bd181eff2f11020712e20100a0130000a003000050e30200001a0701d6e5000050e3b100000a010c86e2b400d0e1000050e3411f8612b000d11101004012b000c111b00096e5020710e20100a0130000a003000050e36500000a0100a0e30701c6e5010c86e20510a0e3b410c0e1b01086e2000091e50207c0e3000081e5d00096e5000050e30539a0033900000a5c2080e2000092e5601086e25c0086e5040092e56ce29fe5600086e5080092e50040a0e3640086e5000091e5322aa0e3320a80e2000081e5d00096e5023ba0e3be78d0e15c1086e2000091e54772a0e18780a0e18870a0e1f7c09ee1017088e28770a0e19c9288e09c8428e0cccfa0e1039099e09c8228e00080a8e22996a0e1089a89e1090080e0000081e5f7709ee1641086e2000091e597e28ce003e09ee097c42ce0c73fa0e193c22ce00020ace22e36a0e1023a83e1030080e0000081e5d00096e58c1080e2f000d1e1b209c6e1f200d1e1b409c6e1f400d1e1b609c6e1d00096e5983090e5050953e30a0a83a2980086a50a0000aac30fa0e18015a0e18325a0e1020ba0e3002092e0a31a81e10000a1e22216a0e1001a81e1050981e2980086e5981096e55c019fe50020a0e3917084e0914224e0c13fa0e1021ba0e3011097e0934024e00000a4e22116a0e1001a81e1981086e50309a0e3a80086e5d02086e50500a0e15d1dfeeb0040a0e10500a0e1621dfeeb0600a0e10010a0e3be8afdeb0500a0e1af28feeb0500a0e1681dfeeb000050e32600000a0500a0e1451dfeeb0070a0e1040087e2d41086e21927feeb0500a0e16b1dfeeb000050e30000a003a80086050701c6050d00000a040087e2d41086e20f27feeba81096e53100e0e3910000e0a0309fe5a02fa0e19310c0e0c002a0e1d81096e5000082e02894feeba80086e5a40086e2002090e5d41096e5ac3086e2811182e0001080e5002093e5dc1096e5811182e0001083e5643bfeeb980086e5f409d6e1000054e3be08c6e10100001a0500a0e1271dfeeb04d08de20300a0e3f043bde81eff2fe10000a0e3d00086e5b02086e2001092e50e18c1e3001082e50701c6e504d08de2f043bde81eff2fe114220802cc1400001f85eb51", "lang": "c", "divergences": 2, "c_source": "typedef unsigned short u16;\ntypedef short s16;\n\nenum { false, true };\n\nextern int _ZNK12WithMeshClsn13GetLimMovFlagEv(char *c);\nextern void _ZN12WithMeshClsn13SetLimMovFlagEv(char *c);\nextern void _ZN12WithMeshClsn15ClearLimMovFlagEv(char *c);\nextern void _ZN5Actor9UpdatePosEP12CylinderClsn(char *self, int p);\nextern void func_020383fc(char *c);\nextern int _ZNK12WithMeshClsn10IsOnGroundEv(char *c);\nextern char *_ZNK12WithMeshClsn14GetFloorResultEv(char *c);\nextern void _ZNK11SurfaceInfo12CopyNormalToER7Vector3(char *p, char *v);\nextern int _ZNK12WithMeshClsn13JustHitGroundEv(char *c);\nextern int _ZN4cstd4fdivEii(int a, int b);\nextern int Vec3_HorzLen(int *v);\nextern short data_02082214[];\n\nint _ZN5Enemy14UpdateYoshiEatER12WithMeshClsn(char *self, char *clsn) {\n int flags;\n int t;\n int v;\n int lim;\n\n flags = *(int *)(self + 0xb0);\n t = flags & 0x40000;\n t = t != 0;\n if (t != false) {\n if (*(char **)(self + 0xd0) == 0) {\n *(int *)(((long long)(int)(self + 0xb0)) & 0xFFFFFFFFFFFFFFFFLL) &= ~0x40000;\n } else {\n char *o = *(char **)(self + 0xd0) + 0x5c;\n *(int *)(self + 0x5c) = *(int *)(int)(((long long)(int)o) & 0xFFFFFFFFFFFFFFFFLL);\n *(int *)(self + 0x60) = *(int *)(o + 4);\n *(int *)(self + 0x64) = *(int *)(o + 8);\n *(int *)(((long long)(int)(self + 0x60)) & 0xFFFFFFFFFFFFFFFFLL) += 0x30000;\n }\n *(unsigned char *)(self + 0x107) = 0;\n return 2;\n }\n t = flags & 0x20000;\n t = t != 0;\n if (t != false) {\n *(unsigned char *)(self + 0x107) = 0;\n return 1;\n }\n t = flags & 0x80000;\n t = t != 0;\n if (t != false || *(unsigned char *)(self + 0x107) != 0) {\n if (*(u16 *)(self + 0x104) != 0)\n *(u16 *)(((long long)(int)(self + 0x104)) & 0xFFFFFFFFFFFFFFFFLL) -= 1;\n t = *(int *)(self + 0xb0) & 0x80000;\n t = t != 0;\n if (t != false) {\n *(unsigned char *)(self + 0x107) = 1;\n *(u16 *)(self + 0x104) = 5;\n *(int *)(((long long)(int)(self + 0xb0)) & 0xFFFFFFFFFFFFFFFFLL) &= ~0x80000;\n if (*(char **)(self + 0xd0) == 0) {\n v = 0x14000;\n } else {\n char *o2 = *(char **)(self + 0xd0) + 0x5c;\n *(int *)(self + 0x5c) = *(int *)(int)(((long long)(int)o2) & 0xFFFFFFFFFFFFFFFFLL);\n *(int *)(self + 0x60) = *(int *)(o2 + 4);\n *(int *)(self + 0x64) = *(int *)(o2 + 8);\n *(int *)(((long long)(int)(self + 0x60)) & 0xFFFFFFFFFFFFFFFFLL) += 0x32000;\n {\n long long rnd = 0x800;\n char *o3 = *(char **)(self + 0xd0);\n u16 ang = *(u16 *)(o3 + 0x8e);\n int idx = (ang >> 4) << 1;\n *(int *)(((long long)(int)(self + 0x5c)) & 0xFFFFFFFFFFFFFFFFLL) =\n (int)(((long long)data_02082214[idx] * 0x32000 + rnd) >> 12) +\n *(int *)(((long long)(int)(self + 0x5c)) & 0xFFFFFFFFFFFFFFFFLL);\n *(int *)(((long long)(int)(self + 0x64)) & 0xFFFFFFFFFFFFFFFFLL) +=\n (int)(((long long)data_02082214[idx + 1] * 0x32000 + rnd) >> 12);\n }\n {\n s16 *p = (s16 *)(*(char **)(self + 0xd0) + 0x8c);\n *(s16 *)(self + 0x92) = *(s16 *)(int)(((long long)(int)p) & 0xFFFFFFFFFFFFFFFFLL);\n *(s16 *)(self + 0x94) = p[1];\n *(s16 *)(self + 0x96) = p[2];\n }\n v = *(int *)(*(char **)(self + 0xd0) + 0x98);\n }\n if (v >= 0x14000)\n *(int *)(self + 0x98) = v + 0xa000;\n else\n *(int *)(self + 0x98) = (int)(((long long)v * 0x800 + 0x800) >> 12) + 0x14000;\n *(int *)(self + 0x98) = (int)(((long long)*(int *)(self + 0x98) * 0x14cc + 0x800) >> 12);\n *(int *)(self + 0xa8) = 0xc000;\n *(int *)(self + 0xd0) = 0;\n }\n lim = _ZNK12WithMeshClsn13GetLimMovFlagEv(clsn);\n _ZN12WithMeshClsn13SetLimMovFlagEv(clsn);\n _ZN5Actor9UpdatePosEP12CylinderClsn(self, 0);\n func_020383fc(clsn);\n if (_ZNK12WithMeshClsn10IsOnGroundEv(clsn) != 0) {\n char *fr = _ZNK12WithMeshClsn14GetFloorResultEv(clsn);\n _ZNK11SurfaceInfo12CopyNormalToER7Vector3(fr + 4, self + 0xd4);\n if (_ZNK12WithMeshClsn13JustHitGroundEv(clsn) == 0) {\n *(int *)(self + 0xa8) = 0;\n *(unsigned char *)(self + 0x107) = 0;\n } else {\n _ZNK11SurfaceInfo12CopyNormalToER7Vector3(fr + 4, self + 0xd4);\n *(int *)(self + 0xa8) =\n _ZN4cstd4fdivEii((*(int *)(self + 0xa8) * -50) / 100, *(int *)(self + 0xd8));\n }\n {\n int *pa = (int *)(int)(((long long)(int)(self + 0xa4)) & 0xFFFFFFFFFFFFFFFFLL);\n *pa += *(int *)(self + 0xd4) << 3;\n *(int *)(((long long)(int)(self + 0xac)) & 0xFFFFFFFFFFFFFFFFLL) += *(int *)(self + 0xdc) << 3;\n *(int *)(self + 0x98) = Vec3_HorzLen(pa);\n }\n }\n *(s16 *)(self + 0x8e) = *(s16 *)(self + 0x94);\n if (lim == 0)\n _ZN12WithMeshClsn15ClearLimMovFlagEv(clsn);\n return 3;\n }\n *(int *)(self + 0xd0) = 0;\n *(int *)(((long long)(int)(self + 0xb0)) & 0xFFFFFFFFFFFFFFFFLL) &= ~0xe0000;\n *(unsigned char *)(self + 0x107) = 0;\n return 0;\n}\n", "source": "fable-subagent", "note": "DIV=2, 241/243 insns byte-exact. Residual is EXACTLY the 6o floor(ordering) 'speculative stall-slot fill' class: at +0x174/+0x17c ROM fills the d0-load delay slot with 'mov r3,#0x800' then 'add r1,r6,#0x5c' (laundered dest base); mwcc invariably hoists the add first. ~10 spellings tried: named rnd (int and long long), constant-first operand order, RHS-first explicit assignment, equal-arm ternary on the address (folds), alternate launder signedness (re-rolls global colors), named ang, m1 temp, statement swaps. decomp-permuter (freshly set up in vendor/, Windows patches applied per tools/permuter/README) ran 7000+ iterations at score 120 without improvement - same as func_ov006_020dac34 in 6o. LOAD-BEARING LEVERS that got here (keep them): guard reads d0 as *(char**) to CSE with the o/o2 pointer inits (type-mismatched *(int*) guard forces a reload); o/o2 = d0+0x5c with PLAIN arithmetic + first deref through u64-launder of o (forces add-first materialization without breaking CSE; laundering o's INIT instead breaks the d0 CSE); p = d0+0x8c same pattern; materialized bools as 'flags & K; t = t != 0; if (t != false)'; laundered RMWs on self+0xb0/0x60/0x5c/0x64/0x104/0xa4/0xac; named laundered pa passed to Vec3_HorzLen (shares the RMW base); explicit '(x * -50) / 100' regenerates the mvn/mul/magic-div; fix12 generic umull+mla from (long long)tbl[i]*0x32000+rnd>>12."} -{"module": "arm9", "addr": "0x02068398", "name": "func_02068398", "size": 120, "target_hex": "00402de904d04de264009fe5001090e5000051e304d08d020000a0030040bd081eff2f01040090e5000050e30300000ab40490e5000050e30000000a0010a0e12c009fe5041080e5270000eb20109fe50220a0e3043091e50100a0e3ac34d3e50e30c1e50c20c1e504d08de20040bde81eff2fe12c9d0a02", "lang": "c", "divergences": 1, "c_source": "/* BEST pure-C under 1.2/sp2p3: size 0x78, divergences=1\n *\n * Residual at +0x38:\n * ROM: beq #8 (skip mov when y==0; r1 keeps sel)\n * CW: moveq r0, r1 (r0 = sel when y==0), then shared mov r1,r0\n *\n * Shape lever: `sel = p ? p : sel` (or `if (p==0) p = sel; sel = p`) forces the\n * always-execute `mov r1,r0` tail and restores size 0x78. The plain\n * `if (p) sel = p` form if-converts to `movne r1,r0` and shrinks to 0x74.\n *\n * Exhausted (2026-07-23, 150+ pure-C variants): c048 multi-pred (+8), loops\n * (while/for/do \u2192 0x80 bottom-test), switch, volatile both arms, //cpp refs,\n * goto-pin 6o, bool locals, sibling if/else keep/take, all known opt pragmas\n * (generateconditionalassignments/peephole/cse/sched/\u2026 inert),\n * #pragma optimization_level 1 emits CLEAN mid `beq; mov r1,r0` but loses\n * predicated early-return + O2+ tail interleave (size 0x7c, many mid/tail\n * diffs). No flag state mixes O1 middle with O4 prologue/tail (notes \u00a76u).\n * Known floor; hand-asm whole-function matches but is disallowed for game logic.\n */\ntypedef unsigned char u8;\nextern u8 data_020a9d2c[];\nextern void func_02068484(void);\n\nint func_02068398(void)\n{\n void *sel = *(void **)data_020a9d2c;\n void *p;\n\n if (sel == 0)\n return 0;\n\n p = *(void **)(data_020a9d2c + 4);\n if (p == 0)\n goto done;\n p = *(void **)((u8 *)p + 0x4b4);\n sel = p ? p : sel;\ndone:\n *(void **)(data_020a9d2c + 4) = sel;\n func_02068484();\n {\n u8 *d = data_020a9d2c;\n void *q = *(void **)(d + 4);\n d[0xe] = *((u8 *)q + 0x4ac);\n d[0xc] = 2;\n }\n return 1;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x78 vs 0x74", "floor": {"class": "cond_opt", "evidence": "6u: single-condition 1-pred beq+mov unreachable under O4,p; ternary size-exact div=1 moveq residual; c048 multi-pred costs +8; 150+ pure-C variants; no HAND-ASM", "date": "2026-07-23"}, "floor_note": "6u single-condition beq+mov unreachable; div=1 moveq residual"} +{"module": "arm9", "addr": "0x02068398", "name": "func_02068398", "size": 120, "target_hex": "00402de904d04de264009fe5001090e5000051e304d08d020000a0030040bd081eff2f01040090e5000050e30300000ab40490e5000050e30000000a0010a0e12c009fe5041080e5270000eb20109fe50220a0e3043091e50100a0e3ac34d3e50e30c1e50c20c1e504d08de20040bde81eff2fe12c9d0a02", "lang": "c", "divergences": 1, "c_source": "/* BEST pure-C under 1.2/sp2p3: size 0x78, divergences=1\n *\n * Residual at +0x38:\n * ROM: beq #8 (skip mov when y==0; r1 keeps sel)\n * CW: moveq r0, r1 (r0 = sel when y==0), then shared mov r1,r0\n *\n * Shape lever: `sel = p ? p : sel` (or `if (p==0) p = sel; sel = p`) forces the\n * always-execute `mov r1,r0` tail and restores size 0x78. The plain\n * `if (p) sel = p` form if-converts to `movne r1,r0` and shrinks to 0x74.\n *\n * Exhausted (2026-07-23, 150+ pure-C variants): c048 multi-pred (+8), loops\n * (while/for/do → 0x80 bottom-test), switch, volatile both arms, //cpp refs,\n * goto-pin 6o, bool locals, sibling if/else keep/take, all known opt pragmas\n * (generateconditionalassignments/peephole/cse/sched/… inert),\n * #pragma optimization_level 1 emits CLEAN mid `beq; mov r1,r0` but loses\n * predicated early-return + O2+ tail interleave (size 0x7c, many mid/tail\n * diffs). No flag state mixes O1 middle with O4 prologue/tail (notes §6u).\n * Known floor; hand-asm whole-function matches but is disallowed for game logic.\n */\ntypedef unsigned char u8;\nextern u8 data_020a9d2c[];\nextern void func_02068484(void);\n\nint func_02068398(void)\n{\n void *sel = *(void **)data_020a9d2c;\n void *p;\n\n if (sel == 0)\n return 0;\n\n p = *(void **)(data_020a9d2c + 4);\n if (p == 0)\n goto done;\n p = *(void **)((u8 *)p + 0x4b4);\n sel = p ? p : sel;\ndone:\n *(void **)(data_020a9d2c + 4) = sel;\n func_02068484();\n {\n u8 *d = data_020a9d2c;\n void *q = *(void **)(d + 4);\n d[0xe] = *((u8 *)q + 0x4ac);\n d[0xc] = 2;\n }\n return 1;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x78 vs 0x74", "floor": {"class": "cond_opt", "evidence": "6u: single-condition 1-pred beq+mov unreachable under O4,p; ternary size-exact div=1 moveq residual; c048 multi-pred costs +8; 150+ pure-C variants; no HAND-ASM", "date": "2026-07-23"}, "floor_note": "6u single-condition beq+mov unreachable; div=1 moveq residual"} {"module": "arm9", "addr": "0x02022328", "name": "_ZN8Particle17CheckLavaCallback14SpawnParticlesERNS_6SystemE", "size": 240, "target_hex": "f04f2de95cd04de20140a0e1c10000eb08a094e500005ae35cd08d02f04fbd081eff2f0120b08de20c608de200508de20040a0e318709ae50c309ae514c09ae508909ae51c209ae510109ae50600a0e1038087e009908ce0017082e0795400eb8801a0e14bc980e28981a0e18731a0e10600a0e10510a0e10420a0e100808de504c08de508308de5355400eb0600a0e1e15a00eb000050e30300000a0b00a0e19a5600eb010050e30200000abc02dae1be02cae1050000ea50109de50c009ae5071a81e2c111a0e1000041e018008ae50600a0e14c5400eb00a09ae500005ae3d3ffff1a5cd08de2f04fbde81eff2fe1", "lang": "cpp", "divergences": 2, "c_source": "//cpp\nstruct Vector3 { int x, y, z; Vector3(int a,int b,int c):x(a),y(b),z(c){} Vector3(){} };\nstruct Actor;\n\nstruct RaycastGround {\n char pad0[0x14];\n unsigned int sub[(0x50 - 0x14) / 4];\n RaycastGround();\n ~RaycastGround();\n void SetObjAndPos(const Vector3 &pos, Actor *obj);\n int DetectClsn();\n};\n\nstruct Node {\n Node *next;\n char p4[4];\n int f8;\n int fc;\n int f10;\n int f14;\n int f18;\n int f1c;\n char p20[0x2c - 0x20];\n unsigned short f2c;\n unsigned short f2e;\n};\n\nstruct System;\n\nextern \"C\" int func_02037e38(unsigned int *p);\n\nnamespace Particle {\nstruct System {};\nstruct SimpleCallback { void SpawnParticles(System &sys); };\nstruct CheckLavaCallback : SimpleCallback { void SpawnParticles(System &sys); };\n\nvoid CheckLavaCallback::SpawnParticles(System &sys)\n{\n SimpleCallback::SpawnParticles(sys);\n\n for (Node *n = *(Node **)((char *)&sys + 8); n != 0; n = n->next) {\n int sx = n->f14 + n->f8;\n int sy = n->f18 + n->fc;\n int sz = n->f1c + n->f10;\n RaycastGround rg;\n Vector3 v;\n v.y = (sy << 3) + 0x12c000;\n v.x = sx << 3;\n v.z = sz << 3;\n rg.SetObjAndPos(v, 0);\n if (rg.DetectClsn() == 0)\n goto Lac;\n if (func_02037e38(rg.sub) != 1) {\n Lac:\n n->f2e = n->f2c;\n } else {\n n->f18 = ((int)rg.sub[12] + 0x7000 >> 3) - n->fc;\n }\n }\n}\n}\n", "source": "fanout"} {"module": "arm9", "addr": "0x02021024", "name": "_ZN3OAM6RenderEbP7OamAttriiii5Fix12IiEi", "size": 1152, "target_hex": "f04f2de91cd04de201a0a0e100208de504308de5000050e348909de54c809de50300000a2c049fe50000d0e5010050e30b00001a20b49fe500209be5800052e31cd08da20000a0a3f04fbda81eff2fa108149fe508049fe5826181e008008de50a0000eafcb39fe500209be5800052e31cd08da20000a0a3f04fbda81eff2fa1e4139fe5e4039fe5826181e008008de500009ae500109ae58003a0e1a05ba0e10108a0e1010c55e3200fa0e1211fa0e1025c45a2d040dae127feffeb00109ae50070a0e10108a0e1200fa0e1211fa0e11cfeffeb000058e31600000a0818a0e14118a0e10118a0e12118a0e14112a0e18130a0e178239fe58310a0e1f1c092e1011083e28110a0e1f13092e1c02084e0c75085e0950301e0950c04e0924323e0920c04e0041041e04116a0e1c75041e04316a0e1c04041e0010a59e30100001a000058e30700000a00109ae5011ba0e1211fa0e1010051e3c7504510c04044108770a0118000a01100109de5000058e3015085e004109de5014084e01100000a000057e10070a0b1070095e00100004a010c55e3030000da1cd08de20000a0e3f04fbde81eff2fe1070094e00100004ac00054e3130000da1cd08de20000a0e3f04fbde81eff2fe1071095e00100004a010c55e3030000da1cd08de20000a0e3f04fbde81eff2fe1000094e00100004ac00054e3030000da1cd08de20000a0e3f04fbde81eff2fe140109de50000e0e3000051e104009a0544109de50008a001200ea00140008d050000e0e3000051e104009a05000aa001200fa00144008d05010a59e30100001a000058e33200000a4802a0e18000a0e1012080e210129fe58000a0e18220a0e1f22091e1f00091e1920903e0900901e0020b81e24006a0e1021b83e24126a0e1001060e20c208de514108de518208de510008de500009ae5010210e20000621210108d150c008d1500009ae5020210e20500000a14109de518009de5001061e2000060e214108de518008de500009be508109de50c208de2800146e05dfdffeb0010e0e3010050e11cd08d020000a003f04fbd081eff2f0100109ae5011ba0e1211fa0e1010051e3019ca003039ca013020000ea00109ae50000a0e3039201e200c09ae504109ae540319fe5011ba0e10c29a0e18c79a0e10c8aa0e1010c59e3211ba0e1a22fa0e103300ce0a77fa0e1288fa0e10100000a030c59e31900001a030058e30a00001aff2004e2800c82e1082580e1f8009fe5072682e1004005e0020083e1040880e1000089e1000086e5220000ea800ca0e1ff4004e2820680e1000084e1082580e1c4009fe5072682e1004005e0020083e1040880e1000089e1000086e5150000ea030058e30900001aff0004e2082580e194009fe5072682e1004005e0020083e1040880e1000089e1000086e5090000eaff0004e2820680e1082580e168009fe5072682e1004005e0020083e1040880e1000089e1000086e544009de540209de5000581e1020680e1b400c6e100109be50600a0e1011081e200108be51cd08de2f04fbde81eff2fe160e6090264e6090274e6090268e6090270e6090274ea09026ce609021422080200c000c0ff010000", "lang": "c", "divergences": 2, "c_source": "\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\ntypedef struct OamAttr\n{\n u32 yb : 8;\n u32 objMode : 2;\n u32 rest : 6;\n u32 xc : 9;\n u32 hi : 7;\n u32 tile : 10;\n u32 prio : 2;\n u32 pal : 4;\n u32 hi2 : 16;\n} OamAttr;\ntypedef struct Matrix2x2\n{\n s32 m00;\n s32 m01;\n s32 m10;\n s32 m11;\n} Matrix2x2;\nextern int _ZN3OAM11GetObjWidthEii(int shape, int size);\nextern int _ZN3OAM12GetObjHeightEii(int shape, int size);\nextern int _ZN3OAM16LoadAffineParamsEP7OamAttrPiP9Matrix2x2(OamAttr *attr, int *count, Matrix2x2 *mtx);\nextern u8 data_0209e660;\nextern int data_0209e664;\nextern int data_0209e668;\nextern int data_0209e66c;\nextern int data_0209e670;\nextern OamAttr data_0209e674[];\nextern OamAttr data_0209ea74[];\nextern s16 data_02082214[];\nOamAttr *_ZN3OAM6RenderEbP7OamAttriiii5Fix12IiEi(int draw, OamAttr *obj, int px, int py, int pal, int prio, int scale0, int rot0)\n{\n int *counter;\n int *affctr;\n int cnt;\n int h;\n int idx;\n int scale;\n int rot;\n int w;\n OamAttr *res;\n int x;\n int y;\n OamAttr *new_var;\n Matrix2x2 mtx;\n scale = scale0;\n rot = rot0;\n if ((!draw) || (data_0209e660 == 1))\n {\n counter = &data_0209e664;\n cnt = *counter;\n if (cnt >= 0x80)\n {\n return 0;\n }\n res = &data_0209e674[cnt];\n affctr = &data_0209e668;\n }\n else\n {\n counter = &data_0209e670;\n cnt = *counter;\n if (cnt >= 0x80)\n {\n return 0;\n }\n res = &data_0209ea74[cnt];\n affctr = &data_0209e66c;\n }\n x = obj->xc;\n if (x >= 0x100)\n {\n x -= 0x200;\n }\n y = *((s8 *) obj);\n w = _ZN3OAM11GetObjWidthEii(((*((u32 *) obj)) << 16) >> 30, (*((u32 *) obj)) >> 30);\n h = _ZN3OAM12GetObjHeightEii(((*((u32 *) obj)) << 16) >> 30, (*((u32 *) obj)) >> 30);\n if (rot != 0)\n {\n int sy;\n int sx;\n int c;\n int s;\n int i;\n i = (((u16) ((s16) rot)) >> 4) * 2;\n s = data_02082214[i];\n c = data_02082214[i + 1];\n sy = y + (h >> 1);\n sx = x + (w >> 1);\n x = (((sx * c) - (sy * s)) >> 12) - (w >> 1);\n y = (((sy * c) + (sx * s)) >> 12) - (h >> 1);\n }\n if ((scale != 0x1000) || (rot != 0))\n {\n if (obj->objMode != 1)\n {\n x -= w >> 1;\n y -= h >> 1;\n w <<= 1;\n h <<= 1;\n }\n }\n x += px;\n y += py;\n if (rot != 0)\n {\n if (w < h)\n {\n w = h;\n }\n if (((x + w) < 0) || (x > 0x100))\n {\n return 0;\n }\n if (((y + w) < 0) || (y > 0xc0))\n {\n return 0;\n }\n }\n else\n {\n if (((x + w) < 0) || (x > 0x100))\n {\n return 0;\n }\n if (((y + h) < 0) || (y > 0xc0))\n {\n return 0;\n }\n }\n if (pal == (-1))\n {\n pal = obj->pal;\n }\n if (prio == (-1))\n {\n prio = obj->prio;\n }\n {\n u32 flags;\n if ((scale != 0x1000) || (rot != 0))\n {\n int i = (rot >> 4) * 2;\n int s = data_02082214[i];\n int c = data_02082214[i + 1];\n int cs = ((c * scale) + 0x800) >> 12;\n int ss = ((s * scale) + 0x800) >> 12;\n mtx.m00 = cs;\n mtx.m10 = -ss;\n mtx.m11 = cs;\n mtx.m01 = ss;\n if ((*((u32 *) obj)) & 0x10000000)\n {\n mtx.m01 = -ss;\n mtx.m00 = -cs;\n }\n if ((*((u32 *) obj)) & 0x20000000)\n {\n mtx.m10 = -mtx.m10;\n mtx.m11 = -mtx.m11;\n }\n new_var = res - (*counter);\n idx = _ZN3OAM16LoadAffineParamsEP7OamAttrPiP9Matrix2x2(new_var, affctr, &mtx);\n if (idx == (-1))\n {\n return 0;\n }\n if (obj->objMode == 1)\n {\n flags = 0x100;\n }\n else\n {\n flags = 0x300;\n }\n }\n else\n {\n idx = 0;\n flags = (*((u32 *) obj)) & 0x30000000;\n }\n {\n u32 mode;\n u32 mosaic;\n u32 mask;\n u32 dep;\n u32 tiles;\n tiles = obj->tile;\n {\n u32 t0 = *((u32 *) obj);\n mask = 0xc000c000;\n mask = t0 & mask;\n dep = (t0 << 18) >> 31;\n mosaic = (t0 << 19) >> 31;\n mode = (t0 << 20) >> 30;\n }\n if ((flags == 0x100) || (flags == 0x300))\n {\n if (mode == 3)\n {\n *((u32 *) res) = flags | ((mask | ((((y & 0xff) | (idx << 25)) | (mode << 10)) | (mosaic << 12))) | ((x & 0x1ff) << 16));\n }\n else\n {\n *((u32 *) res) = flags | ((mask | ((((y & 0xff) | ((idx << 25) | (dep << 13))) | (mode << 10)) | (mosaic << 12))) | ((x & 0x1ff) << 16));\n }\n }\n else\n if (mode == 3)\n {\n *((u32 *) res) = flags | ((mask | (((y & 0xff) | (mode << 10)) | (mosaic << 12))) | ((x & 0x1ff) << 16));\n }\n else\n {\n *((u32 *) res) = flags | ((mask | ((((y & 0xff) | (dep << 13)) | (mode << 10)) | (mosaic << 12))) | ((x & 0x1ff) << 16));\n }\n *((u16 *) (((u32 *) res) + 1)) = (tiles | (prio << 10)) | (pal << 12);\n }\n }\n *counter += 1;\n return res;\n}\n", "source": "permuter-improved"} {"module": "arm9", "addr": "0x02020994", "name": "_ZN3OAM6RenderEbP7OamAttriiii5Fix12IiES3_ii", "size": 1680, "target_hex": "f04f2de95cd04de2000050e380009de501a0a0e180008de584009de500208de584008de590009de504308de590008de594009de588909de58cb09de594008de50300000a18069fe50000d0e5010050e30700001a0c069fe50c269fe5001090e510008de504069fe5817182e014008de5060000eaf8059fe5f8259fe5001090e510008de5f0059fe5817182e014008de590009de50008a0e14008a0e10008a0e12008a0e14002a0e18000a0e118008de590009de54002a0e18000a0e120008de518009de5010080e21c008de50000a0e344008de5030ca0e340008de5010ca0e33c008de510009de5000090e5800050e35cd08da2f04fbda81eff2fa100009ae500109ae58003a0e1a06ba0e10108a0e1010c56e3200fa0e1211fa0e1026c46a2d050dae1b0ffffeb00109ae50080a0e10108a0e1200fa0e1211fa0e1a5ffffeb0040a0e1010a59e30400001a010a5be30200001a90009de5000050e35500000ac80086e00066a0e1c40085e00056a0e1c800a0e124008de5c400a0e1010a59e328008de50300000a0600a0e10910a0e1cbc900eb0060a0e1010a5be30300000a0500a0e10b10a0e1c5c900eb0050a0e190009de5000050e32d00000a18009de58010a0e1b4049fe5f11090e11c009de58020a0e1a4049fe59135cee0f20090e1022ba0e390c5c5e030508de52cc08de590c6c5e09166c0e038008de502009ce00010a5e22006a0e1023093e0010a80e10010aee22336a0e1013a83e1030040e04016a0e124009de534608de5006041e02c009de5025090e030009de50030a0e234009de5021090e038009de52526a0e10000a0e22116a0e1032a82e1001a81e1010082e04016a0e128009de5005041e0050000ea24009de54616a0e1006041e028009de54516a0e1005041e000009ae5000ba0e1200fa0e1010050e30500000a24009de58880a0e1006046e028009de58440a0e1005045e090009de5000050e300009de5006086e004009de5005085e01900000a040058e10480a0b1080096e00100004a010c56e3070000dab610dae18c039fe5000051e15cd08d02f04fbd081eff2f0108a08ae275ffffea080095e00100004ac00055e31f0000dab610dae15c039fe5000051e15cd08d02f04fbd081eff2f0108a08ae269ffffea080096e00100004a010c56e3070000dab610dae12c039fe5000051e15cd08d02f04fbd081eff2f0108a08ae25dffffea040095e00100004ac00055e3070000dab610dae1fc029fe5000051e15cd08d02f04fbd081eff2f0108a08ae251ffffea80009de50010e0e3010050e104009a050010e0e30008a001200ea0010c008d050c008d1584009de5010050e104009a05000aa001200fa00108008d0508008d1594009de5000050e30040a0c100009ad5000aa0d1204fa0d1010a59e30400001a010a5be30200001a90009de5000050e34000000a20009de5010080e28010a0e15c029fe5f10090e120109de5900b03e08120a0e148129fe5f21091e1900902e0020b83e24006a0e154008de5910900e0910b03e0022b82e2020b80e2021b83e24226a0e14006a0e14116a0e1001061e248208de54c008de550108de500109ae5011211e2001062120000601248108d154c008d1500009ae5020210e20500000a50109de554009de5001061e250108de5000060e254008de510009de514109de5000090e548208de2800147e088feffeb0010e0e3010050e10700001ab610dae1a0019fe5000051e15cd08d02f04fbd081eff2f0108a08ae2fafeffea00109ae5011ba0e1211fa0e1010051e33cc09d0540c09d15020000ea00109ae544009de503c201e204209ae500109ae558319fe5022ba0e122eba0e10129a0e1033001e08119a0e1010c5ce3a22fa0e1a18fa0e10100000a030c5ce31900001a030054e30a00001aff2005e2800c82e11c119fe5040580e1080680e1011006e0000083e1010880e100008ce1000087e5220000ea800ca0e1ff5005e2820680e1000085e1e8109fe5040580e1080680e1011006e0000083e1010880e100008ce1000087e5150000ea030054e30900001aff1005e2b8009fe5041581e1081681e1000006e0011083e1000881e100008ce1000087e5090000eaff1005e2821681e18c009fe5041581e1081681e1000006e0011083e1000881e100008ce1000087e508009de500158ee10c009de5000681e1b400c7e110009de5087087e2000090e5011080e210009de5001080e5b610dae134009fe5000051e108a08a12a2feff1a5cd08de2f04fbde81eff2fe160e6090264e6090274e6090268e6090270e6090274ea09026ce6090214220802ffff000000c000c0ff010000", "lang": "cpp", "divergences": 2, "c_source": "//cpp\n#pragma opt_common_subs off\n#pragma opt_propagation off\n#pragma opt_loop_invariants off\n\ntypedef signed char s8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\ntypedef unsigned char u8;\ntypedef long long s64;\n\ntemplate struct Fix12 { T val; };\n\nstruct OamAttr { u32 a01; u16 a2; u16 a3; };\nstruct OamEntry { u32 a01; u16 a2; u16 pad; };\nstruct Matrix2x2 { int a, b, c, d; };\n\nextern \"C\" {\nextern u8 data_0209e660;\nextern int data_0209e664;\nextern int data_0209e668;\nextern int data_0209e66c;\nextern int data_0209e670;\nextern OamEntry data_0209e674[];\nextern OamEntry data_0209ea74[];\nextern s16 data_02082214[];\n}\n\nstruct OAM {\n static void Render(bool sub, OamAttr *attr, int xOff, int yOff, int palette, int priority,\n Fix12 scaleX, Fix12 scaleY, int rotation, int mode);\n static u8 GetObjWidth(int shape, int size);\n static u8 GetObjHeight(int shape, int size);\n static int LoadAffineParams(OamAttr *attr, int *affCnt, Matrix2x2 *m);\n};\n\nnamespace cstd { int fdiv(int num, int den); }\n\nvoid OAM::Render(bool sub, OamAttr *attr, int xOff, int yOff, int palette, int priority,\n Fix12 scaleX, Fix12 scaleY, int rotation, int mode)\n{\n int priVal;\n int palVal;\n int *pCount;\n int *pAff;\n int sinIdx;\n int cosIdx;\n int mtxIdx;\n int halfW;\n int halfH;\n s64 tcy;\n s64 tsx;\n s64 tsy;\n s64 tcx;\n int c100;\n int c300;\n int zero;\n Matrix2x2 m;\n int y;\n int sxv;\n int w;\n int syv;\n OamEntry *dst;\n int x;\n int om;\n\n sxv = scaleX.val;\n syv = scaleY.val;\n\n if (!sub || data_0209e660 == 1) {\n pCount = &data_0209e664;\n dst = data_0209e674 + *pCount;\n pAff = &data_0209e668;\n } else {\n pCount = &data_0209e670;\n dst = data_0209ea74 + *pCount;\n pAff = &data_0209e66c;\n }\n\n sinIdx = ((u16)(s16)rotation >> 4) * 2;\n mtxIdx = (rotation >> 4) * 2;\n cosIdx = sinIdx + 1;\n zero = 0;\n c300 = 0x300;\n c100 = 0x100;\n\n while (1) {\n if (*pCount >= 0x80)\n return;\n\n {\n int t = (int)((attr->a01 << 7) >> 23);\n s8 u;\n if (t >= 0x100)\n t -= 0x200;\n x = t;\n u = *(s8 *)attr;\n {\n u32 a = attr->a01;\n w = GetObjWidth((int)((a << 16) >> 30), (int)(a >> 30));\n }\n {\n int h;\n {\n u32 a = attr->a01;\n h = GetObjHeight((int)((a << 16) >> 30), (int)(a >> 30));\n }\n y = u;\n\n if (sxv != 0x1000 || syv != 0x1000 || rotation != 0) {\n x = (x + (w >> 1)) << 12;\n y = (y + (h >> 1)) << 12;\n halfW = w >> 1;\n halfH = h >> 1;\n if (sxv != 0x1000)\n x = cstd::fdiv(x, sxv);\n if (syv != 0x1000)\n y = cstd::fdiv(y, syv);\n if (rotation != 0) {\n s16 s, c;\n s = data_02082214[sinIdx];\n c = data_02082214[cosIdx];\n tcy = (s64)c * y;\n tcx = (s64)c * x;\n tsy = (s64)s * y;\n tsx = (s64)s * x;\n x = (((int)((tcx + 0x800) >> 12) - (int)((tsy + 0x800) >> 12)) >> 12) - halfW;\n y = (((int)((tcy + 0x800) >> 12) + (int)((tsx + 0x800) >> 12)) >> 12) - halfH;\n } else {\n x = (x >> 12) - halfW;\n y = (y >> 12) - halfH;\n }\n if (((attr->a01 << 22) >> 30) != 1) {\n w <<= 1;\n x -= halfW;\n h <<= 1;\n y -= halfH;\n }\n }\n\n x += xOff;\n y += yOff;\n\n if (rotation != 0) {\n if (w < h)\n w = h;\n if (x + w < 0 || x > 0x100) {\n if (attr->a3 == 0xffff) return;\n attr++;\n continue;\n }\n if (y + w < 0 || y > 0xc0) {\n if (attr->a3 == 0xffff) return;\n attr++;\n continue;\n }\n } else {\n if (x + w < 0 || x > 0x100) {\n if (attr->a3 == 0xffff) return;\n attr++;\n continue;\n }\n if (y + h < 0 || y > 0xc0) {\n if (attr->a3 == 0xffff) return;\n attr++;\n continue;\n }\n }\n\n }\n }\n if (palette == -1)\n palVal = (int)((*(u32 *)&attr->a2 << 16) >> 28);\n else\n palVal = palette;\n if (priority == -1)\n priVal = (int)((*(u32 *)&attr->a2 << 20) >> 30);\n else\n priVal = priority;\n if (mode > 0)\n om = mode;\n else\n om = (int)((attr->a01 << 20) >> 30);\n\n {\n int aff;\n u32 ipVal;\n if (sxv != 0x1000 || syv != 0x1000 || rotation != 0) {\n s16 c2 = data_02082214[mtxIdx + 1];\n m.a = (c2 * sxv + 0x800) >> 12;\n {\n s16 s2 = data_02082214[mtxIdx];\n m.b = (s2 * sxv + 0x800) >> 12;\n m.c = -((s2 * syv + 0x800) >> 12);\n }\n m.d = (c2 * syv + 0x800) >> 12;\n if (attr->a01 & 0x10000000) {\n m.a = -m.a;\n m.b = -m.b;\n }\n if (attr->a01 & 0x20000000) {\n m.c = -m.c;\n m.d = -m.d;\n }\n aff = LoadAffineParams((OamAttr *)(dst - *pCount), pAff, &m);\n if (aff == -1) {\n if (attr->a3 == 0xffff) return;\n attr++;\n continue;\n }\n ipVal = (((attr->a01 << 22) >> 30) == 1) ? *(int *)&c100 : *(int *)&c300;\n } else {\n ipVal = attr->a01 & 0x30000000;\n aff = *(int *)&zero;\n }\n {\n u32 a23 = *(u32 *)&attr->a2;\n u32 a01 = attr->a01;\n u32 tile, bit13, maskbits;\n tile = a23 << 22;\n tile = tile >> 22;\n w = (int)((a01 << 18) >> 31);\n maskbits = a01 & 0xc000c000;\n bit13 = (a01 << 19) >> 31;\n if (ipVal == 0x100 || ipVal == 0x300) {\n if (om == 3)\n dst->a01 = ipVal | ((maskbits | ((y & 0xff) | (aff << 25) | (om << 10) | (bit13 << 12))) | ((x & 0x1ff) << 16));\n else\n dst->a01 = ipVal | ((maskbits | ((y & 0xff) | ((aff << 25) | (w << 13)) | (om << 10) | (bit13 << 12))) | ((x & 0x1ff) << 16));\n } else if (om == 3)\n dst->a01 = ipVal | ((maskbits | ((y & 0xff) | (om << 10) | (bit13 << 12))) | ((x & 0x1ff) << 16));\n else\n dst->a01 = ipVal | ((maskbits | ((y & 0xff) | (w << 13) | (om << 10) | (bit13 << 12))) | ((x & 0x1ff) << 16));\n dst->a2 = (u16)((tile | (priVal << 10)) | (palVal << 12));\n }\n }\n dst++;\n *pCount = *pCount + 1;\n if (attr->a3 == 0xffff) return;\n attr++;\n }\n}\n", "source": "fable-refine-20260720", "floor": {"class": "instruction reorder", "evidence": "Residual 2 words at +0x38/+0x3c: pure adjacent transposition of prologue ARG HOMING -- ROM 'ldr fp,[sp,#0x8c]' (scaleY home) then 'str r0,[sp,#0x94]' (mode re-home store); ours swapped. ~16 distinct source spellings across 4 agents all leave the mode home-store before the scaleY->fp home load: 5 placements gave BYTE-IDENTICAL output; comma-serialized reads, reversed comma, decl swaps, assignment relocation before/after the pCount if-else and sinIdx block, first-reference split both directions, early dead 'om = mode' (DSE'd before it can influence homing). Direct 'scaleX.val' use at the use site and Fix12-struct locals both REGRESS to 52. Decl order reaches the region (a decl swap scores 15) but rotates REGISTERS rather than reordering the store. Non-POD Fix12 ruled out: matched corpus contains only 'template struct Fix12 { T v; }'. Sibling overload _ZN3OAM6RenderEbP7OamAttriiii5Fix12IiEi has a DIFFERENT div-2 residual (mid-body +0x34c), so this is not TU-wide. Compiler-internal homing order; route to hand-analysis or a structurally different body derivation.", "date": "2026-07-20"}} @@ -145,7 +145,7 @@ {"module": "ov063", "addr": "0x0211ab68", "name": "func_ov063_0211ab68", "size": 408, "target_hex": "f04f2de92cd04de260119fe500a0a0e1000091e5010010e21f00001a50019fe50040a0e3323aa0e348119fe548219fe5004080e5043080e5084080e58c61fdeb38019fe5d23aa0e3003080e56e1aa0e3041080e51c119fe524219fe5083080e58361fdebd21aa0e318019fe5003061e2003080e5461aa0e3041080e5f4109fe504219fe5083080e57961fdebdc009fe5001090e5011081e3001080e59ce2fbeb0f0050e30400002a0a00a0e102a3fceb2cd08de2f04fbde81eff2fe1b0809fe50090a0e31c708de2c0b09fe55c608ae20050e0e3d140a0e30700a0e10610a0e10820a0e1bb89fceb1c109de520009de510108de524109de514008de518108de5f219dae10b00a0e1b810cde1f419dae1ba10cde1f619dae1bc10cde14183fceb2008a0e1ba00cde1050c8ae2d02dd0e15c109fe50400a0e100208de510208de208308de204508de55dd8fbeb019089e20c8088e2030059e3deffffba0a00a0e1d5a2fceb2cd08de2f04fbde81eff2fe1c0ed110274ee1102c072000220ee110280ee1102fced11028cee110208ee110250e60902f6ff0000", "lang": "c", "divergences": 14, "c_source": "typedef unsigned char u8;\ntypedef unsigned int u32;\ntypedef signed short s16;\ntypedef signed char s8;\n\nstruct Vec3 { int x, y, z; };\nstruct Vec3_16 { s16 x, y, z; };\n\nextern int data_ov063_0211edc0;\nextern struct Vec3 data_ov063_0211ee74;\nextern struct Vec3 data_ov063_0211ee80;\nextern struct Vec3 data_ov063_0211ee8c;\nextern void* data_ov063_0211ee20;\nextern void* data_ov063_0211edfc;\nextern void* data_ov063_0211ee08;\nextern int data_0209e650;\nextern void func_020072c0(void);\n\nextern void func_020731dc(struct Vec3* a, void (*b)(void), void** node);\nextern u8 NumStars(void);\nextern void MarkForDestruction(char* o);\nextern void Vec3_Add(struct Vec3* out, struct Vec3* a, struct Vec3* b);\nextern int RandomIntInternal(int* seed);\nextern void Actor_Spawn(u32 id, u32 param, struct Vec3* pos, struct Vec3_16* rot, int a, int b);\n\nvoid func_ov063_0211ab68(char* obj) {\n struct Vec3 pos;\n struct Vec3 tmp;\n struct Vec3_16 rot;\n int i;\n\n if (!(data_ov063_0211edc0 & 1)) {\n data_ov063_0211ee74.x = 0;\n data_ov063_0211ee74.y = 0x32000;\n data_ov063_0211ee74.z = 0;\n func_020731dc(&data_ov063_0211ee74, func_020072c0, &data_ov063_0211ee20);\n \n data_ov063_0211ee80.x = 0xd2000;\n data_ov063_0211ee80.z = 0xd2000;\n data_ov063_0211ee80.y = 0x6e000;\n func_020731dc(&data_ov063_0211ee80, func_020072c0, &data_ov063_0211edfc);\n\n data_ov063_0211ee8c.y = 0x46000;\n data_ov063_0211ee8c.x = -0xd2000;\n data_ov063_0211ee8c.z = -0xd2000;\n func_020731dc(&data_ov063_0211ee8c, func_020072c0, &data_ov063_0211ee08);\n data_ov063_0211edc0 |= 1;\n }\n\n if (NumStars() < 15) {\n MarkForDestruction(obj);\n return;\n }\n\n for (i = 0; i < 3; i++) {\n Vec3_Add(&tmp, (struct Vec3*)(obj + 0x5c), &(&data_ov063_0211ee74)[i]);\n pos.x = tmp.x;\n pos.y = tmp.y;\n pos.z = tmp.z;\n rot.x = *(s16*)(obj + 0x92);\n rot.y = *(s16*)(obj + 0x94);\n rot.z = *(s16*)(obj + 0x96);\n rot.y = (u32)RandomIntInternal(&data_0209e650) >> 16;\n Actor_Spawn(0xd1, 0xfff6, &pos, &rot, *(s8*)(obj + 0x5d0), -1);\n }\n MarkForDestruction(obj);\n}\n", "source": "fanout-glm-5.2"} {"module": "ov002", "addr": "0x020f34bc", "name": "func_ov002_020f34bc", "size": 296, "target_hex": "30402de904d04de23020a0e391020ee0051d80e20e2091e7513f80e2062b42e20e2081e70e2093e7525f80e2062b42e20e2083e70e2095e7534f80e2062b82e20e2085e70e2094e70ec081e0062b82e20e2084e70e1091e70e2085e0020751e30e1084e00247a0d30e3083e000408cd5004093e50050a0e3560a54e3564aa0d3004083d5004092e53f0954e33f49a0a3004082a5004091e52f0954e32f49a0a3015085a2004081a5000055e368409f15044080100e00d417010080120e00c417003093e500409ce5000092e54426a0e1004091e50224a0e14016a0e14336a0e10304a0e144c6a0e1ff2c02e2ff1001e2014082e124309fe5ff2c00e2ff100ce21c009fe5b040c3e1011082e1b010c0e104d08de23040bde81eff2fe15e0100004210000446100004", "lang": "c", "divergences": 14, "c_source": "void func_ov002_020f34bc(unsigned char *s, int idx)\n{\n int k = idx * 0x30;\n int flag;\n int a, b, c, d;\n *(int *)(s + 0x140 + k) -= 0x1800;\n *(int *)(s + 0x144 + k) -= 0x1800;\n *(int *)(s + 0x148 + k) += 0x1800;\n *(int *)(s + 0x14c + k) += 0x1800;\n flag = 0;\n if (*(int *)(s + 0x140 + k) <= 0x80000) *(int *)(s + 0x140 + k) = 0x80000;\n if (*(int *)(s + 0x144 + k) <= 0x56000) *(int *)(s + 0x144 + k) = 0x56000;\n if (*(int *)(s + 0x148 + k) >= 0xfc000) *(int *)(s + 0x148 + k) = 0xfc000;\n if (*(int *)(s + 0x14c + k) >= 0xbc000) { *(int *)(s + 0x14c + k) = 0xbc000; flag++; }\n if (flag != 0) (*(unsigned char *)(s + 0x15e + k))++;\n a = *(int *)(s + 0x144 + k);\n b = *(int *)(s + 0x140 + k);\n c = *(int *)(s + 0x148 + k);\n d = *(int *)(s + 0x14c + k);\n *(unsigned short *)0x4001042 = (((b >> 12) << 8) & 0xff00) | ((c >> 12) & 0xff);\n *(unsigned short *)0x4001046 = (((a >> 12) << 8) & 0xff00) | ((d >> 12) & 0xff);\n}\n", "source": "fanout-glm-5.2"} {"module": "arm9", "addr": "0x020341a8", "name": "func_020341a8", "size": 432, "target_hex": "f0402de904d04de27c219fe57c319fe5f050d2e1006093e574219fe574319fe574419fe5857186e0007084e5002092e5003093e50070a0e1042092e5283083e2850196e7023083e050219fe5003083e00100a0e30160a0e1003082e5b2f6ffeb3c119fe58621a0e10040d1e534019fe5042042e00f2002e2c220a0e10020c0e50000d0e5000084e00000c1e50000d1e5071080e24101a0e1a00e81e0c001a0e10053a0e1228300ebfc109fe50020a0e300208de5013980e20010d1e50520a0e100009de5811283e0819800ebc88300ebcc109fe5870080e00020d1e5073084e24311a0e1a11e83e0073082e2c11146e04321a0e18117a0e1a22e83e02118a0e1c221a0e1000052e3814080e00050a0e30c0000da90009fe50000d0e5023c80e2021083e08500a0e1b03084e1850084e0015085e2b014c0e1020055e1013083e2011081e2f6ffffba0000a0e36af5ffeb4c009fe550109fe50000d0e50030d1e5072080e24201a0e1a00e82e0c001a0e18000a0e1ff0000e2000083e00000c1e504d08de2f040bde81eff2fe1e8fc090208fd0902f8fc090214fd090200fd09020cfd090288fc09027cfc090278fc0902", "lang": "cpp", "divergences": 14, "c_source": "//cpp\nextern \"C\" {\ntypedef unsigned char u8;\nextern short data_0209fce8;\nextern int data_0209fd08;\nextern int *data_0209fcf8;\nextern int data_0209fd14;\nextern int data_0209fd00;\nextern int data_0209fd0c;\nextern u8 data_0209fc88;\nextern u8 data_0209fc7c;\nextern u8 data_0209fc78;\nextern int _ZN3G2S13GetBG0CharPtrEv(void);\nextern int _ZN3G2S12GetBG0ScrPtrEv(void);\nextern void MultiStore_Int(int val, int dst, int len);\nextern void func_02031cd4(int a);\nextern void func_020318a4(int a);\n\nvoid func_020341a8(int a0, int a1) {\n volatile int li;\n int n, i, off, oldc;\n short *scr;\n int count;\n int idx = data_0209fce8;\n char *base = (char*)data_0209fd08;\n data_0209fd00 = (int)(base + idx * 8);\n data_0209fd0c = data_0209fd14 + 0x28 + data_0209fcf8[1] + *(int*)(base + idx * 8);\n func_02031cd4(1);\n oldc = data_0209fc88;\n data_0209fc7c = (((a1 << 3) - oldc) & 0xf) >> 1;\n data_0209fc88 = oldc + data_0209fc7c;\n n = ((data_0209fc88 + 7) / 8) << 6;\n {\n int p = _ZN3G2S13GetBG0CharPtrEv() + 0x4000 + (data_0209fc78 << 5);\n li = 0;\n MultiStore_Int(li, p, n);\n }\n {\n int sp0 = _ZN3G2S12GetBG0ScrPtrEv() + a0 * 2;\n off = ((unsigned)(a1 - ((oldc + 7) / 8)) << 15) >> 16;\n scr = (short*)(sp0 + off * 2);\n count = (data_0209fc88 + 7) / 8;\n }\n for (i = 0; i < count; i++) {\n scr[i] = data_0209fc78 + 0x200 + i;\n (&scr[i])[32] = data_0209fc78 + 0x200 + count + i;\n }\n func_020318a4(0);\n data_0209fc78 = data_0209fc78 + (u8)(((data_0209fc88 + 7) / 8) << 1);\n}\n}\n", "source": "fanout-glm-5.2"} -{"module": "ov002", "addr": "0x020d8944", "name": "func_ov002_020d8944", "size": 268, "target_hex": "70402de928d04de20240a0e1bc00d4e10150a0e1bf0050e30100a0030000a013000050e33200000a5c0085e25c1084e28c8bfdebfe18d5e10060a0e1d889fdeb010950e328d08da20000a0a37040bda81eff2fa10a0aa0e3980085e5980084e50030a0e3b239c5e1020986e2b409c5e1b639c5e1b239c4e1b469c4e10c008de25c1085e25c2084e2b639c4e15a92fdeb18008de20c108de20120a0e3d491fdeb1c009de518109de520309de504008de5052880e248009fe500108de508308de504208de52229fdeb38009fe500109de504209de508309de51d29fdeb0100a0e32607c5e528d08de22607c4e57040bde81eff2fe10000a0e328d08de27040bde81eff2fe12a0100002b010000", "lang": "cpp", "divergences": 15, "c_source": "//cpp\ntypedef short s16;\nstruct Vector3 { int x, y, z; };\nextern \"C\" {\ns16 Vec3_HorzAngle(const struct Vector3* v0, const struct Vector3* v1);\nint AngleDiff(int a, int b);\nvoid Vec3_Add(struct Vector3* out, struct Vector3* a, struct Vector3* b);\nvoid Vec3_Asr(struct Vector3* d, struct Vector3* s, int sh);\nvoid _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(unsigned int a, struct Vector3 v);\n}\nextern \"C\" int func_ov002_020d8944(void* self, char* enemy, char* v1){\n int b0 = ((unsigned short)*(unsigned short*)(v1 + 0xc) == 0xbf);\n if (b0){\n s16 ang = Vec3_HorzAngle((struct Vector3*)(enemy + 0x5c), (struct Vector3*)(v1 + 0x5c));\n if (AngleDiff(ang, *(s16*)(enemy + 0x8e)) >= 0x4000) return 0;\n struct Vector3 sum, asr;\n *(int*)(enemy + 0x98) = 0xa000;\n *(int*)(v1 + 0x98) = 0xa000;\n *(s16*)(enemy + 0x92) = 0;\n *(s16*)(enemy + 0x94) = ang + 0x8000;\n *(s16*)(enemy + 0x96) = 0;\n *(s16*)(v1 + 0x92) = 0;\n *(s16*)(v1 + 0x94) = ang;\n *(s16*)(v1 + 0x96) = 0;\n Vec3_Add(&sum, (struct Vector3*)(enemy + 0x5c), (struct Vector3*)(v1 + 0x5c));\n Vec3_Asr(&asr, &sum, 1);\n {\n struct Vector3 p;\n p.x = asr.x;\n p.y = asr.y + 0x50000;\n p.z = asr.z;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x12a, p);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x12b, p);\n }\n *(unsigned char*)(enemy + 0x726) = 1;\n *(unsigned char*)(v1 + 0x726) = 1;\n return 1;\n }\n return 0;\n}\n", "source": "grindE-2026-06-22"} +{"module": "ov002", "addr": "0x020d8944", "name": "func_ov002_020d8944", "size": 268, "target_hex": "70402de928d04de20240a0e1bc00d4e10150a0e1bf0050e30100a0030000a013000050e33200000a5c0085e25c1084e28c8bfdebfe18d5e10060a0e1d889fdeb010950e328d08da20000a0a37040bda81eff2fa10a0aa0e3980085e5980084e50030a0e3b239c5e1020986e2b409c5e1b639c5e1b239c4e1b469c4e10c008de25c1085e25c2084e2b639c4e15a92fdeb18008de20c108de20120a0e3d491fdeb1c009de518109de520309de504008de5052880e248009fe500108de508308de504208de52229fdeb38009fe500109de504209de508309de51d29fdeb0100a0e32607c5e528d08de22607c4e57040bde81eff2fe10000a0e328d08de27040bde81eff2fe12a0100002b010000", "lang": "cpp", "divergences": 10, "c_source": "//cpp\ntypedef short s16;\nstruct Vector3 { int x, y, z; };\nextern \"C\" {\ns16 Vec3_HorzAngle(const struct Vector3* v0, const struct Vector3* v1);\nint AngleDiff(int a, int b);\nvoid Vec3_Add(struct Vector3* out, struct Vector3* a, struct Vector3* b);\nvoid Vec3_Asr(struct Vector3* d, struct Vector3* s, int sh);\nvoid _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(unsigned int a, struct Vector3 v);\n}\nextern \"C\" int func_ov002_020d8944(void* self, char* enemy, char* v1){\n int b0 = ((unsigned short)*(unsigned short*)(v1 + 0xc) == 0xbf);\n if (b0){\n s16 ang = Vec3_HorzAngle((struct Vector3*)(enemy + 0x5c), (struct Vector3*)(v1 + 0x5c));\n if (AngleDiff(ang, *(s16*)(enemy + 0x8e)) >= 0x4000) return 0;\n struct Vector3 p, sum, asr;\n *(int*)(enemy + 0x98) = 0xa000;\n *(int*)(v1 + 0x98) = 0xa000;\n *(s16*)(enemy + 0x92) = 0;\n *(s16*)(enemy + 0x94) = ang + 0x8000;\n *(s16*)(enemy + 0x96) = 0;\n *(s16*)(v1 + 0x92) = 0;\n *(s16*)(v1 + 0x94) = ang;\n *(s16*)(v1 + 0x96) = 0;\n Vec3_Add(&sum, (struct Vector3*)(enemy + 0x5c), (struct Vector3*)(v1 + 0x5c));\n Vec3_Asr(&asr, &sum, 1);\n p.x = asr.x;\n p.y = asr.y + 0x50000;\n p.z = asr.z;\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x12a, p);\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0x12b, p);\n *(unsigned char*)(enemy + 0x726) = 1;\n *(unsigned char*)(v1 + 0x726) = 1;\n return 1;\n }\n return 0;\n}\n", "source": "grindE-2026-06-22"} {"module": "ov006", "addr": "0x020e8bd0", "name": "func_ov006_020e8bd0", "size": 164, "target_hex": "30402de904d04de21420a0e3910204e00050a0e17c009fe57c109fe5002085e0040092e7013085e0c00340e0040082e70020d3e5051a85e260009fe5012082e20020c3e54ec5d1e50010a0e30420a0e310306ce200c08de58bb1fdeb050a85e24e15d0e5100051e304d08d323040bd381eff2f31041085e00020a0e34e25c0e5050a81e29222c0e59022c0e504d08de23040bde81eff2fe1885200004e55000050100004", "lang": "cpp", "divergences": 15, "c_source": "//cpp\nnamespace G2x {\n void SetBlendAlpha(volatile unsigned short* p, int a, int b, int c, int d);\n}\n\nextern \"C\" void func_ov006_020e8bd0(char* c, int i)\n{\n int* w = (int*)(c + 0x5288 + i * 0x14);\n unsigned char* cnt = (unsigned char*)(c + 0x554e);\n int ip;\n\n *w = *w - (*w >> 7);\n *cnt = *cnt + 1;\n\n ip = *(unsigned char*)(c + 0x554e);\n G2x::SetBlendAlpha((volatile unsigned short*)0x4001050, 0, 4, 0x10 - ip, ip);\n\n if (*(unsigned char*)(c + 0x554e) < 0x10) return;\n\n *(unsigned char*)(c + 0x554e) = 0;\n *(unsigned char*)(c + i * 0x14 + 0x5292) = 0;\n *(unsigned char*)(c + i * 0x14 + 0x5290) = 0;\n}\n", "source": "harvest-final"} {"module": "ov007", "addr": "0x020c0078", "name": "func_ov007_020c0078", "size": 176, "target_hex": "00402de914d04de20030a0e1b810d3e5ba00d3e5b920d3e5bbc0d3e5000481e1021880e178009fe50c1c81e1001080e5b42dd3e1c80093e5011aa0e300008de54202a0e180e0a0e101008ee204108de50110a0e308108de5741083e20c108de5bc2093e53cc09fe58ee0a0e18010a0e1fe009ce1f1109ce1c0c093e5222aa0e1c43093e50c2682e1bd56feeb18009fe50010a0e3001080e514d08de20040bde81eff2fe180050004142208024c040004", "lang": "cpp", "divergences": 15, "c_source": "//cpp\ntypedef int Fix12;\nstruct Matrix4x3;\nstruct G3i {\n static void PerspectiveW_(Fix12, int, int, int, int, int, bool, Matrix4x3*);\n};\nextern short data_02082214[];\n\nextern \"C\" void func_ov007_020c0078(char* c)\n{\n *(int*)0x4000580 = *(unsigned char*)(c + 0xb8)\n | (*(unsigned char*)(c + 0xba) << 8)\n | (*(unsigned char*)(c + 0xb9) << 16)\n | (*(unsigned char*)(c + 0xbb) << 24);\n\n int a = (int)*(unsigned short*)(c + 0xd4) >> 4;\n G3i::PerspectiveW_(\n data_02082214[a * 2],\n data_02082214[a * 2 + 1],\n ((unsigned int)*(int*)(c + 0xbc) >> 0x14) | (*(int*)(c + 0xc0) << 12),\n *(int*)(c + 0xc4),\n *(int*)(c + 0xc8),\n 0x1000,\n true,\n (Matrix4x3*)(c + 0x74));\n\n *(int*)0x400044c = 0;\n}\n", "source": "harvest-final"} {"module": "arm9", "addr": "0x0201d590", "name": "func_0201d590", "size": 272, "target_hex": "10402de908d04de2dc009fe5dc109fe5f030d0e100c091e5d4009fe5d4109fe5d4209fe583e18ce000e082e5000090e5002091e5041090e5282082e283019ce7012082e0b4109fe5002082e00100a0e3002081e543f8ffeba4009fe5a4109fe50000d0e50020a0e30020c1e5071080e24101a0e1a00e81e0c001a0e10043a0e106de00eb80109fe50020a0e30010d1e500208de50420a0e10a1d81e2811280e000009de590f300eb0100a0e3aff6ffeb4c009fe550109fe50000d0e50030d1e5072080e24201a0e1a00e82e0c001a0e18000a0e1ff0000e2000083e00000c1e508d08de21040bde81eff2fe1d4d6090208d709020cd70902fcd60902f0d60902f4d60902b0d609025cd6090274d60902", "lang": "cpp", "divergences": 15, "c_source": "//cpp\nextern \"C\" {\ntypedef unsigned char u8;\nextern short data_0209d6d4;\nextern int data_0209d708;\nextern int **data_0209d70c;\nextern int data_0209d6fc;\nextern int data_0209d6f0;\nextern int data_0209d6f4;\nextern u8 data_0209d6b0;\nextern u8 data_0209d65c;\nextern u8 data_0209d674;\nextern int _ZN2G213GetBG2CharPtrEv(void);\nextern void MultiStore_Int(int val, int dst, int len);\nextern void func_0201b6f8(int a);\nextern void func_0201b100(int a);\n\nvoid func_0201d590(void) {\n volatile int li;\n int n;\n int idx = data_0209d6d4;\n char *base = (char*)data_0209d708;\n data_0209d6f0 = (int)(base + idx * 8);\n data_0209d6f4 = data_0209d6fc + 0x28 + (*data_0209d70c)[1] + *(int*)(base + idx * 8);\n func_0201b6f8(1);\n data_0209d65c = 0;\n n = ((data_0209d6b0 + 7) / 8) << 6;\n {\n int p = _ZN2G213GetBG2CharPtrEv() + ((data_0209d674 + 0x280) << 5);\n li = 0;\n MultiStore_Int(li, p, n);\n }\n func_0201b100(1);\n data_0209d674 = data_0209d674 + (u8)(((data_0209d6b0 + 7) / 8) << 1);\n}\n}\n", "source": "fanout"} @@ -396,7 +396,7 @@ {"module": "ov100", "addr": "0x02143d64", "name": "_ZN14UnchainedChomp8BehaviorEv", "size": 804, "target_hex": "70402de938d04de200139fe50060a0e1010086e00fdcfbebf4029fe5000086e00cdcfbebec029fe5000086e009dcfbeb000050e31b00000a800086e2011aa0e3052ca0e32adcfbeb801096e50600a0e1881086e5881096e5841086e568ffffeb0020a0e30600a0e1111e86e2982086e59533fbeb0600a0e163fdffeb000050e30000a013a0008615110e86e28b44fbeb110e86e27c44fbeb38d08de20100a0e37040bde81eff2fe10f09a0e3000060e2a00086e5681696e5080091e5000050e30800000a083081e2041093e5c10086e0011011e20020901500109315011092170010930531ff2fe1172aa0e30600a0e1111e86e2982086e57333fbeb0600a0e141fdffeb000050e30b00000a060c86e2b80ad0e1000050e30200001a741086e23900a0e3013afbeb0529a0e30600a0e10110a0e3a82086e52a2ffbebd8019fe50000d0e5010050e30100a0030000a013000050e32f00000a060c86e2ba0cd0e1000050e32b00001ab41696e50108a0e342dbfaeb0018a0e10600a0e14158a0e1fb32fbeb0030a0e30400a0e310308de514008de518308de5dc0cd6e15c2086e20010e0e300008de5120ea0e304108de50210a0e3c333fbeb061c86e2b81ad1e10040a0e1000051e30200001a741086e23a00a0e3d539fbeb000054e30a00000a0000a0e3b209c4e1b459c4e1b609c4e110109de514009de50116a0e1a41084e50006a0e1a80084e5ac1084e5060c86e2c810a0e3ba1cc0e108008de27bdbfbebac1696e508008de23bdbfbebb42696e508008de21c108de24edbfbeb28008de21c208de25c1086e2d2e4fbeb28008de2ca3dfceb190850e30d0000aabc009fe5001086e0000091e5010080e2000081e5b41696e5b00696e5000051e10000a0a3b40686a5b42696e508008de21c108de238dbfbeb1c108de25c0086e2e9ddfbeb061c86e2b40ac1e1050ca0e300008de5f41ad1e1940086e21020a0e32030a0e3f7dbfbebf419d6e10600a0e1be18c6e1cbfeffeb110e86e2f843fbeb0600a0e1a332fbeb000050e30400000afb06d0e5000050e30100001a110e86e2e243fbeb0100a0e338d08de27040bde81eff2fe1ca060000a8060000a6060000d8f20902b4060000", "lang": "cpp", "divergences": 48, "c_source": "//cpp\nstruct Vector3 { int x, y, z; };\nstruct Vector3_16 { short x, y, z; };\nstruct CylinderClsn;\nstruct Actor;\ntypedef void (Actor::*PMF)();\nstruct Holder { char pad[8]; PMF fn; };\n\nextern \"C\" {\nextern unsigned short DecIfAbove0_Short(unsigned short *p);\nextern void _Z14ApproachLinearRiii(int &x, int target, int step);\nextern void func_ov100_02143b68(char *c);\nextern void _ZN5Actor9UpdatePosEP12CylinderClsn(Actor *thiz, CylinderClsn *c);\nextern int func_ov100_02143370(char *c);\nextern void _ZN12CylinderClsn5ClearEv(void *thiz);\nextern void _ZN12CylinderClsn6UpdateEv(void *thiz);\nextern void func_02012694(int, void *);\nextern void _ZN5Actor15HugeLandingDustEb(Actor *thiz, bool b);\nextern int __aeabi_idiv(int a, int b);\nextern Actor *_ZN5Actor13ClosestPlayerEv(Actor *thiz);\nextern Actor *_ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(unsigned int a, unsigned int b, const Vector3 &pos, const Vector3_16 *rot, int e, int f);\nextern void _ZN7PathPtrC1Ev(void *thiz);\nextern void _ZN7PathPtr6FromIDEj(void *thiz, unsigned int id);\nextern void _ZNK7PathPtr7GetNodeER7Vector3j(void *thiz, Vector3 &out, unsigned int idx);\nextern void Vec3_Sub(Vector3 *out, Vector3 *a, Vector3 *b);\nextern int LenVec3(Vector3 *v);\nextern short Vec3_HorzAngle(const Vector3 *a, const Vector3 *b);\nextern void ApproachAngle(short *target, short cur, int step, int a, int b);\n\nextern unsigned char data_0209f2d8[];\n}\n\nstruct Actor { char pad[0x800]; };\n\nextern \"C\" int func_ov100_02143d64(Actor *thiz)\n{\n char *c = (char *)thiz;\n DecIfAbove0_Short((unsigned short *)(c + 0x6ca));\n DecIfAbove0_Short((unsigned short *)(c + 0x6a8));\n if (DecIfAbove0_Short((unsigned short *)(c + 0x6a6)) != 0) {\n _Z14ApproachLinearRiii(*(int *)(c + 0x80), 0x1000, 0x500);\n *(int *)(c + 0x88) = *(int *)(c + 0x80);\n *(int *)(c + 0x84) = *(int *)(c + 0x88);\n func_ov100_02143b68(c);\n *(int *)(c + 0x98) = 0;\n _ZN5Actor9UpdatePosEP12CylinderClsn(thiz, (CylinderClsn *)(c + 0x110));\n if (func_ov100_02143370(c) != 0) {\n *(int *)(c + 0xa0) = 0;\n }\n _ZN12CylinderClsn5ClearEv(c + 0x110);\n _ZN12CylinderClsn6UpdateEv(c + 0x110);\n return 1;\n }\n\n *(int *)(c + 0xa0) = -0x3c000;\n\n {\n Holder *q = *(Holder **)(c + 0x668);\n if (q->fn != 0) {\n (thiz->*(q->fn))();\n }\n }\n\n *(int *)(c + 0x98) = 0x17000;\n _ZN5Actor9UpdatePosEP12CylinderClsn(thiz, (CylinderClsn *)(c + 0x110));\n\n if (func_ov100_02143370(c) == 0) {\n goto path_block;\n }\n\n if (*(unsigned short *)(c + 0x6a8) == 0) {\n func_02012694(0x39, c + 0x74);\n }\n *(int *)(c + 0xa8) = 0x14000;\n _ZN5Actor15HugeLandingDustEb(thiz, true);\n\n int flag = (data_0209f2d8[0] == 1);\n if (flag != 0 && *(unsigned short *)(c + 0x6ca) == 0) {\n int q16 = __aeabi_idiv(0x10000, *(int *)(c + 0x6b4));\n short spd = q16;\n Actor *pl = _ZN5Actor13ClosestPlayerEv(thiz);\n (void)pl;\n Vector3_16 rot;\n rot.x = 0;\n rot.y = spd;\n rot.z = 0;\n Actor *sp = _ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(\n 0x120, 2, *(Vector3 *)(c + 0x5c), &rot,\n *(signed char *)(c + 0xcc), -1);\n if (*(unsigned short *)(c + 0x6a8) == 0) {\n func_02012694(0x3a, c + 0x74);\n }\n if (sp != 0) {\n *(short *)((char *)sp + 0x92) = 0;\n *(short *)((char *)sp + 0x94) = spd;\n *(short *)((char *)sp + 0x96) = 0;\n *(int *)((char *)sp + 0xa4) = rot.x << 12;\n *(int *)((char *)sp + 0xa8) = rot.y << 12;\n *(int *)((char *)sp + 0xac) = rot.x << 12;\n }\n *(unsigned short *)(c + 0x6ca) = 0xc8;\n }\n\n goto path_block;\n\npath_block:\n {\n Vector3 v1;\n _ZN7PathPtrC1Ev(&v1);\n _ZN7PathPtr6FromIDEj(&v1, *(unsigned int*)(c + 0x6ac));\n Vector3 v2;\n _ZNK7PathPtr7GetNodeER7Vector3j(&v1, v2, *(unsigned int*)(c + 0x6b4));\n \n Vector3 v3;\n Vec3_Sub(&v3, &v2, (Vector3 *)(c + 0x5c));\n \n if (LenVec3(&v3) < 0x190000) {\n *(int*)(c + 0x6b4) += 1;\n if (*(int*)(c + 0x6b4) >= *(int*)(c + 0x6b0)) {\n *(int*)(c + 0x6b4) = 0;\n }\n _ZNK7PathPtr7GetNodeER7Vector3j(&v1, v2, *(unsigned int*)(c + 0x6b4));\n \n short ang = Vec3_HorzAngle((Vector3 *)(c + 0x5c), &v2);\n *(short *)(c + 0x6a4) = ang;\n \n ApproachAngle((short *)(c + 0x94), ang, 0x10, 0x20, 0x500);\n \n *(short *)(c + 0x8e) = *(short *)(c + 0x94);\n \n func_ov100_02143b68(c);\n _ZN12CylinderClsn5ClearEv(c + 0x110);\n \n Actor *p = _ZN5Actor13ClosestPlayerEv(thiz);\n if (p != 0 && *(unsigned char *)((char *)p + 0x6fb) == 0) {\n _ZN12CylinderClsn6UpdateEv(c + 0x110);\n }\n return 1;\n }\n }\n return 0;\n}\n", "source": "fanout-glm-5.2"} {"module": "ov002", "addr": "0x020cd550", "name": "func_ov002_020cd550", "size": 460, "target_hex": "10402de9ac119fe53f2ca0e30030d1e51810a0e30040a0e193010ce098119fe5000062e2fc3091e10010e0e3022ba0e393e08ce093c12ce0c31fa0e191c02ce002209ee00000ace22216a0e1001a81e10108a0e14018a0e160019fe5f239d4e1000001e00008a0e1000053e301cca0c34028a0e102cca0d3020053e1070000aa921084e2f000d1e10c0080e0b000c1e1f209d4e1020050e1b229c4c1080000ea020053e1060000da921084e2f000d1e10c0040e0b000c1e1f209d4e1020050e1b229c4b10400a0e18affffebf219d4e1000051e3080000aa0600a0e3810061e1dc209fe5a10fa0e19211c3e04331a0e1033080e0bc38c4e1050000ea0a00a0e3810061e14101a0e1a00e81e0c001a0e1bc08c4e100e0a0e390e684e5fc18d4e1000051e30a0000ba0309a0e391c083e0913e23e0c12fa0e1021ba0e301109ce0923023e00e00a3e02116a0e1001a81e1901684e5fc28d4e1020aa0e3001060e2020a42e20008a0e14008a0e1010050e10100a0b1000050e30000a0c38008a0e14008a0e10008a0e12008a0e14002a0e18000a0e1011080e228009fe58110a0e1f11090e12f00e0e3810060e1940684e51040bde81eff2fe1400e0a02a4f40902f0ff00006766666614220802", "lang": "c", "divergences": 48, "c_source": "typedef short s16;\ntypedef unsigned short u16;\n\nextern unsigned char data_020a0e40;\nextern char data_0209f4a4[];\nextern s16 data_02082214[];\nextern void func_ov002_020cd448(char *self);\n\nvoid func_ov002_020cd550(char *self)\n{\n s16 v;\n s16 tgt;\n s16 cur;\n s16 step;\n s16 mag;\n s16 angle;\n int tmp;\n int idx;\n long long prod;\n\n v = *(s16 *)(data_0209f4a4 + data_020a0e40 * 0x18);\n prod = (long long)v * (long long)-0x3f00;\n tmp = (int)((prod + 0x800) >> 12);\n tgt = (s16)(((s16)tmp) & 0xfff0);\n\n cur = *(s16 *)(self + 0x92);\n if (cur > 0)\n step = 0x100;\n else\n step = 0x200;\n\n if (cur < tgt) {\n *(s16 *)(self + 0x92) = cur + step;\n if (*(s16 *)(self + 0x92) > tgt)\n *(s16 *)(self + 0x92) = tgt;\n } else if (cur > tgt) {\n *(s16 *)(self + 0x92) = cur - step;\n if (*(s16 *)(self + 0x92) < tgt)\n *(s16 *)(self + 0x92) = tgt;\n }\n\n func_ov002_020cd448(self);\n\n mag = *(s16 *)(self + 0x92);\n if (mag < 0) {\n tmp = (int)mag * 6;\n *(s16 *)(self + 0x8c) = (s16)(tmp / 10);\n } else {\n tmp = (int)mag * 10;\n *(s16 *)(self + 0x8c) = (s16)((tmp + (tmp >> 29)) >> 3);\n }\n\n *(int *)(self + 0x690) = 0;\n mag = *(s16 *)(self + 0x8c);\n if (mag >= 0) {\n prod = (long long)mag * 0xc000;\n tmp = (int)((prod + 0x800) >> 12);\n *(int *)(self + 0x690) = tmp;\n }\n\n angle = *(s16 *)(self + 0x8c) - 0x2000;\n if (angle < -0x2000)\n angle = -0x2000;\n if (angle > 0)\n angle = 0;\n\n idx = ((u16)(angle * 2) >> 4) + 1;\n *(int *)(self + 0x694) = (int)data_02082214[idx] * -0x30;\n}\n", "source": "fanout-gpt-5.6-luna"} {"module": "ov007", "addr": "0x020c43bc", "name": "func_ov007_020c43bc", "size": 264, "target_hex": "70402de90140a0e1b41dd4e10050a0e1100095e54112a0e18130a0e1012083e2dc109fe58220a0e1f21091e1d0209fe58330a0e1f33092e1000050e3000060b293e0cce0bc60d5e1020ba0e300e09ee00030ace22ec6a0e10666a0e103ca8ce196ccc3e000009ce06020a0e30030a3e22006a0e1810261e1030a80e1863bfeeb200085e5b42dd4e1100095e570109fe54222a0e18230a0e1012083e28220a0e1f21091e1000050e354209fe58330a0e1f33092e1000060b2bee0d5e193c0c4e0020ba0e300c09ce00030a4e22c46a0e16020a0e30ec6a0e1034a84e19c44c3e0000094e00030a3e22006a0e1810261e1030a80e1683bfeeb240085e57040bde81eff2fe114220802", "lang": "cpp", "divergences": 49, "c_source": "//cpp\ntypedef int s32;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef long long s64;\n\nextern \"C\" int _ZN4cstd4fdivEii(int a, int b);\nextern s16 data_02082214[];\n\nstruct A {\n char pad[0xc];\n u16 fc;\n u16 fe;\n s32 f10;\n char pad2[0xc];\n s32 f20;\n s32 f24;\n};\nstruct B { char pad[0xd4]; u16 fd4; };\n\nextern \"C\" void func_ov007_020c43bc(A *a, B *b)\n{\n int idx = b->fd4 >> 4;\n s16 c = data_02082214[idx * 2];\n s16 s = data_02082214[idx * 2 + 1];\n int x = a->f10;\n if (x < 0) x = -x;\n a->f20 = _ZN4cstd4fdivEii(\n (int)(((s64)((a->fc << 12)) * (int)(((s64)c * x + 0x800) >> 12) + 0x800) >> 12),\n s * 0x60);\n idx = b->fd4 >> 4;\n c = data_02082214[idx * 2];\n s = data_02082214[idx * 2 + 1];\n x = a->f10;\n if (x < 0) x = -x;\n a->f24 = _ZN4cstd4fdivEii(\n (int)(((s64)((a->fe << 12)) * (int)(((s64)c * x + 0x800) >> 12) + 0x800) >> 12),\n s * 0x60);\n}\n", "source": "fanout"} -{"module": "ov002", "addr": "0x020c06fc", "name": "func_ov002_020c06fc", "size": 1472, "target_hex": "f0432de9acd04de20090a0e1de06d9e50180a0e1000050e3acd08d120000a013f043bd181eff2f11581599e5980099e5000091e1acd08d020000a003f043bd081eff2f0160059fe50040a0e30020d0e51800a0e354159fe5920000e0f00091e10460a0e1020c50e30f0000ba060c89e2f22dd0e1f409d9e134159fe5000042e00008a0e14008a0e10008a0e12008a0e14002a0e18030a0e1010083e28020a0e18300a0e1f24091e1f06091e10900a0e1dafeffebd5be00eb5220a0e3e8749fe50050a0e394128ce0023ba0e3031091e094c52ce0c44fa0e194c22ce00050d7e51820a0e3c4449fe5950202e0f24094e10020ace22116a0e1021a81e19421c1e0032092e00010a1e22226a0e1012a82e1027080e00900a0e1c0feffebaabe00ebb429d9e188449fe5981099e54222a0e18230a0e1012083e28330a0e1f33094e18220a0e1f22094e191e3c5e091c2c4e00030a0e3022ba0e302e09ee00010a5e22e56a0e1015a85e102c09ce00010a4e22c46a0e1014a84e10e17d9e5000051e35800000a20c49fe51810a0e300e0dce520c49fe59e0101e001c0dce700005ce34400000a000056e3002066b20620a0a1010c52e3f4239fe50060a0b3f11092e1010b51e30d0000aa6410a0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1430000ea020b51e30d0000aac810a0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1330000ea030b51e30d0000aa191ea0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1230000ea031ca0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1150000ea221ea0e396e18ce096c32ce0c66fa0e102209ee096c12ce00310ace02226a0e1012a82e1061c89e2bc29c1e1090000eac61fa0e10114a0e106c4a0e102209ce0261c81e10310a1e02226a0e1012a82e1061c89e2bc29c1e1062c89e2ba69d2e194129fe5023ba0e34662a0e10661a0e1f6c091e188629fe590eccce003e09ee000c0ace22ee6a0e10cea8ee104e08de5ba29d2e14222a0e18220a0e1012082e28220a0e1f21091e19021c1e0032092e00000a1e22216a0e1001a81e10c108de5060089e03ef1fdeb04109de50c209de591c0c6e0021ba0e39200c3e001c09ce00020a6e2011090e02c06a0e1020a80e10020a3e22116a0e1021a81e104008de50c108de5e926d9e5022012e23400000a062c89e2be2cd2e1012002e20228a0e12228b0e12e00001a982099e5010852e32b0000ca7beafdeb0060a0e134008de22ddbfdeb0608a0e12008a0e14002a0e1601099e58020a0e1643099e55c0099e5321a81e214108de5011082e218308de58160a0e180319fe510008de58220a0e1f66093e1f22093e1640099e54610a0e386010ce1603099e534008de2326a83e25c3099e5823101e11c108de510108de21c208de20930a0e120608de524c08de5bddafdeb34008de2addefdeb000050e30000a01304008d150c008d1534008de2f2dafdeb04109de50c009de5012085e0001084e09237c4e0020ba0e3005093e09137c2e00040a4e2001093e02506a0e1040a80e10020a2e22116a0e1021a81e128008de530108de53eeafdeb0040a0e128008de2e2f0fdeb980089e5980099e5190950e31909a0c3980089c5060c89e2fc09d0e1000084e0b409c9e1f449d9e1fe18d9e10400a0e131e9fdeb010950e3f409d9a10820a0e30139a0e3020980a20008a0a14048a0a11000a0e300008de50410a0e18e0089e2ede8fdeb980099e5000050e3000060b2080050e10c0000aa0900a0e1abfdffeb581599e5b9bd00eb000050e30000a003acd08d0298008905f043bd081eff2f010e07d9e5000050e3988089150100a0e3acd08de2f043bde81eff2fe1400e0a02a0f4090214220802acf4090254050000", "lang": "c", "divergences": 49, "c_source": "/* NONMATCHING div=50 (2026-07-11, from scratch): structure byte-aligned\n * (324/368 equal, size exact, frame/pushset exact after wrapping the four\n * Vec3s + ray[0x78] in ONE escaping struct to stop v0 scalarization).\n * Residue: (a) scratch rotation inside the a*0x52 fix12 block (r2/r3, r5/r7,\n * ip/r1), (b) v1/v2 init interleave (scheduler hoists table reads above the\n * v1.x store; ROM value-order z,y,x store-order x,y,z already applied),\n * (c) fx/fz rounding interleave. All scheduling/scratch family.\n * func_ov002_020c06fc @ 0x020c06fc size 0x5c0 (ov002) \u2014 swim/current steering:\n * recompute c->98 speed vector from stick + current, returns 0 if idle. */\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\n\nstruct Vec3 { s32 x, y, z; };\n\n#define FX(a, k) ((int)(((long long)(a) * (k) + 0x800) >> 12))\n\nextern int func_ov002_020c031c(void *c);\nextern int func_ov002_020f030c(unsigned int sel);\nextern int func_ov002_020f02c8(unsigned int sel);\nextern int func_ov002_020f035c(unsigned int sel, int r1);\nextern int func_0203cf78(void *v);\nextern int func_0203b4dc(int x, int z);\nextern int func_0203b0e8(int a, int b);\nextern void func_020377b0(void *ray);\nextern void func_02037670(void *ray, void *a, void *b, void *actor);\nextern int func_02038638(void *ray);\nextern void func_02037764(void *ray);\nextern void ApproachAngle(short *cur, short target, int divisor, int band, int maxStep);\n\nextern unsigned char data_020a0e40;\nextern short data_0209f4a0[];\nextern char data_0209f4ac[];\nextern short data_02082214[];\n\nint func_ov002_020c06fc(char *c, int arg)\n{\n struct Frame {\n struct Vec3 v0;\n struct Vec3 v1;\n struct Vec3 v2;\n struct Vec3 v3;\n char ray[0x78];\n } f;\n int a;\n int t;\n int b;\n int v;\n int spd;\n int r5v;\n int r4v;\n int ang;\n\n if (*(u8 *)(c + 0x6de) != 0)\n return 0;\n if ((*(int *)(c + 0x558) | *(int *)(c + 0x98)) == 0)\n return 0;\n\n a = 0;\n b = a;\n if (*(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18) >= 0x200) {\n s16 d = (s16)(*(s16 *)(c + 0x6d2) - *(s16 *)(c + 0x94));\n int j = ((u16)d >> 4) * 2;\n a = data_02082214[j + 1];\n b = data_02082214[j];\n }\n\n t = func_ov002_020f030c(func_ov002_020c031c(c));\n t = t + FX(FX(a, 0x52LL), *(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18));\n\n v = func_ov002_020f02c8(func_ov002_020c031c(c));\n {\n int j = (*(u16 *)(c + 0x94) >> 4) * 2;\n spd = *(int *)(c + 0x98);\n r5v = FX(spd, (int)data_02082214[j]);\n r4v = FX(spd, (int)data_02082214[j + 1]);\n }\n\n if (*(u8 *)(c + 0x70e) != 0) {\n if (*(u8 *)(data_0209f4ac + data_020a0e40 * 0x18) != 0) {\n int m = (b < 0) ? -b : b;\n s16 s2;\n if (m < 0x100)\n b = 0;\n s2 = *(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18);\n if (s2 < 0x400)\n *(u16 *)(c + 0x69c) = FX(b, 0x64LL);\n else if (s2 < 0x800)\n *(u16 *)(c + 0x69c) = FX(b, 0xC8LL);\n else if (s2 < 0xC00)\n *(u16 *)(c + 0x69c) = FX(b, 0x190LL);\n else\n *(u16 *)(c + 0x69c) = FX(b, 0x300LL);\n } else {\n *(u16 *)(c + 0x69c) = FX(b, 0x220LL);\n }\n } else {\n *(u16 *)(c + 0x69c) = (int)((((long long)b << 8) + 0x800) >> 12);\n }\n\n f.v0.x = FX(v, (int)data_02082214[(*(u16 *)(c + 0x69a) >> 4) * 2]);\n f.v0.z = FX(v, (int)data_02082214[(*(u16 *)(c + 0x69a) >> 4) * 2 + 1]);\n {\n int len = func_0203cf78(c + 0x554);\n f.v0.x = FX(f.v0.x, len);\n f.v0.z = FX(f.v0.z, len);\n }\n\n if ((*(u8 *)(c + 0x6e9) & 2) != 0 && (u16)(*(u16 *)(c + 0x6ce) & 1) == 0\n && *(int *)(c + 0x98) <= 0x10000) {\n int r6b = func_0203b4dc(f.v0.x, f.v0.z);\n func_020377b0(f.ray);\n {\n int j = ((u16)r6b >> 4) * 2;\n int tz;\n int ty;\n int tx;\n f.v1.y = *(int *)(c + 0x60) + 0x32000;\n f.v1.z = *(int *)(c + 0x64);\n f.v1.x = *(int *)(c + 0x5c);\n tz = data_02082214[j + 1] * 0x46 + *(int *)(c + 0x64);\n ty = *(int *)(c + 0x60) + 0x32000;\n tx = data_02082214[j] * 0x46 + *(int *)(c + 0x5c);\n f.v2.x = tx;\n f.v2.y = ty;\n f.v2.z = tz;\n }\n func_02037670(f.ray, &f.v1, &f.v2, c);\n if (func_02038638(f.ray) != 0) {\n f.v0.x = 0;\n f.v0.z = 0;\n }\n func_02037764(f.ray);\n }\n\n {\n int fx = FX(t, r5v + f.v0.x);\n int fz = FX(t, r4v + f.v0.z);\n f.v3.x = fx;\n f.v3.z = fz;\n ang = func_0203b4dc(fx, fz);\n }\n *(int *)(c + 0x98) = func_0203cf78(&f.v3);\n if (*(int *)(c + 0x98) > 0x64000)\n *(int *)(c + 0x98) = 0x64000;\n *(s16 *)(c + 0x94) = (s16)(ang + *(s16 *)(c + 0x69c));\n {\n s16 cur = *(s16 *)(c + 0x94);\n if (func_0203b0e8(cur, *(s16 *)(c + 0x8e)) >= 0x4000)\n cur = (s16)(*(s16 *)(c + 0x94) + 0x8000);\n ApproachAngle((s16 *)(c + 0x8e), cur, 8, 0x4000, 0x10);\n }\n {\n int s = *(int *)(c + 0x98);\n if (s < 0)\n s = -s;\n if (s < arg) {\n if (func_ov002_020f035c(func_ov002_020c031c(c), *(int *)(c + 0x558)) == 0) {\n *(int *)(c + 0x98) = 0;\n return 0;\n }\n if (*(u8 *)(c + 0x70e) != 0)\n *(int *)(c + 0x98) = arg;\n }\n }\n return 1;\n}\n", "source": "fable-batch4-c06fc"} +{"module": "ov002", "addr": "0x020c06fc", "name": "func_ov002_020c06fc", "size": 1472, "target_hex": "f0432de9acd04de20090a0e1de06d9e50180a0e1000050e3acd08d120000a013f043bd181eff2f11581599e5980099e5000091e1acd08d020000a003f043bd081eff2f0160059fe50040a0e30020d0e51800a0e354159fe5920000e0f00091e10460a0e1020c50e30f0000ba060c89e2f22dd0e1f409d9e134159fe5000042e00008a0e14008a0e10008a0e12008a0e14002a0e18030a0e1010083e28020a0e18300a0e1f24091e1f06091e10900a0e1dafeffebd5be00eb5220a0e3e8749fe50050a0e394128ce0023ba0e3031091e094c52ce0c44fa0e194c22ce00050d7e51820a0e3c4449fe5950202e0f24094e10020ace22116a0e1021a81e19421c1e0032092e00010a1e22226a0e1012a82e1027080e00900a0e1c0feffebaabe00ebb429d9e188449fe5981099e54222a0e18230a0e1012083e28330a0e1f33094e18220a0e1f22094e191e3c5e091c2c4e00030a0e3022ba0e302e09ee00010a5e22e56a0e1015a85e102c09ce00010a4e22c46a0e1014a84e10e17d9e5000051e35800000a20c49fe51810a0e300e0dce520c49fe59e0101e001c0dce700005ce34400000a000056e3002066b20620a0a1010c52e3f4239fe50060a0b3f11092e1010b51e30d0000aa6410a0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1430000ea020b51e30d0000aac810a0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1330000ea030b51e30d0000aa191ea0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1230000ea031ca0e30020a0e396e18ce096c22ce0c63fa0e1022ba0e302209ee093c12ce00010ace22226a0e1012a82e1061c89e2bc29c1e1150000ea221ea0e396e18ce096c32ce0c66fa0e102209ee096c12ce00310ace02226a0e1012a82e1061c89e2bc29c1e1090000eac61fa0e10114a0e106c4a0e102209ce0261c81e10310a1e02226a0e1012a82e1061c89e2bc29c1e1062c89e2ba69d2e194129fe5023ba0e34662a0e10661a0e1f6c091e188629fe590eccce003e09ee000c0ace22ee6a0e10cea8ee104e08de5ba29d2e14222a0e18220a0e1012082e28220a0e1f21091e19021c1e0032092e00000a1e22216a0e1001a81e10c108de5060089e03ef1fdeb04109de50c209de591c0c6e0021ba0e39200c3e001c09ce00020a6e2011090e02c06a0e1020a80e10020a3e22116a0e1021a81e104008de50c108de5e926d9e5022012e23400000a062c89e2be2cd2e1012002e20228a0e12228b0e12e00001a982099e5010852e32b0000ca7beafdeb0060a0e134008de22ddbfdeb0608a0e12008a0e14002a0e1601099e58020a0e1643099e55c0099e5321a81e214108de5011082e218308de58160a0e180319fe510008de58220a0e1f66093e1f22093e1640099e54610a0e386010ce1603099e534008de2326a83e25c3099e5823101e11c108de510108de21c208de20930a0e120608de524c08de5bddafdeb34008de2addefdeb000050e30000a01304008d150c008d1534008de2f2dafdeb04109de50c009de5012085e0001084e09237c4e0020ba0e3005093e09137c2e00040a4e2001093e02506a0e1040a80e10020a2e22116a0e1021a81e128008de530108de53eeafdeb0040a0e128008de2e2f0fdeb980089e5980099e5190950e31909a0c3980089c5060c89e2fc09d0e1000084e0b409c9e1f449d9e1fe18d9e10400a0e131e9fdeb010950e3f409d9a10820a0e30139a0e3020980a20008a0a14048a0a11000a0e300008de50410a0e18e0089e2ede8fdeb980099e5000050e3000060b2080050e10c0000aa0900a0e1abfdffeb581599e5b9bd00eb000050e30000a003acd08d0298008905f043bd081eff2f010e07d9e5000050e3988089150100a0e3acd08de2f043bde81eff2fe1400e0a02a0f4090214220802acf4090254050000", "lang": "c", "divergences": 49, "c_source": "/* NONMATCHING div=50 (2026-07-11, from scratch): structure byte-aligned\n * (324/368 equal, size exact, frame/pushset exact after wrapping the four\n * Vec3s + ray[0x78] in ONE escaping struct to stop v0 scalarization).\n * Residue: (a) scratch rotation inside the a*0x52 fix12 block (r2/r3, r5/r7,\n * ip/r1), (b) v1/v2 init interleave (scheduler hoists table reads above the\n * v1.x store; ROM value-order z,y,x store-order x,y,z already applied),\n * (c) fx/fz rounding interleave. All scheduling/scratch family.\n * func_ov002_020c06fc @ 0x020c06fc size 0x5c0 (ov002) — swim/current steering:\n * recompute c->98 speed vector from stick + current, returns 0 if idle. */\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\n\nstruct Vec3 { s32 x, y, z; };\n\n#define FX(a, k) ((int)(((long long)(a) * (k) + 0x800) >> 12))\n\nextern int func_ov002_020c031c(void *c);\nextern int func_ov002_020f030c(unsigned int sel);\nextern int func_ov002_020f02c8(unsigned int sel);\nextern int func_ov002_020f035c(unsigned int sel, int r1);\nextern int func_0203cf78(void *v);\nextern int func_0203b4dc(int x, int z);\nextern int func_0203b0e8(int a, int b);\nextern void func_020377b0(void *ray);\nextern void func_02037670(void *ray, void *a, void *b, void *actor);\nextern int func_02038638(void *ray);\nextern void func_02037764(void *ray);\nextern void ApproachAngle(short *cur, short target, int divisor, int band, int maxStep);\n\nextern unsigned char data_020a0e40;\nextern short data_0209f4a0[];\nextern char data_0209f4ac[];\nextern short data_02082214[];\n\nint func_ov002_020c06fc(char *c, int arg)\n{\n struct Frame {\n struct Vec3 v0;\n struct Vec3 v1;\n struct Vec3 v2;\n struct Vec3 v3;\n char ray[0x78];\n } f;\n int a;\n int t;\n int b;\n int v;\n int spd;\n int r5v;\n int r4v;\n int ang;\n\n if (*(u8 *)(c + 0x6de) != 0)\n return 0;\n if ((*(int *)(c + 0x558) | *(int *)(c + 0x98)) == 0)\n return 0;\n\n a = 0;\n b = a;\n if (*(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18) >= 0x200) {\n s16 d = (s16)(*(s16 *)(c + 0x6d2) - *(s16 *)(c + 0x94));\n int j = ((u16)d >> 4) * 2;\n a = data_02082214[j + 1];\n b = data_02082214[j];\n }\n\n t = func_ov002_020f030c(func_ov002_020c031c(c));\n t = t + FX(FX(a, 0x52LL), *(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18));\n\n v = func_ov002_020f02c8(func_ov002_020c031c(c));\n {\n int j = (*(u16 *)(c + 0x94) >> 4) * 2;\n spd = *(int *)(c + 0x98);\n r5v = FX(spd, (int)data_02082214[j]);\n r4v = FX(spd, (int)data_02082214[j + 1]);\n }\n\n if (*(u8 *)(c + 0x70e) != 0) {\n if (*(u8 *)(data_0209f4ac + data_020a0e40 * 0x18) != 0) {\n int m = (b < 0) ? -b : b;\n s16 s2;\n if (m < 0x100)\n b = 0;\n s2 = *(s16 *)((char *)data_0209f4a0 + data_020a0e40 * 0x18);\n if (s2 < 0x400)\n *(u16 *)(c + 0x69c) = FX(b, 0x64LL);\n else if (s2 < 0x800)\n *(u16 *)(c + 0x69c) = FX(b, 0xC8LL);\n else if (s2 < 0xC00)\n *(u16 *)(c + 0x69c) = FX(b, 0x190LL);\n else\n *(u16 *)(c + 0x69c) = FX(b, 0x300LL);\n } else {\n *(u16 *)(c + 0x69c) = FX(b, 0x220LL);\n }\n } else {\n *(u16 *)(c + 0x69c) = (int)((((long long)b << 8) + 0x800) >> 12);\n }\n\n f.v0.x = FX(v, (int)data_02082214[(*(u16 *)(c + 0x69a) >> 4) * 2]);\n f.v0.z = FX(v, (int)data_02082214[(*(u16 *)(c + 0x69a) >> 4) * 2 + 1]);\n {\n int len = func_0203cf78(c + 0x554);\n f.v0.x = FX(f.v0.x, len);\n f.v0.z = FX(f.v0.z, len);\n }\n\n if ((*(u8 *)(c + 0x6e9) & 2) != 0 && (u16)(*(u16 *)(c + 0x6ce) & 1) == 0\n && *(int *)(c + 0x98) <= 0x10000) {\n int r6b = func_0203b4dc(f.v0.x, f.v0.z);\n func_020377b0(f.ray);\n {\n int j = ((u16)r6b >> 4) * 2;\n int tz;\n int ty;\n int tx;\n f.v1.y = *(int *)(c + 0x60) + 0x32000;\n f.v1.z = *(int *)(c + 0x64);\n f.v1.x = *(int *)(c + 0x5c);\n tz = data_02082214[j + 1] * 0x46 + *(int *)(c + 0x64);\n ty = *(int *)(c + 0x60) + 0x32000;\n tx = data_02082214[j] * 0x46 + *(int *)(c + 0x5c);\n f.v2.x = tx;\n f.v2.y = ty;\n f.v2.z = tz;\n }\n func_02037670(f.ray, &f.v1, &f.v2, c);\n if (func_02038638(f.ray) != 0) {\n f.v0.x = 0;\n f.v0.z = 0;\n }\n func_02037764(f.ray);\n }\n\n {\n int fx = FX(t, r5v + f.v0.x);\n int fz = FX(t, r4v + f.v0.z);\n f.v3.x = fx;\n f.v3.z = fz;\n ang = func_0203b4dc(fx, fz);\n }\n *(int *)(c + 0x98) = func_0203cf78(&f.v3);\n if (*(int *)(c + 0x98) > 0x64000)\n *(int *)(c + 0x98) = 0x64000;\n *(s16 *)(c + 0x94) = (s16)(ang + *(s16 *)(c + 0x69c));\n {\n s16 cur = *(s16 *)(c + 0x94);\n if (func_0203b0e8(cur, *(s16 *)(c + 0x8e)) >= 0x4000)\n cur = (s16)(*(s16 *)(c + 0x94) + 0x8000);\n ApproachAngle((s16 *)(c + 0x8e), cur, 8, 0x4000, 0x10);\n }\n {\n int s = *(int *)(c + 0x98);\n if (s < 0)\n s = -s;\n if (s < arg) {\n if (func_ov002_020f035c(func_ov002_020c031c(c), *(int *)(c + 0x558)) == 0) {\n *(int *)(c + 0x98) = 0;\n return 0;\n }\n if (*(u8 *)(c + 0x70e) != 0)\n *(int *)(c + 0x98) = arg;\n }\n }\n return 1;\n}\n", "source": "fable-batch4-c06fc"} {"module": "ov006", "addr": "0x0212a764", "name": "func_ov006_0212a764", "size": 784, "target_hex": "f04f2de91cd04de20090a0e1051a89e20000a0e3b80f81e5bc0f81e5b82f91e52000a0e3c02f81e5bc2f91e5c42f81e54d17feeb0020a0e30210a0e1820289e0010980e2381fc0e53a1fc0e5391fc0e53b1fc0e53c1f80e5401f80e54c1f80e5501f80e5441f80e5012082e2481f80e5160052e3f0ffffba050a89e2e40f90e5140050e30900001a64029fe56644fceb60129fe5052a89e2200801e08000a0e1a007a0e1010080e2d80f82e51a0000ea3c029fe55c44fceb38129fe50a20a0e3200801e0900201e0a107b0e10900001a1c029fe55444fceb18129fe5052a89e2200801e08000a0e1a007a0e1140080e2d80f82e5080000eaf4019fe54a44fcebf0119fe5052a89e2200801e08001a0e1a007a0e1080080e2d80f82e5d0019fe54144fcebcc119fe5052a89e2200801e0d81f92e50008a0e1000051e3a0b7a0e10080a0e32a0000daac019fe50870a0e1006089e00308a0e308008de50100a0e304808de50c008de590219fe588a289e00700a0e102508ae0c040fbeb00008be0b000c5e170019fe500408ae070019fe500a08ae004009de5000084e508009de500008ae5f010d5e10600a0e19c4afceb001094e5880289e0021781e2001084e5011980e200009ae5018088e2060880e200008ae50c009de5017887e2380fc1e5050a89e2d81f90e5206086e2010058e1dcffffba000051e30040a0e3230000daf8509fe5f0609fe5f4709fe5e4809fe5dc009fe50444fceb051a89e2d81f91e5200808e0910000e0a007a0e1040050e11100000a84a289e0800289e005b08ae0052080e0b030dbe1b010d2e106c08ae0b010cbe1b030c2e1062080e000b09ce50730bae7001092e500108ce50710b0e700108ae500b082e5003080e5050a89e2d80f90e5014084e2000054e1dfffffba050a89e20010e0e3c81f80e50020a0e3cc2fc0e5e82f80e5d02f80e5d42f80e50210a0e3ec1f80e5cd2fc0e55f0c89e240109fe5b42fc0e13c009fe5b020c1e10a40a0e30410a0e30820a0e30630a0e300408de503aafceb1cd08de2f04fbde81eff2fe1b8d40902ff7f00003c4f0000544f0000404f00005000000450100004", "lang": "c", "divergences": 49, "c_source": "extern int RandomIntInternal(int *seed);\nextern void func_0203d388(int *p, short angle);\nextern int func_01ffabe4(int angle);\nextern void func_ov004_020b04d0(int n);\nextern void _ZN3G2x13SetBlendAlphaEPVttttt(\n volatile void *reg,\n unsigned short a, unsigned short b, int c, int d);\nextern int data_0209d4b8;\n\n#pragma opt_strength_reduction off\n\nvoid func_ov006_0212a764(char *c)\n{\n register int angbase;\n int i;\n int i2;\n int ang;\n int *pang;\n int j;\n unsigned int r;\n\n *(int *)(c + 0x5fb8) = 0;\n *(int *)(c + 0x5fbc) = 0;\n *(int *)(c + 0x5fc0) = *(int *)(c + 0x5fb8);\n *(int *)(c + 0x5fc4) = *(int *)(c + 0x5fbc);\n func_ov004_020b04d0(0x20);\n for (i = 0; i < 0x16; i++) {\n *(unsigned char *)(c + i * 0x20 + 0x4f38) = 0;\n *(unsigned char *)(c + i * 0x20 + 0x4f3a) = 0;\n *(unsigned char *)(c + i * 0x20 + 0x4f39) = 0;\n *(unsigned char *)(c + i * 0x20 + 0x4f3b) = 0;\n *(int *)(c + i * 0x20 + 0x4f3c) = 0;\n *(int *)(c + i * 0x20 + 0x4f40) = 0;\n *(int *)(c + i * 0x20 + 0x4f4c) = 0;\n *(int *)(c + i * 0x20 + 0x4f50) = 0;\n *(int *)(c + i * 0x20 + 0x4f44) = 0;\n *(int *)(c + i * 0x20 + 0x4f48) = 0;\n }\n if (*(int *)(c + 0x5fe4) == 0x14) {\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n *(int *)(c + 0x5fd8) = ((r * 2) >> 15) + 1;\n } else {\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n if (((r * 10) >> 15) == 0) {\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n *(int *)(c + 0x5fd8) = ((r * 2) >> 15) + 0x14;\n } else {\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n *(int *)(c + 0x5fd8) = ((r * 8) >> 15) + 8;\n }\n }\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n angbase = (r * 0x10000) >> 15;\n i2 = 0;\n if (*(int *)(c + 0x5fd8) > 0) {\n pang = (int *)(c + 0x4f3c);\n ang = 0;\n do {\n *(short *)(((int)(c + i2 * 0x20) + 0x4f54) & 0xFFFFFFFFFFFFFFFF) = angbase + func_01ffabe4(ang);\n *(int *)(((int)(c + i2 * 0x20) + 0x4f3c) & 0xFFFFFFFFFFFFFFFF) = 0;\n *(int *)(((int)(c + i2 * 0x20) + 0x4f40) & 0xFFFFFFFFFFFFFFFF) = 0x30000;\n func_0203d388(pang, *(short *)(((int)(c + i2 * 0x20) + 0x4f54) & 0xFFFFFFFFFFFFFFFF));\n *(int *)(((int)(c + i2 * 0x20) + 0x4f3c) & 0xFFFFFFFFFFFFFFFF) += 0x80000;\n *(int *)(((int)(c + i2 * 0x20) + 0x4f40) & 0xFFFFFFFFFFFFFFFF) += 0x60000;\n *(unsigned char *)((unsigned int)c + i2 * 0x20 + 0x4f38) = 1;\n i2++;\n ang += 0x10000;\n pang += 8;\n } while (i2 < *(int *)(c + 0x5fd8));\n }\n j = 0;\n if (*(int *)(c + 0x5fd8) > 0) {\n do {\n int k;\n r = ((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff;\n k = (*(int *)(c + 0x5fd8) * r) >> 15;\n if (k != j) {\n char *ej = c + j * 0x20;\n char *ek = c + k * 0x20;\n unsigned short t16;\n int t1, t2;\n t16 = *(unsigned short *)(((int)ej + 0x4f54) & 0xFFFFFFFFFFFFFFFF);\n *(unsigned short *)(((int)ej + 0x4f54) & 0xFFFFFFFFFFFFFFFF) = *(unsigned short *)(((int)ek + 0x4f54) & 0xFFFFFFFFFFFFFFFF);\n *(unsigned short *)(((int)ek + 0x4f54) & 0xFFFFFFFFFFFFFFFF) = t16;\n t1 = *(int *)(((int)ej + 0x4f3c) & 0xFFFFFFFFFFFFFFFF);\n t2 = *(int *)(((int)ej + 0x4f40) & 0xFFFFFFFFFFFFFFFF);\n *(int *)(((int)ej + 0x4f3c) & 0xFFFFFFFFFFFFFFFF) = *(int *)(((int)ek + 0x4f3c) & 0xFFFFFFFFFFFFFFFF);\n *(int *)(((int)ej + 0x4f40) & 0xFFFFFFFFFFFFFFFF) = *(int *)(((int)ek + 0x4f40) & 0xFFFFFFFFFFFFFFFF);\n *(int *)(((int)ek + 0x4f3c) & 0xFFFFFFFFFFFFFFFF) = t1;\n *(int *)(((int)ek + 0x4f40) & 0xFFFFFFFFFFFFFFFF) = t2;\n }\n j++;\n } while (j < *(int *)(c + 0x5fd8));\n }\n *(int *)(c + 0x5fc8) = -1;\n *(unsigned char *)(c + 0x5fcc) = 0;\n *(int *)(c + 0x5fe8) = 0;\n *(int *)(c + 0x5fd0) = 0;\n *(int *)(c + 0x5fd4) = 0;\n *(int *)(c + 0x5fec) = 2;\n *(unsigned char *)(c + 0x5fcd) = 0;\n *(unsigned short *)(c + 0x5ff4) = 0;\n *(volatile unsigned short *)0x4000050 = 0;\n _ZN3G2x13SetBlendAlphaEPVttttt((volatile void *)0x4001050, 4, 8, 6, 0xa);\n}\n", "source": "fable-subagent", "note": "structure 100% (196/196 insns aligned): residual is ONE systematic callee-saved permutation (c=r7 vs sb, cascades through loop1 ang/pang/i/elem + shuffle pools) + frame 0x14 vs 0x1c (target reserves 2 unused words) + and/mul r0/r1 scratch swap in (r*10)>>15 test. Web-count sensitive: adding fresh loop1 counter i2 moved c r6->r7 (54->51). 120 decl perms, named/laundered ptr forms, register kw, r-split, scope splits, 3 pragmas all inert. Levers that got here: opt_strength_reduction off (clear-loop indexed form), repeated identical u64-laundered exprs for loop1 RMW ptrs (LOW priority webs vs named), laundered swap sites (pooled offset regs in shuffle), fresh i2, u16 swap loads."} {"module": "ov006", "addr": "0x02126948", "name": "func_ov006_02126948", "size": 336, "target_hex": "10402de910d04de230119fe50040a0e1f010d1e10307a0e33cb2fceb0b1a84e2f819d1e5000051e30f00001a011984e20030a0e3003781e50d28a0e3042781e5083781e50c3781e5103781e5f0209fe5140781e5471c84e2023ca0e3020084e0b831c1e1e065feeb0f0000ea0618a0e3012984e20030a0e3003782e5001061e2041782e5083782e50c3782e5103782e5ac309fe5140782e5471c84e2022ca0e3030084e0b821c1e1cf65feeb0a0a84e26c2b90e53c1b90e5380b90e5011042e0112881e2021740e20030a0e374009fe500108de504208de508308de54655fcebab0c84e2fc17d0e158009fe55555fcebab0c84e2f817d0e148009fe56955fcebab0c84e2fa17d0e138009fe55955fceb30e09fe530c09fe50f00bee80c4084e00f00a4e80f00bee80f00a4e80f009ee80f0084e810d08de21040bde81eff2fe11423080260460000680e0a02c0ab0000", "lang": "cpp", "divergences": 50, "c_source": "//cpp\nstruct Mtx43 { int m[12]; };\nstruct Vec3 { int x, y, z; };\nstruct Camera;\nextern \"C\" int _ZN4cstd4fdivEii(int a, int b);\nextern void func_ov006_020c0134(Camera* self);\nextern void Matrix4x3_FromTranslation(Mtx43* m, Vec3 t);\nextern void Matrix4x3_ApplyInPlaceToRotationZ(Mtx43* mF, short angZ);\nextern void Matrix4x3_ApplyInPlaceToRotationX(Mtx43* mF, short angX);\nextern void Matrix4x3_ApplyInPlaceToRotationY(Mtx43* mF, short angY);\nextern short data_02082314;\nextern Mtx43 data_020a0e68;\n\nextern \"C\" void func_ov006_02126948(char* self)\n{\n Vec3 t;\n int f = _ZN4cstd4fdivEii(0xc0000, data_02082314);\n if (*(unsigned char*)(self + 0xb9f8) == 0) {\n char* s = self + 0x4000;\n *(int*)(s + 0x700) = 0;\n *(int*)(s + 0x704) = 0xd0000;\n *(int*)(s + 0x708) = 0;\n *(int*)(s + 0x70c) = 0;\n *(int*)(s + 0x710) = 0;\n *(int*)(s + 0x714) = f;\n *(short*)(self + 0x4718) = 0x200;\n func_ov006_020c0134((Camera*)(self + 0x4660));\n } else {\n char* s = self + 0x4000;\n *(int*)(s + 0x700) = 0;\n *(int*)(s + 0x704) = -0x60000;\n *(int*)(s + 0x708) = 0;\n *(int*)(s + 0x70c) = 0;\n *(int*)(s + 0x710) = 0;\n *(int*)(s + 0x714) = f;\n *(short*)(self + 0x4718) = 0x200;\n func_ov006_020c0134((Camera*)(self + 0x4660));\n }\n {\n int* m = (int*)(self + 0xa000);\n t.y = (m[0xb6c/4] - m[0xb3c/4]) + 0x110000;\n t.x = m[0xb38/4] - 0x80000;\n t.z = 0;\n }\n Matrix4x3_FromTranslation(&data_020a0e68, t);\n Matrix4x3_ApplyInPlaceToRotationZ(&data_020a0e68, *(short*)(self + 0xab7c));\n Matrix4x3_ApplyInPlaceToRotationX(&data_020a0e68, *(short*)(self + 0xab78));\n Matrix4x3_ApplyInPlaceToRotationY(&data_020a0e68, *(short*)(self + 0xab7a));\n *(Mtx43*)(self + 0xabc0) = data_020a0e68;\n}\n", "source": "fanout"} {"module": "ov007", "addr": "0x020b8d48", "name": "func_ov007_020b8d48", "size": 376, "target_hex": "f0472de948219fe5f00051e300c092e50100000aee0051e30000001a0dc0a0e34d0051e32c019f05001090050410810200108005f047bd081eff2f014d0051e314219f1504e0a00301e0d21704319fe50050a0e3010051e302508502002093e505e04ee0052082e0014c6ee2002083e5040052e1f047bda81eff2fa1dc409fe5c132a0e1831241e0038381e0d0309fe5d0a09fe5d0509fe5c211a0e1009093e5c8709fe5813142e0c4609fe50321a0e1b040d4e10888a0e100019ae7284884e00448a0e1898281e0005095e5a416a0e10c7197e7034196e7888280e0016185e0205062e20090a0e3041096e4000098e5071001e0040000e0110280e1000088e5000053e30500000a200088e200c090e504a0e0e10aa00ce031158ae1001080e5070059e3048088e2019089e23e8e88023e6e8602100059e3eaffffba14009fe5001090e50e1081e0001080e5f047bde81eff2fe1d82d100264341002f82d10025834100268341002783410025c341002c47a0d02a07a0d02", "lang": "c", "divergences": 50, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\n\nextern u32 data_ov007_02102dd8;\nextern int data_ov007_02103464;\nextern u8 data_ov007_02102df8[];\nextern u16 data_ov007_02103458;\nextern int data_ov007_02103468;\nextern u32* data_ov007_02103478[];\nextern u32* data_ov007_0210345c;\nextern u32 data_ov007_020d7ac4[];\nextern u32 data_ov007_020d7aa0[];\n\nvoid func_ov007_020b8d48(int r0arg, int sel)\n{\n u32 pat;\n int amt;\n int cnt;\n int col, rowblk, tileidx;\n int cx, cbit, sh, inv_sh;\n u32 mask;\n u32* dst;\n u32* src;\n int i;\n int add;\n\n pat = data_ov007_02102dd8;\n if (sel == 0xf0 || sel == 0xee) pat = 0xd;\n\n if (sel == 0x4d) {\n data_ov007_02103464 += 4;\n return;\n }\n\n if (sel == 0x4d) amt = 4;\n else amt = data_ov007_02102df8[sel];\n\n add = 0;\n if (sel == 1) add = add + 2;\n amt = amt - add;\n\n cnt = data_ov007_02103464 + add;\n data_ov007_02103464 = cnt;\n if (cnt >= 0x100 - amt) return;\n\n rowblk = sel >> 5;\n col = sel - (rowblk << 5);\n tileidx = col + (rowblk << 6);\n\n cx = cnt >> 3;\n cbit = cnt - (cx << 3);\n sh = cbit << 2;\n\n tileidx = ((int)((data_ov007_02103458 + (u16)tileidx) << 16)) >> 13;\n\n dst = (u32*)((char*)data_ov007_02103478[r0arg] +\n (((cx + (data_ov007_02103468 << 5)) << 5) << 2));\n src = data_ov007_0210345c + tileidx;\n\n pat = data_ov007_020d7ac4[pat];\n mask = data_ov007_020d7aa0[cbit];\n inv_sh = 0x20 - sh;\n\n for (i = 0; i < 0x10; i++) {\n u32 sv = *src++;\n u32 dv = *dst;\n sv = sv & pat;\n *dst = (dv & mask) | (sv << sh);\n if (cbit != 0) {\n u32* d2 = dst + 8;\n *d2 = (*d2 & ~mask) | (sv >> inv_sh);\n }\n dst++;\n if ((i & 7) == 7) {\n dst = (u32*)((char*)dst + 0x3e0);\n src = (u32*)((char*)src + 0x3e0);\n }\n }\n\n data_ov007_02103464 += amt;\n}\n", "source": "fanout-glm-5.2"} @@ -470,7 +470,7 @@ {"module": "ov007", "addr": "0x020c704c", "name": "func_ov007_020c704c", "size": 372, "target_hex": "f04f2de904d04de20060a0e1007096e528009de5005091e5004097e5048091e5045045e0044097e59575c9e002cba0e30ca097e0044048e09484c7e00090a9e22aa6a0e190e0cbe00c8098e000208de50000a7e22826a0e10c709ee009aa8ae1002a82e102008ae00020abe22776a0e1027a87e1070050e1c48fa0e1c57fa0e10020a0e3110000ca182086e5180096e504d08de2140086e5140096e5100086e5100096e50c0086e50c0096e5080086e5080096e5040086e5003096e5070091e8070083e80200a0e3f04fbde81eff2fe19393c1e00c3099e00210a1e02336a0e1013a83e1030050e104d08dc20200a0c1f04fbdc81eff2fc11630feeb0010a0e100009de54030feeb90b58ae0909483e090a72ae0903823e0c00fa0e1022ba0e302709be090a52ae0903423e0101086e20000aae22776a0e1004091e5007a87e1070084e0022099e0000081e52216a0e10000a3e21420b6e5001a81e1010082e0000086e50100a0e304d08de2f04fbde81eff2fe1", "lang": "c", "divergences": 67, "c_source": "typedef long long s64;\n\nextern int func_020531a4(int a);\nextern int _ZN4cstd4fdivEii(int a, int b);\n\ntypedef struct Vec3 {\n int x;\n int y;\n int z;\n} Vec3;\n\ntypedef struct S {\n Vec3 *p;\n int f4;\n int f8;\n int fc;\n int f10;\n int f14;\n int f18;\n} S;\n\n#pragma opt_common_subs off\n\nint func_ov007_020c704c(S *self, Vec3 *b, int r2arg, int r3arg, int radius)\n{\n int d3 = (int)(((s64)radius * radius + 0x800) >> 12);\n int dx = b->x - self->p->x;\n int dy = b->y - self->p->y;\n int sum = (int)(((s64)dx * dx + 0x800) >> 12) + (int)(((s64)dy * dy + 0x800) >> 12);\n\n if (sum <= d3) {\n self->f18 = 0;\n self->f14 = self->f18;\n self->f10 = self->f14;\n self->fc = self->f10;\n self->f8 = self->fc;\n self->f4 = self->f8;\n *self->p = *b;\n return 2;\n }\n if (sum > (int)(((s64)r3arg * r3arg + 0x800) >> 12)) {\n return 0;\n }\n\n int spd = func_020531a4(sum);\n int ratio = _ZN4cstd4fdivEii(r2arg, spd);\n self->f10 = self->f10 + (int)(((s64)ratio * dx + 0x800) >> 12);\n self->f14 = self->f14 + (int)(((s64)ratio * dy + 0x800) >> 12);\n return 1;\n}\n", "source": "claude-sonnet5"} {"module": "ov002", "addr": "0x020cbea8", "name": "func_ov002_020cbea8", "size": 372, "target_hex": "30402de904d04de20050a0e1f80295e5000050e304d08d020000a0033040bd081eff2f01f41295e5011511e204d08d020000a0033040bd081eff2f011414fdeb0040b0e10100000a050054e10300001a04d08de20000a0e33040bde81eff2fe1bc00d4e1bf0050e30100a0030000a013000050e304d08d020000a0033040bd081eff2f017c0395e5000050e30200000a7c0394e5000050e30300001a04d08de20000a0e33040bde81eff2fe10500a0e12f0000eb000050e30300001a0400a0e12b0000eb000050e30300000a04d08de20100a0e33040bde81eff2fe1a82095e5e40295e5000052e30200000aa81094e5000051e30000001a8000a0e1000052e30800000a64109fe5062c85e201c085e000309ce50010a0e3803083e000308ce5bc19c2e1a81085e5a81094e5000051e30a00000a34109fe5062c84e2015084e0003095e50010a0e3800043e0000085e5bc19c2e1ac0094e5a81084e5ac0084e50000a0e304d08de23040bde81eff2fe188060000", "lang": "c", "divergences": 68, "c_source": "extern char* _ZN5Actor10FindWithIDEj(unsigned int id);\nextern int func_ov002_020cc01c(char* c);\n\nint func_ov002_020cbea8(char* self)\n{\n char* other;\n unsigned int id = *(unsigned int*)(self + 0x2f8);\n int v;\n\n if (id == 0) return 0;\n if ((*(int*)(self + 0x2f4) & 0x400000) == 0) return 0;\n other = _ZN5Actor10FindWithIDEj(id);\n if (other == 0) return 0;\n if (other == self) return 0;\n if (*(unsigned short*)(other + 0xc) != 0xbf) return 0;\n if (*(int*)(self + 0x37c) == 0) return 0;\n if (*(int*)(other + 0x37c) == 0) return 0;\n\n if (func_ov002_020cc01c(self) != 0) return 1;\n if (func_ov002_020cc01c(other) != 0) return 1;\n\n v = *(int*)(self + 0x2e4);\n if (*(int*)(self + 0xa8) == 0 || *(int*)(other + 0xa8) == 0)\n v <<= 1;\n\n if (*(int*)(self + 0xa8) != 0) {\n *(int*)(self + 0x688) += v << 1;\n *(short*)(self + 0x69c) = 0;\n *(int*)(self + 0xa8) = 0;\n }\n if (*(int*)(other + 0xa8) != 0) {\n *(int*)(other + 0x688) -= v << 1;\n *(short*)(other + 0x69c) = 0;\n *(int*)(other + 0xac) = *(int*)(other + 0xac);\n *(int*)(other + 0xa8) = 0;\n }\n return 0;\n}", "source": "fanout-opus"} {"module": "ov002", "addr": "0x020d869c", "name": "func_ov002_020d869c", "size": 412, "target_hex": "70402de910d04de20040a0e1d00094e5000050e30200001a1307d4e5000050e30300001a10d08de20000a0e37040bde81eff2fe1f80294e5000050e310d08d020000a0037040bd081eff2f0113e2fceb0060b0e10100000a040056e10300001a10d08de20000a0e37040bde81eff2fe1bc00d6e1bf0050e30100a0030000a013000050e310d08d020000a0037040bd081eff2f01f41294e5f8009fe5005011e00e00000a0400a0e10610a0e10520a0e1aaffffeb010050e310d08d020000a0037040bd081eff2f01012ad5e32d00000a0400a0e10610a0e1f9feffeb290000ea0907d4e5000050e310d08d120000a0137040bd181eff2f110400a0e10620a0e1b51f84e269dffceb000050e31d00000a0600a0e1e1a9ffeb000050e310d08d020000a0037040bd081eff2f010600a0e1b10200eb000050e31200000a0400a0e10010a0e3350c00eb600094e5643094e55c1094e5822a80e2b200a0e300108de504208de508308de5a329fdeb741084e21200a0e38de7fcebd906d4e5742084e21910a0e34be6fceb0100a0e310d08de27040bde81eff2fe1e07f0200", "lang": "c", "divergences": 68, "c_source": "extern char* _ZN5Actor10FindWithIDEj(unsigned int id);\nextern int func_ov002_020d85fc(char* self, char* arg, int flags);\nextern void func_ov002_020d8360(char* self, char* other);\nextern int _ZN5Actor16JumpedOnByPlayerER12CylinderClsnR6Player(char* self, char* clsn, char* player);\nextern int _ZN6Player7IsInAirEv(char* p);\nextern int func_ov002_020d9298(char* c);\nextern void func_ov002_020db8bc(unsigned char* p, unsigned char val);\ntypedef struct { int v; } Fix12;\nextern void _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(unsigned int id, Fix12 x, Fix12 y, Fix12 z);\nextern void _ZN5Sound9PlayBank0EjRK7Vector3(unsigned int id, void* pos);\nextern void _ZN5Sound13PlayCharVoiceEjjRK7Vector3(unsigned int a, unsigned int b, void* pos);\n\nint func_ov002_020d869c(char* self)\n{\n char* other;\n int flags;\n\n if (*(int*)(self + 0xd0) != 0 || *(unsigned char*)(self + 0x713) == 0) return 0;\n if (*(int*)(self + 0x2f8) == 0) return 0;\n other = _ZN5Actor10FindWithIDEj(*(unsigned int*)(self + 0x2f8));\n if (other == 0) return 0;\n if (other == self) return 0;\n {\n int b = (*(unsigned short*)(other + 0xc) == 0xbf);\n if (b == 0) return 0;\n }\n\n flags = *(int*)(self + 0x2f4) & 0x27fe0;\n if (flags != 0) {\n if (func_ov002_020d85fc(self, other, flags) == 1) return 0;\n if (flags & ~0x1000)\n func_ov002_020d8360(self, other);\n return 1;\n }\n\n if (*(unsigned char*)(self + 0x709) != 0) return 0;\n if (_ZN5Actor16JumpedOnByPlayerER12CylinderClsnR6Player(self, self + 0x2d4, other) == 0)\n return 1;\n if (_ZN6Player7IsInAirEv(other) == 0) return 0;\n if (func_ov002_020d9298(other) == 0) return 1;\n\n func_ov002_020db8bc((unsigned char*)self, 0);\n {\n Fix12 x = { *(int*)(self + 0x5c) };\n Fix12 y = { *(int*)(self + 0x60) + 0x82000 };\n Fix12 z = { *(int*)(self + 0x64) };\n _ZN8Particle6System9NewSimpleEj5Fix12IiES2_S2_(0xb2, x, y, z);\n }\n _ZN5Sound9PlayBank0EjRK7Vector3(0x12, self + 0x74);\n _ZN5Sound13PlayCharVoiceEjjRK7Vector3(*(unsigned char*)(self + 0x6d9), 0x19, self + 0x74);\n return 1;\n}", "source": "fanout-opus"} -{"module": "ov006", "addr": "0x020f9db8", "name": "func_ov006_020f9db8", "size": 392, "target_hex": "30402de90cd04de2140051e30040a0e10cd08da23040bda81eff2fa1fa02d4e1140050e30e0000ba44219fe50308a0e3f030d2e1002060e238019fe54331a0e18330a0e1703063e20336a0e10c3084e5102084e5004080e50100a0e32d00c4e5190000ea2d00d4e5000050e31000001afc209fe50308a0e3f030d2e1000060e20420a0e34331a0e18330a0e1703063e20336a0e10c3084e5100084e5d8009fe52d20c4e5f020d0e1012082e2b020c0e1050000ea0420a0e3bc009fe52d20c4e5f020d0e1012082e2b020c0e1ac209fe5a1cfa0e19201c5e09201cee0c550a0e19c309fe505508ce09305c2e0005041e08502a0e1cee0a0e1300080e20026a0e10ee08ce03000a0e39e0000e0142084e50006a0e1180084e5ba12c4e100008de2141084e20c2084e2fa0dfdeb00109de51c0084e21c1084e504209de5491fa0e3202084e5cb0dfdeb1c0094e5000050e3000060b21c0084b5200094e5000050e3000060b2200084b50cd08de23040bde81eff2fe1f4d61302782514025c2514026766666605000000", "lang": "cpp", "divergences": 68, "c_source": "//cpp\n// NONMATCHING: timer intro/camera path (div~999, size 0x198 vs 0x188 \u2014 closest in\n// batch). smull div-by-5 idiom + func_0203d6d0/630 call order wall.\nextern \"C\" void func_0203d6d0(int *out, int *a, int *b);\nextern \"C\" void func_0203d630(int *p, int mode);\n\nextern int data_ov006_0213d6f4;\nextern int data_ov006_02142578;\nextern int data_ov006_0214255c;\n\nextern \"C\" void func_ov006_020f9db8(char *obj, int timer)\n{\n int tmp[2];\n int x;\n int y;\n int q;\n int r;\n\n if (timer >= 0x14)\n return;\n if (*(short *)(obj + 0x2a) >= 0x14) {\n *(int *)(obj + 0xc) = (0x70 - ((*(short *)&data_ov006_0213d6f4 >> 2) << 1)) << 12;\n *(int *)(obj + 0x10) = -0x30000;\n data_ov006_02142578 = (int)obj;\n obj[0x2d] = 1;\n } else if (obj[0x2d] == 0) {\n *(int *)(obj + 0xc) = (0x70 - ((*(short *)&data_ov006_0213d6f4 >> 2) << 1)) << 12;\n *(int *)(obj + 0x10) = -0x30000;\n obj[0x2d] = 4;\n *(short *)&data_ov006_0214255c = (short)(*(short *)&data_ov006_0214255c + 1);\n } else {\n obj[0x2d] = 4;\n *(short *)&data_ov006_0214255c = (short)(*(short *)&data_ov006_0214255c + 1);\n q = (int)(((long long)0x66666667 * (long long)timer) >> 32);\n q = (q >> 1) + (timer >> 31);\n r = timer - q * 5;\n x = ((r << 5) + 0x30) << 12;\n y = ((q + (timer >> 31)) * 0x30) << 12;\n *(int *)(obj + 0x14) = x;\n *(int *)(obj + 0x18) = y;\n *(short *)(obj + 0x2a) = (short)timer;\n func_0203d6d0(tmp, (int *)(obj + 0x14), (int *)(obj + 0xc));\n *(int *)(obj + 0x1c) = tmp[0];\n *(int *)(obj + 0x20) = tmp[1];\n func_0203d630((int *)(obj + 0x1c), 0x124);\n if (*(int *)(obj + 0x1c) < 0)\n *(int *)(obj + 0x1c) = -*(int *)(obj + 0x1c);\n if (*(int *)(obj + 0x20) < 0)\n *(int *)(obj + 0x20) = -*(int *)(obj + 0x20);\n }\n}", "source": "stranded-recovery-20260709"} +{"module": "ov006", "addr": "0x020f9db8", "name": "func_ov006_020f9db8", "size": 392, "target_hex": "30402de90cd04de2140051e30040a0e10cd08da23040bda81eff2fa1fa02d4e1140050e30e0000ba44219fe50308a0e3f030d2e1002060e238019fe54331a0e18330a0e1703063e20336a0e10c3084e5102084e5004080e50100a0e32d00c4e5190000ea2d00d4e5000050e31000001afc209fe50308a0e3f030d2e1000060e20420a0e34331a0e18330a0e1703063e20336a0e10c3084e5100084e5d8009fe52d20c4e5f020d0e1012082e2b020c0e1050000ea0420a0e3bc009fe52d20c4e5f020d0e1012082e2b020c0e1ac209fe5a1cfa0e19201c5e09201cee0c550a0e19c309fe505508ce09305c2e0005041e08502a0e1cee0a0e1300080e20026a0e10ee08ce03000a0e39e0000e0142084e50006a0e1180084e5ba12c4e100008de2141084e20c2084e2fa0dfdeb00109de51c0084e21c1084e504209de5491fa0e3202084e5cb0dfdeb1c0094e5000050e3000060b21c0084b5200094e5000050e3000060b2200084b50cd08de23040bde81eff2fe1f4d61302782514025c2514026766666605000000", "lang": "cpp", "divergences": 68, "c_source": "//cpp\n// NONMATCHING: timer intro/camera path (div~999, size 0x198 vs 0x188 — closest in\n// batch). smull div-by-5 idiom + func_0203d6d0/630 call order wall.\nextern \"C\" void func_0203d6d0(int *out, int *a, int *b);\nextern \"C\" void func_0203d630(int *p, int mode);\n\nextern int data_ov006_0213d6f4;\nextern int data_ov006_02142578;\nextern int data_ov006_0214255c;\n\nextern \"C\" void func_ov006_020f9db8(char *obj, int timer)\n{\n int tmp[2];\n int x;\n int y;\n int q;\n int r;\n\n if (timer >= 0x14)\n return;\n if (*(short *)(obj + 0x2a) >= 0x14) {\n *(int *)(obj + 0xc) = (0x70 - ((*(short *)&data_ov006_0213d6f4 >> 2) << 1)) << 12;\n *(int *)(obj + 0x10) = -0x30000;\n data_ov006_02142578 = (int)obj;\n obj[0x2d] = 1;\n } else if (obj[0x2d] == 0) {\n *(int *)(obj + 0xc) = (0x70 - ((*(short *)&data_ov006_0213d6f4 >> 2) << 1)) << 12;\n *(int *)(obj + 0x10) = -0x30000;\n obj[0x2d] = 4;\n *(short *)&data_ov006_0214255c = (short)(*(short *)&data_ov006_0214255c + 1);\n } else {\n obj[0x2d] = 4;\n *(short *)&data_ov006_0214255c = (short)(*(short *)&data_ov006_0214255c + 1);\n q = (int)(((long long)0x66666667 * (long long)timer) >> 32);\n q = (q >> 1) + (timer >> 31);\n r = timer - q * 5;\n x = ((r << 5) + 0x30) << 12;\n y = ((q + (timer >> 31)) * 0x30) << 12;\n *(int *)(obj + 0x14) = x;\n *(int *)(obj + 0x18) = y;\n *(short *)(obj + 0x2a) = (short)timer;\n func_0203d6d0(tmp, (int *)(obj + 0x14), (int *)(obj + 0xc));\n *(int *)(obj + 0x1c) = tmp[0];\n *(int *)(obj + 0x20) = tmp[1];\n func_0203d630((int *)(obj + 0x1c), 0x124);\n if (*(int *)(obj + 0x1c) < 0)\n *(int *)(obj + 0x1c) = -*(int *)(obj + 0x1c);\n if (*(int *)(obj + 0x20) < 0)\n *(int *)(obj + 0x20) = -*(int *)(obj + 0x20);\n }\n}", "source": "stranded-recovery-20260709"} {"module": "arm9", "addr": "0x0204bbd8", "name": "func_0204bbd8", "size": 616, "target_hex": "f0432de93cd04de20160a0e1b014d6e10070a0e1342097e5010ba0e1811da0e1a00da0e1a11da0e1010080e2910003e0180092e5741092e5004090e5300097e50117a0e1211da0e1c00080e3f052d4e1c332a0e1010c80e1381097e5f4419fe5030880e1000084e5740082e2008090e5004094e50847a0e1244da0e1014084e23f8ac8e33f4004e2044688e1004080e5744092e50427a0e1228da0e1042aa0e1220d58e10600009a042da0e1004090e5222da0e13f4ac4e33f2002e2022684e1002080e5000053e33cd08d02f043bd081eff2f01f433d6e1304096e5142096e5080096e59483c3e0000082e000008de5020ba0e3008098e0184096e50c2096e500008de2022084e004208de52846a0e10030a3e21c9096e5108096e50020a0e1088089e008808de5034a84e1d31a00ebb603d6e100209de504e09de530208de54002a0e180c0a0e101008ce208809de5013aa0e334e08de59455c2e0f8909fe58000a0e102eba0e30010a0e32c308de50e3095e038808de58c50a0e1f00099e10020a2e22386a0e1028a88e1f55099e19098c3e0002065e295c8c8e00e5099e00030a3e22556a0e1035a85e10c508de59294c5e09034c2e00e4099e00000a5e22446a0e1004a84e118408de50e409ce00000a8e20e3093e02446a0e1004a84e10000a2e22336a0e1003a83e16c209fe510408de524108de51c308de528108de514108de520108de50c008de2001082e5662500ebba13d6e144009fe5001080e5340097e5180090e5140090e5100090e5001fa0e1000ea0e1212fa0e1201fa0e1ff0002e2ff1001e2090100eb3cd08de2f043bde81eff2fe1a4040004142208025404000480040004", "lang": "c", "divergences": 68, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef short s16;\ntypedef unsigned int u32;\ntypedef long long s64;\n\ntypedef struct { int x, y, z; } Vec3;\n\ntypedef struct {\n u32 start : 6;\n u32 limit : 6;\n u32 count : 6;\n u32 : 14;\n} Cnt74;\n\ntypedef struct {\n char _pad[0x20];\n s16 q20;\n} P0;\n\ntypedef struct {\n char _pad[0x10];\n u32 b0 : 2;\n u32 b1 : 2;\n u32 : 28;\n} Bdat;\n\ntypedef struct {\n P0 *p0;\n char _pad[0x10];\n Bdat *p14;\n} Adat;\n\ntypedef struct {\n char _pad[0x18];\n Adat *p18;\n char _pad2[0x74 - 0x1c];\n Cnt74 cnt;\n} Ctx;\n\ntypedef struct {\n u16 lo : 5;\n u16 hi : 5;\n u16 : 6;\n} M40;\n\ntypedef struct {\n char _pad0[8];\n int p8;\n int pc;\n int p10;\n int p14;\n int p18;\n int p1c;\n char _pad20[0x10];\n int p30;\n s16 p34;\n u16 p36;\n char _pad38[2];\n u16 p3a;\n char _pad3c[4];\n M40 p40;\n} Node;\n\ntypedef struct {\n char _pad[0x30];\n int p30;\n Ctx *p34;\n int *p38;\n} Self;\n\nextern void MulVec3Mat4x3(Vec3 *v, int *m, Vec3 *dst);\nextern void func_02055388(int *m);\nextern void func_0204c24c(u8 a, u8 b);\nextern short data_02082214[];\n\n#define FX(a, b) ((int)(((s64)(a) * (b) + 0x800) >> 12))\n\nvoid func_0204bbd8(Self *self, Node *node)\n{\n int alpha = (node->p40.lo * (node->p40.hi + 1)) >> 5;\n s16 q;\n u32 cur;\n int *m_in;\n\n {\n Ctx *c = self->p34;\n Adat *p18 = c->p18;\n cur = c->cnt.count;\n P0 *obj = p18->p0;\n q = obj->q20;\n m_in = self->p38;\n\n *(volatile u32*)0x40004a4 = (self->p30 | 0xc0) | (cur << 24) | (alpha << 16);\n *(volatile u32*)0x40004a4;\n\n {\n Cnt74 *qq = (Cnt74*)(u32)(((s64)(int)&c->cnt) & 0xFFFFFFFFFFFFFFFFLL);\n qq->count++;\n if (c->cnt.count > c->cnt.limit)\n qq->count = c->cnt.start;\n }\n }\n\n if (alpha == 0)\n return;\n\n {\n Vec3 vv;\n int scale;\n\n scale = FX(node->p30, node->p34);\n vv.x = node->p14 + node->p8;\n vv.y = node->p18 + node->pc;\n vv.z = node->p1c + node->p10;\n\n MulVec3Mat4x3(&vv, m_in, &vv);\n\n {\n int a = node->p36 >> 4;\n int amt = FX(scale, q);\n s16 sinV = data_02082214[a * 2 + 1];\n s16 cosV = data_02082214[a * 2];\n int mat[12];\n\n mat[9] = vv.x;\n mat[10] = vv.y;\n mat[8] = 0x1000;\n mat[11] = vv.z;\n\n mat[0] = FX(sinV, amt);\n mat[3] = FX(-cosV, scale);\n mat[1] = FX(cosV, amt);\n mat[6] = 0;\n mat[4] = FX(sinV, scale);\n mat[7] = 0;\n mat[2] = 0;\n mat[5] = 0;\n\n *(volatile u32*)0x4000454 = 0;\n func_02055388(mat);\n }\n }\n\n *(volatile u32*)0x4000480 = node->p3a;\n\n {\n Bdat *b = self->p34->p18->p14;\n func_0204c24c(b->b0, b->b1);\n }\n}\n", "source": "fanout"} {"module": "ov004", "addr": "0x020b2220", "name": "func_ov004_020b2220", "size": 548, "target_hex": "f04f2de91cd04de208429fe50280a0e100a0a0e1040058e10480a0a10000a0e30190a0e10370a0e140609de50040a0e10050a0e1fa0f58e3030000bafa8f48e2fa0f58e3010080e2fbffffaa640058e3030000ba648048e2640058e3014084e2fbffffaa0a0058e3030000ba0a8048e20a0058e3015085e2fbffffaab814dde194219fe544309de54112a0e181c0a0e101108ce281b0a0e18c10a0e1fbc092e1f1b092e1021ba0e39c23cee001c092e09b33c2e000b0aee2013093e00010a2e22326a0e1012a82e12c36a0e10b3a83e1001062e208308de50c208de510108de514308de5000050e31c00000a08208de200608de504208de520119fe50920a0e1000191e70730a0e130104ae24dfeffeb08108de200608de504108de5fc009fe50920a0e1040190e70730a0e110104ae244feffeb00608de508108de204108de5d8009fe510108ae2050190e70920a0e10730a0e13bfeffeb30a08ae2210000ea000054e31300000a08108de200608de504108de5a4009fe50920a0e1040190e70730a0e120104ae22efeffeb08108de200608de504108de580009fe50a10a0e1050190e70920a0e10730a0e125feffeb20a08ae20b0000ea000055e30900000a08108de200608de504108de54c009fe50920a0e1050190e70730a0e110104ae218feffeb10a08ae208108de200608de504108de524009fe50a10a0e1080190e70920a0e10730a0e10efeffeb1cd08de2f04fbde81eff2fe10f27000014220802d87c1302", "lang": "c", "divergences": 68, "c_source": "typedef unsigned short u16;\ntypedef long long s64;\n\nextern void func_ov004_020b1c68(void* a0, void* a1, int a2, int a3, int a4, void* a5);\nextern short data_02082214[];\nextern void* data_ov006_02137cd8[];\n\nvoid func_ov004_020b2220(char* sl, int sb, int value, int r7, int r6, int fix, u16 angle)\n{\n char *base = sl;\n int th, te, hu;\n int off[4];\n int idx;\n int d0, d1;\n\n if (value >= 0x270f)\n value = 0x270f;\n th = 0;\n hu = 0;\n te = 0;\n if (value >= 0x3e8) {\n do { value -= 0x3e8; th++; } while (value >= 0x3e8);\n }\n if (value >= 0x64) {\n do { value -= 0x64; hu++; } while (value >= 0x64);\n }\n if (value >= 0xa) {\n do { value -= 0xa; te++; } while (value >= 0xa);\n }\n\n idx = angle >> 4;\n d1 = (int)(((s64)data_02082214[idx * 2 + 1] * fix + 0x800) >> 12);\n d0 = (int)(((s64)data_02082214[idx * 2] * fix + 0x800) >> 12);\n off[0] = d0;\n off[1] = d1;\n off[2] = -d1;\n off[3] = d0;\n\n if (th != 0) {\n func_ov004_020b1c68(data_ov006_02137cd8[th], base - 0x30, sb, r7, r6, off);\n func_ov004_020b1c68(data_ov006_02137cd8[hu], base - 0x10, sb, r7, r6, off);\n func_ov004_020b1c68(data_ov006_02137cd8[te], base + 0x10, sb, r7, r6, off);\n base += 0x30;\n } else if (hu != 0) {\n func_ov004_020b1c68(data_ov006_02137cd8[hu], base - 0x20, sb, r7, r6, off);\n func_ov004_020b1c68(data_ov006_02137cd8[te], base, sb, r7, r6, off);\n base += 0x20;\n } else if (te != 0) {\n func_ov004_020b1c68(data_ov006_02137cd8[te], base - 0x10, sb, r7, r6, off);\n base += 0x10;\n }\n func_ov004_020b1c68(data_ov006_02137cd8[value], base, sb, r7, r6, off);\n}\n", "source": "fanout-gpt-5.6-luna"} {"module": "ov006", "addr": "0x020e26f8", "name": "func_ov006_020e26f8", "size": 356, "target_hex": "30402de904d04de23c219fe53c419fe50030d2e50321d4e70351a0e1000052e32700000a2c20a0e3910202e020119fe520419fe501e080e00540d4e718119fe502509ee701c080e0041685e002108ce7020080e002409ce702108ee044e6a0e10e005ee302508ce00e4aa0b3004085b5f2005ee3f24aa0c3004085c5d4c09fe5d8409fe50321dce700e095e5010980e24ec6a0e102204ce0645690e50331d4e74546a0e10226a0e1033044e0002081e50316a0e1781680e504d08de23040bde81eff2fe12c20a0e3910222e0011982e20020a0e38826c1e5012980e2b0ee92e560c691e5643691e5b40e92e50cc04ee0031040e04cc6a0e12d00e0e300005ce104d08db24116a0e13040bdb81eff2fb12e005ce304d08dc23040bdc81eff2fc11300e0e3000051e104d08db23040bdb81eff2fb1140051e3150a83d2b40e82d504d08de23040bde81eff2fe1400e0a02e80d0a0274460000ea0d0a0260460000eb0d0a02", "lang": "c", "divergences": 69, "c_source": "typedef unsigned char u8;\n\nextern u8 data_020a0e40;\nextern u8 data_020a0de8[];\nextern u8 data_020a0dea[];\nextern u8 data_020a0deb[];\n\n#pragma opt_strength_reduction off\n\nvoid func_ov006_020e26f8(char *self, int idx)\n{\n u8 i;\n int n;\n int v;\n int w;\n int x;\n int y;\n int dy;\n int dx;\n char *slot;\n char *base74;\n char *base60;\n char *r2base;\n\n i = data_020a0e40;\n if (data_020a0de8[i] != 0) {\n n = idx * 0x2c;\n base74 = self + 0x4674;\n base60 = self + 0x4660;\n v = *(int *)(base74 + n);\n *(int *)(base60 + n) = v + (data_020a0dea[i] << 0xc);\n v = *(int *)(base60 + n);\n w = v >> 0xc;\n if (w < 0xe) {\n *(int *)(base60 + n) = 0xe000;\n }\n if (w > 0xf2) {\n *(int *)(base60 + n) = 0xf2000;\n }\n slot = self + n + 0x4000;\n v = *(int *)(base60 + n);\n x = (v >> 0xc) - data_020a0dea[i];\n y = (*(int *)(slot + 0x664) >> 0xc) - data_020a0deb[i];\n *(int *)(base74 + n) = x << 0xc;\n *(int *)(slot + 0x678) = y << 0xc;\n return;\n }\n\n n = idx * 0x2c;\n *(u8 *)(self + n + 0x4688) = 0;\n r2base = self + 0x4000;\n v = *(int *)(r2base + 0xeb0);\n w = *(int *)(self + n + 0x4660);\n x = *(int *)(self + n + 0x4664);\n y = *(int *)(r2base + 0xeb4);\n dy = (v - w) >> 0xc;\n if (dy < -0x2e) {\n return;\n }\n dx = (y - x) >> 0xc;\n if (dy > 0x2e) {\n return;\n }\n if (dx < -0x14) {\n return;\n }\n if (dx > 0x14) {\n return;\n }\n if (dx <= 0x14) {\n *(int *)(r2base + 0xeb4) = x + 0x15000;\n }\n}", "source": "stranded-recovery-20260709"} @@ -519,7 +519,7 @@ {"module": "ov002", "addr": "0x020ecd18", "name": "func_ov002_020ecd18", "size": 636, "target_hex": "70402de910d04de20050a0e1100495e50040a0e3000050e30100000a8090fceb0040a0e1000054e30b00000ab00094e5010210e20100a0130000a003000050e30500001a0500a0e10110a0e3340200eb10d08de27040bde81eff2fe1100495e5000050e30700000a000054e30500001a0500a0e10110a0e3290200eb10d08de27040bde81eff2fe1b01095e50060a0e3010c11e20100a0130600a001000050e35b00001a020a11e20100a0130000a003000050e30300000a0500a0e10310a0e3170200eb520000ea010b11e20100a0130000a003000050e34d00000a510f85e20822fdeb000050e30700000a0500a0e1511f85e217feffeb0500a0e1a20300eb10d08de27040bde81eff2fe1000054e33400000a0410a0e1002091e500008de2782092e532ff2fe1982095e500108de25c0085e2923afdeb000050e32500000abc10d4e1ca0051e30d0000caca0051e3130000aabe0051e3060000cabd0051e3140000babd0051e30d00000abe0051e30b00000a0f0000eac60051e30800000a0c0000eadb0051e3020000cadb0051e30300000a070000ead8009fe5000051e10400001a0500a0e1770300eb10d08de27040bde81eff2fe10500a0e113feffeb0500a0e10110a0e3d50100eb10d08de27040bde81eff2fe100108de25c0085e22b3afdebbe08c5e15c0095e5601095e5642095e511d7fceb0500a0e10160a0e3a90300eb000050e310d08d127040bd181eff2f110500a0e1e50100eb000050e30400000a0500a0e1570300eb10d08de27040bde81eff2fe1110e85e232a0fceb010056e30100001a110e85e221a0fceb000054e30200001a0500a0e1111e85e22c8ffceb510f85e21d2dfdeb10d08de27040bde81eff2fe151010000", "lang": "cpp", "divergences": 83, "c_source": "//cpp\ntypedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\n\nstruct Vector3 { int x, y, z; };\n\nstruct Obj {\n virtual void v0(); virtual void v1(); virtual void v2(); virtual void v3();\n virtual void v4(); virtual void v5(); virtual void v6(); virtual void v7();\n virtual void v8(); virtual void v9(); virtual void v10(); virtual void v11();\n virtual void v12(); virtual void v13(); virtual void v14(); virtual void v15();\n virtual void v16(); virtual void v17(); virtual void v18(); virtual void v19();\n virtual void v20(); virtual void v21(); virtual void v22(); virtual void v23();\n virtual void v24(); virtual void v25(); virtual void v26(); virtual void v27();\n virtual void v28(); virtual void v29(); virtual Vector3 v30();\n};\n\nextern \"C\" {\nvoid *_ZN5Actor10FindWithIDEj(u32 id);\nvoid func_ov002_020ed63c(char *c, int i);\nint _ZNK12WithMeshClsn14GetResultFlag1Ev(void *p);\nvoid func_ov002_020ec670(char *self, void *arg);\nvoid func_ov002_020edca4(char *c);\nint _Z14ApproachLinearR7Vector3RKS_5Fix12IiE(void *dst, void *src, int fix);\nvoid func_ov002_020ec728(char *c);\nshort Vec3_HorzAngle(void *a, void *b);\nvoid _ZN8Particle20RunningSlidingDustAtE5Fix12IiES1_S1_(int x, int y, int z);\nint func_ov002_020eddc4(char *self);\nint func_ov002_020ed6cc(void *c);\nvoid _ZN12CylinderClsn5ClearEv(void *c);\nvoid _ZN12CylinderClsn6UpdateEv(void *c);\nvoid _ZN5Actor9UpdatePosEP12CylinderClsn(void *self, void *cc);\nvoid func_020383fc(void *p);\n}\n\nextern \"C\" void func_ov002_020ecd18(char *c)\n{\n char *r4 = 0;\n int r6;\n\n if (*(int *)(c + 0x410) != 0) {\n r4 = (char *)_ZN5Actor10FindWithIDEj(*(u32 *)(c + 0x410));\n if (r4 != 0) {\n int b = ((*(int *)(r4 + 0xb0) & 0x10000000) != 0);\n if (!b) {\n func_ov002_020ed63c(c, 1);\n return;\n }\n }\n }\n if (*(int *)(c + 0x410) != 0 && r4 == 0) {\n func_ov002_020ed63c(c, 1);\n return;\n }\n\n r6 = 0;\n {\n int flags = *(int *)(c + 0xb0);\n int b100 = ((flags & 0x100) != 0);\n if (!b100) {\n int b2000 = ((flags & 0x2000) != 0);\n int b400;\n if (b2000) {\n func_ov002_020ed63c(c, 3);\n } else if ((b400 = ((flags & 0x400) != 0)) != 0) {\n if (_ZNK12WithMeshClsn14GetResultFlag1Ev(c + 0x144)) {\n func_ov002_020ec670(c, c + 0x144);\n func_ov002_020edca4(c);\n return;\n }\n if (r4 != 0) {\n Vector3 v = ((Obj *)r4)->v30();\n if (_Z14ApproachLinearR7Vector3RKS_5Fix12IiE(c + 0x5c, &v, *(int *)(c + 0x98))) {\n u16 t = *(u16 *)(r4 + 0xc);\n if (t == 0xbd || t == 0xbe || t == 0xc6 || t == 0xca || t == 0xdb || t == 0x151) {\n func_ov002_020edca4(c);\n return;\n }\n func_ov002_020ec728(c);\n func_ov002_020ed63c(c, 1);\n return;\n }\n *(short *)(c + 0x8e) = Vec3_HorzAngle(c + 0x5c, &v);\n }\n _ZN8Particle20RunningSlidingDustAtE5Fix12IiES1_S1_(\n *(int *)(c + 0x5c), *(int *)(c + 0x60), *(int *)(c + 0x64));\n r6 = 1;\n if (func_ov002_020eddc4(c))\n return;\n }\n }\n }\n\n if (func_ov002_020ed6cc(c)) {\n func_ov002_020edca4(c);\n return;\n }\n _ZN12CylinderClsn5ClearEv(c + 0x110);\n if (r6 == 1)\n _ZN12CylinderClsn6UpdateEv(c + 0x110);\n if (r4 == 0)\n _ZN5Actor9UpdatePosEP12CylinderClsn(c, c + 0x110);\n func_020383fc(c + 0x144);\n}", "source": "fanout-opus"} {"module": "ov006", "addr": "0x020dd0e0", "name": "func_ov006_020dd0e0", "size": 492, "target_hex": "f0412de90060a0e1050a86e2c80190e5020050e3f041bd181eff2f11a4019fe5a4319fe50020d0e50040a0e30201d3e70231a0e1000050e30300000a8c019fe50300d0e7000050e30140a013000054e3f041bd081eff2f011800a0e3910004e06c019fe56c719fe56c319fe56c519fe503e086e004309ee7000086e00281d7e702c1d5e7047090e7045080e0477648e00f20e0e304e08ee0020057e143064ce0f041bdd81eff2fd1100057e3f041bda81eff2fa1020050e1f041bdd81eff2fd1100050e3f041bda81eff2fa1040086e0012980e20130a0e3d53ac2e5d30ad2e5000050e30b00000ad03ac2e500309ee5030aa0e3c83a82e5003060e2cc3a82e50030a0e30600a0e1d63ac2e5af0000ebf041bde81eff2fe10600a0e146feffeb040086e0010980e20010a0e3d21ac0e5050a86e20310a0e3c81180e54010a0e3cc1180e5000095e594209fe54006a0e1800040e2c030a0e13c0053e33c30a0a33b00e0e3000053e10030a0d10200a0e3ee10a0e352d5fcebf200a0e33cd5fceb040086e05c109fe5010980e20220a0e3d02ac0e5000091e5000050e3a8209015050a86e2d41190e50020a003010052e10110a0c3db11c0c50010a0d3db11c0d5f041bde81eff2fe1400e0a02e80d0a02e90d0a02c04a0000ea0d0a02c44a0000eb0d0a02ffff000068eb0b02", "lang": "c", "divergences": 83, "c_source": "typedef short s16;\ntypedef unsigned char u8;\n\nextern u8 data_020a0e40;\nextern u8 data_020a0de8[];\nextern u8 data_020a0de9[];\nextern u8 data_020a0dea[];\nextern u8 data_020a0deb[];\n\nextern void func_ov006_020dd4b0(char *c, int i);\nextern void func_ov006_020dcb1c(char *c, int i);\nextern void func_020127a4(int a, int b, int c, int d);\nextern void _ZN5Sound12PlayBank2_2DEj(unsigned int id);\n\nextern int data_ov000_020beb68;\n\nvoid func_ov006_020dd0e0(char *self, int idx)\n{\n u8 i;\n int ok;\n int n;\n int v;\n int w;\n char *fld;\n int ang;\n int stars;\n int need;\n\n if (*(int *)(self + 0x5000 + 0x1c8) != 2)\n return;\n\n i = data_020a0e40;\n ok = 0;\n if (data_020a0de8[i * 4] != 0) {\n int t;\n t = data_020a0de9[i * 4] != 0;\n if (t)\n ok = 1;\n }\n if (ok == 0)\n return;\n\n n = idx * 0x18;\n v = data_020a0dea[i * 4] - (*(int *)(self + 0x4ac0 + n) >> 12);\n w = data_020a0deb[i * 4] - (*(int *)(self + 0x4ac4 + n) >> 12);\n\n if (v <= -0x10)\n return;\n if (v >= 0x10)\n return;\n if (w <= -0x10)\n return;\n if (w >= 0x10)\n return;\n\n fld = self + n + 0x4000;\n *(u8 *)(fld + 0xad5) = 1;\n if (*(u8 *)(fld + 0xad3) != 0) {\n *(u8 *)(fld + 0xad0) = 1;\n *(int *)(fld + 0xac8) = *(int *)(self + 0x4ac4 + n);\n *(int *)(fld + 0xacc) = -0x3000;\n *(u8 *)(fld + 0xad6) = 0;\n func_ov006_020dd4b0(self, idx);\n return;\n }\n\n func_ov006_020dcb1c(self, idx);\n *(u8 *)(fld + 0xad2) = 0;\n *(int *)(self + 0x5000 + 0x1c8) = 3;\n *(int *)(self + 0x5000 + 0x1cc) = 0x40;\n\n ang = (*(int *)(self + 0x4ac0 + n) >> 12) - 0x80;\n ang >>= 1;\n if (ang >= 0x3c)\n ang = 0x3c;\n if (ang <= -0x3c)\n ang = -0x3c;\n func_020127a4(2, 0xee, 0xffff, ang);\n _ZN5Sound12PlayBank2_2DEj(0xf2);\n\n *(u8 *)(fld + 0xad0) = 2;\n stars = 0;\n if (*(int *)data_ov000_020beb68 != 0)\n stars = *(int *)(*(int *)data_ov000_020beb68 + 0xa8);\n need = *(int *)(self + 0x5000 + 0x1d4);\n if (stars > need)\n *(u8 *)(self + 0x5000 + 0x1db) = 1;\n else\n *(u8 *)(self + 0x5000 + 0x1db) = 0;\n}", "source": "stranded-recovery-20260709"} {"module": "arm9", "addr": "0x0203e0ac", "name": "func_0203e0ac", "size": 352, "target_hex": "70402de93c119fe53c219fe5bc40d1e1be30d1e134019fe5022004e0bc20c1e1bc40d1e1ba37c0e1ba27d0e1b847c0e1b837d0e1b625c0e1b625d0e1b435c0e1b435d0e1b223c0e1b2e3d0e1b033c0e1b063d0e1b4c0d1e1b640d1e1b830d1e1ba20d1e1e8509fe5bc60c0e1bee0c0e1b0c7c0e1b247c0e1b437c0e1b627c0e1b020d5e1cc409fe5cce09fe5bc24c0e1b2c0d5e1b031d1e10020a0e3bec4c0e1b4c0d5e1b0c5c0e1b6c0d5e1b2c5c0e1b0c0d4e1b8c2c0e1b2c0d4e1bac2c0e1b4c0d4e1bcc2c0e1b6c0d4e1bec2c0e1b0c0dee1b4c0c0e1b2c0dee1b6c0c0e1b4c0dee1b8c0c0e1b6c0dee1bc37c0e1bc37d0e1bac0c0e1b835c0e1b835d0e1b433c0e1b433d0e1b031c0e11230d1e5012082e2110052e37e30c0e57e30d0e5011081e25a30c0e55a30d0e53630c0e53630d0e51230c0e5010080e2f2ffffba7040bde81eff2fe140100a02ff7f000054110a02c4110a02a0110a027c110a02", "lang": "c", "divergences": 83, "c_source": "typedef unsigned short u16;\ntypedef unsigned char u8;\n\nextern volatile u16 data_020a1040[];\nextern volatile u16 data_020a1154[];\nextern volatile u16 data_020a11c4[];\nextern volatile u16 data_020a11a0[];\nextern volatile u16 data_020a117c[];\n\nvoid func_0203e0ac(void)\n{\n int i;\n volatile u8 *src;\n volatile u8 *dst;\n\n data_020a1040[6] = data_020a1040[6] & 0x7fff;\n data_020a1154[0x3d] = data_020a1040[7];\n data_020a1154[0x3c] = data_020a1040[6];\n data_020a1154[0x2b] = data_020a1154[0x3d];\n data_020a1154[0x2a] = data_020a1154[0x3c];\n data_020a1154[0x19] = data_020a1154[0x2b];\n data_020a1154[0x18] = data_020a1154[0x2a];\n data_020a1154[6] = data_020a1154[0x18];\n data_020a1154[7] = data_020a1154[0x19];\n\n data_020a1154[0x38] = data_020a1040[2];\n data_020a1154[0x39] = data_020a1040[3];\n data_020a1154[0x3a] = data_020a1040[4];\n data_020a1154[0x3b] = data_020a1040[5];\n\n data_020a1154[0x26] = data_020a11c4[0];\n data_020a1154[0x27] = data_020a11c4[1];\n data_020a1154[0x28] = data_020a11c4[2];\n data_020a1154[0x29] = data_020a11c4[3];\n\n data_020a1154[0x14] = data_020a11a0[0];\n data_020a1154[0x15] = data_020a11a0[1];\n data_020a1154[0x16] = data_020a11a0[2];\n data_020a1154[0x17] = data_020a11a0[3];\n\n data_020a1154[2] = data_020a117c[0];\n data_020a1154[3] = data_020a117c[1];\n data_020a1154[4] = data_020a117c[2];\n data_020a1154[0x3e] = data_020a1040[8];\n data_020a1154[5] = data_020a117c[3];\n data_020a1154[0x2c] = data_020a1154[0x3e];\n data_020a1154[0x1a] = data_020a1154[0x2c];\n data_020a1154[8] = data_020a1154[0x1a];\n\n src = (volatile u8 *)data_020a1040;\n dst = (volatile u8 *)data_020a1154;\n for (i = 0; i < 0x11; i++) {\n dst[0x7e] = src[0x12];\n dst[0x5a] = dst[0x7e];\n dst[0x36] = dst[0x5a];\n dst[0x12] = dst[0x36];\n src++;\n dst++;\n }\n}\n", "source": "fanout"} -{"module": "ov006", "addr": "0x020fd2d8", "name": "func_ov006_020fd2d8", "size": 1468, "target_hex": "f0472de90070a0e10160a0e1a8feffeb3800a0e37c159fe5960008e0011087e00800d1e7081081e0000050e34b00001a010080e20000c1e5170b87e2b802d0e10c0050e30f00009a4c059fe599f9fceb48259fe5171b87e2200802e08001a0e1b822d1e1a007a0e18013a0e1080087e00c2042e22e1d81e2821381e0010980e26c1680e50e0000ea0c059fe589f9fceb08259fe5171b87e2200802e08001a0e1a007a0e18003a0e1b832d1e1012b80e2a000a0e3081087e0932022e0010981e26c2680e5d0049fe57af9fcebcc149fe5200801e08000a0e1a007b0e10900000a170b87e2b812d0e1080087e0010980e28113a0e1061c81e2681680e50010a0e39116c0e5090000ea170b87e2b812d0e1080087e0010980e28113a0e1061c81e2001061e2681680e50010a0e39116c0e564049fe55ff9fceb60149fe5082087e0200801e08002a0e1a007a0e18001a0e1201080e2460c82e2b818c0e1080100ea3c049fe5081087e0000087e0011981e230249fe530349fe5024087e0033087e0082090e76c1691e5085084e0011082e0081080e7082093e7081094e7080083e0011082e0081083e7081093e74116a0e1f00051e30f0000da003095e5ec239fe5004063e2023087e0004085e50820d3e7083083e0000052e30400000a010052e30220a0030020c3050120a0130020c3150f28a0e3002080e5100051e3110000aaa0139fe5a4239fe5013087e0081093e7022087e0001061e2081083e70810d2e7082082e0000051e30400000a010051e30210a0030010c2050110a0130010c2150118a0e3001080e50700a0e10610a0e1700100eb0700a0e10610a0e138fdffeb0700a0e10610a0e11afdffeb40039fe5001087e0b80091e1084081e0000050e32300000a010040e2b000c4e1000095e5000050e30c0000da18039fe5061ba0e3003087e0b82093e1000061e2085083e0801042e2b81083e1f81093e1000051e13a0ba0d3b000c5d10b0000ea000050e3090000aadc029fe5001087e0b80091e1082081e0800080e2b80081e1f80091e1060b50e3060ba0a3b000c2a1f000d4e1000050e30000a0b3b000c4b1f047bde81eff2fe194029fe5001087e00800d1e708a081e0000050e34800001a001095e5000051e3210000da78029fe5202041e2001087e0002085e5b80091e1089081e0800080e2b80081e1f80091e1000050e30000a0a3b000c9a1000095e5000050e3830000ca20029fe5cef8fceb1c129fe5200801e08000a0e1a007a0e1011080e204029fe50010cae5c6f8fcebfc119fe50020a0e3200801e00002a0e1a007a0e10001a0e1b000c4e1b020c9e1700000ea000051e36e0000aae8019fe5202081e2001087e0002085e5b80091e1089081e0800040e2b80081e1f80091e1000050e30000a0b3b000c9b1000095e5000050e35f0000ba90019fe5aaf8fceb8c119fe5200801e08000a0e1a007a0e1011080e274019fe50010cae5a2f8fceb6c119fe50020a0e3200801e00002a0e1a007a0e10001a0e1b000c4e1b020c9e14c0000ea010050e32500001a001095e554019fe5201081e2002087e0001085e5b81092e1060ba0e3000060e2801041e2b81082e1f81092e1082082e0000051e13a0ba0d3b000c2d1170b87e2b812d0e1002095e58113a0e1061c81e2010052e1340000ba0010a0e30010cae5b812d0e1d8009fe58113a0e1061c81e2001085e579f8fcebc8109fe5200801e08002a0e1a007a0e18001a0e1100080e2b000c4e1240000ea001095e5bc009fe5202041e2001087e0002085e5b80091e1082081e0800080e2b80081e1f80091e1060b50e3060ba0a3b000c2a1170b87e2b812d0e1002095e58113a0e1061c81e2001061e2010052e10f0000ca0010a0e30010cae5b812d0e144009fe58113a0e1061c81e2001061e2001085e553f8fceb30109fe5200801e08002a0e1a007a0e18001a0e1100080e2b000c4e10700a0e10610a0e1b8fcffebf047bde81eff2fe190460000b8d40902ff7f0000644600006846000060460000914600008846000084460000", "lang": "c", "divergences": 84, "c_source": "/* NONMATCHING div=84: all diffs are ONE 3-cycle callee-saved rename\n * (ROM o=r7,i=r6,idx=r8 vs cand o=r8,i=r7,idx=r6; ranks follow first-def\n * order, idx-highest unreachable: named idx fixed vel->r5, but register kw\n * and param-copy decls break size / coalesce away - rotation wall family)\n * + one assoc pair (0x4688 store base) + 1 pool word.\n * func_ov006_020fd2d8 @ 0x020fd2d8 size 0x5bc (ov006) \u2014 per-slot drift/bob update,\n * sibling of matched func_ov006_020fd894 (same 0x38-stride cluster + helpers). */\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\n\n#define ATI(p, off) ((char *)(int)(((long long)(int)((char *)(p) + (off))) & 0xFFFFFFFFFFFFFFFFLL))\n#define ATU(p, off) ((char *)(unsigned int)(((long long)(int)((char *)(p) + (off))) & 0xFFFFFFFFFFFFFFFFLL))\n\nextern int RandomIntInternal(int *seed);\nextern int data_0209d4b8;\nextern void func_ov006_020fcd8c(char *o, int i);\nextern void func_ov006_020fdaf0(char *o, int i);\nextern void func_ov006_020fca1c(char *o, int i);\nextern void func_ov006_020fc9b0(char *o, int i);\nextern void func_ov006_020fcb4c(char *o, int i);\n\nvoid func_ov006_020fd2d8(char *o, int i)\n{\n int idx;\n func_ov006_020fcd8c(o, i);\n idx = i * 0x38;\n if (*(unsigned char *)(o + 0x4690 + idx) == 0)\n {\n *(unsigned char *)(o + 0x4690 + idx) += 1;\n if (*(unsigned short *)(o + 0x5c28) > 0xc)\n {\n *(int *)(ATI(o, idx) + 0x466c) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 3) >> 0xf) << 7) + 0xb80\n + ((*(unsigned short *)(o + 0x5c28) - 0xc) << 7);\n }\n else\n {\n *(int *)(ATU(o, idx) + 0x466c) =\n *(unsigned short *)(o + 0x5c28) * 0xa0\n + (((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 3) >> 0xf) << 7) + 0x400);\n }\n if ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) != 0)\n {\n *(int *)(o + idx + 0x4668) = (*(unsigned short *)(o + 0x5c28) << 7) + 0x600;\n *(unsigned char *)(o + idx + 0x4691) = 0;\n }\n else\n {\n *(int *)(o + idx + 0x4668) = -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600);\n *(unsigned char *)(o + idx + 0x4691) = 0;\n }\n *(unsigned short *)(ATI(o, idx + 0x4600) + 0x88) =\n (((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3)) + 0x20;\n }\n else\n {\n int v12;\n int *vel;\n *(int *)(o + 0x4664 + idx) += *(int *)(o + idx + 0x466c);\n vel = (int *)(o + 0x4668 + idx);\n *(int *)(o + 0x4660 + idx) += *(int *)(o + 0x4668 + idx);\n v12 = *(int *)(o + 0x4660 + idx) >> 12;\n if (v12 > 0xf0)\n {\n u8 d;\n *vel = -*vel;\n d = *(unsigned char *)(o + 0x4691 + idx);\n if (d != 0)\n {\n if (d == 1)\n *(unsigned char *)(o + 0x4691 + idx) = 2;\n else\n *(unsigned char *)(o + 0x4691 + idx) = 1;\n }\n *(int *)(o + 0x4660 + idx) = 0xf0000;\n }\n if (v12 < 0x10)\n {\n u8 d;\n *(int *)(o + 0x4668 + idx) = -*(int *)(o + 0x4668 + idx);\n d = *(unsigned char *)(o + 0x4691 + idx);\n if (d != 0)\n {\n if (d == 1)\n *(unsigned char *)(o + 0x4691 + idx) = 2;\n else\n *(unsigned char *)(o + 0x4691 + idx) = 1;\n }\n *(int *)(o + 0x4660 + idx) = 0x10000;\n }\n func_ov006_020fdaf0(o, i);\n func_ov006_020fca1c(o, i);\n func_ov006_020fc9b0(o, i);\n {\n unsigned short t = *(unsigned short *)(o + 0x4688 + idx);\n if (t != 0)\n {\n *(unsigned short *)(o + 0x4688 + idx) = t - 1;\n if (*vel > 0)\n {\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) <= -0x1800)\n *(unsigned short *)(o + 0x4684 + idx) = 0xe800;\n }\n else if (*vel < 0)\n {\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0x1800)\n *(short *)(o + 0x4684 + idx) = 0x1800;\n }\n if (*(short *)(o + 0x4688 + idx) < 0)\n *(short *)(o + 0x4688 + idx) = 0;\n return;\n }\n {\n u8 st = *(unsigned char *)(o + 0x4691 + idx);\n if (st == 0)\n {\n int v = *vel;\n if (v > 0)\n {\n *vel = v - 0x20;\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0)\n *(short *)(o + 0x4684 + idx) = 0;\n if (*vel <= 0)\n {\n *(unsigned char *)(o + 0x4691 + idx) =\n (((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) + 1;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 4) >> 0xf) << 2);\n *(short *)(o + 0x4684 + idx) = 0;\n }\n }\n else if (v < 0)\n {\n *vel = v + 0x20;\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) < 0)\n *(short *)(o + 0x4684 + idx) = 0;\n if (*vel >= 0)\n {\n *(unsigned char *)(o + 0x4691 + idx) =\n (((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) + 1;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 4) >> 0xf) << 2);\n *(short *)(o + 0x4684 + idx) = 0;\n }\n }\n }\n else if (st == 1)\n {\n *vel += 0x20;\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) <= -0x1800)\n *(unsigned short *)(o + 0x4684 + idx) = 0xe800;\n if (*vel >= (*(unsigned short *)(o + 0x5c28) << 7) + 0x600)\n {\n *(unsigned char *)(o + 0x4691 + idx) = 0;\n *vel = (*(unsigned short *)(o + 0x5c28) << 7) + 0x600;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3) + 0x10;\n }\n }\n else\n {\n *vel -= 0x20;\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0x1800)\n *(short *)(o + 0x4684 + idx) = 0x1800;\n if (*vel <= -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600))\n {\n *(unsigned char *)(o + 0x4691 + idx) = 0;\n *vel = -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600);\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3) + 0x10;\n }\n }\n }\n }\n }\n func_ov006_020fcb4c(o, i);\n}\n", "source": "fable-batch4-fd2d8"} +{"module": "ov006", "addr": "0x020fd2d8", "name": "func_ov006_020fd2d8", "size": 1468, "target_hex": "f0472de90070a0e10160a0e1a8feffeb3800a0e37c159fe5960008e0011087e00800d1e7081081e0000050e34b00001a010080e20000c1e5170b87e2b802d0e10c0050e30f00009a4c059fe599f9fceb48259fe5171b87e2200802e08001a0e1b822d1e1a007a0e18013a0e1080087e00c2042e22e1d81e2821381e0010980e26c1680e50e0000ea0c059fe589f9fceb08259fe5171b87e2200802e08001a0e1a007a0e18003a0e1b832d1e1012b80e2a000a0e3081087e0932022e0010981e26c2680e5d0049fe57af9fcebcc149fe5200801e08000a0e1a007b0e10900000a170b87e2b812d0e1080087e0010980e28113a0e1061c81e2681680e50010a0e39116c0e5090000ea170b87e2b812d0e1080087e0010980e28113a0e1061c81e2001061e2681680e50010a0e39116c0e564049fe55ff9fceb60149fe5082087e0200801e08002a0e1a007a0e18001a0e1201080e2460c82e2b818c0e1080100ea3c049fe5081087e0000087e0011981e230249fe530349fe5024087e0033087e0082090e76c1691e5085084e0011082e0081080e7082093e7081094e7080083e0011082e0081083e7081093e74116a0e1f00051e30f0000da003095e5ec239fe5004063e2023087e0004085e50820d3e7083083e0000052e30400000a010052e30220a0030020c3050120a0130020c3150f28a0e3002080e5100051e3110000aaa0139fe5a4239fe5013087e0081093e7022087e0001061e2081083e70810d2e7082082e0000051e30400000a010051e30210a0030010c2050110a0130010c2150118a0e3001080e50700a0e10610a0e1700100eb0700a0e10610a0e138fdffeb0700a0e10610a0e11afdffeb40039fe5001087e0b80091e1084081e0000050e32300000a010040e2b000c4e1000095e5000050e30c0000da18039fe5061ba0e3003087e0b82093e1000061e2085083e0801042e2b81083e1f81093e1000051e13a0ba0d3b000c5d10b0000ea000050e3090000aadc029fe5001087e0b80091e1082081e0800080e2b80081e1f80091e1060b50e3060ba0a3b000c2a1f000d4e1000050e30000a0b3b000c4b1f047bde81eff2fe194029fe5001087e00800d1e708a081e0000050e34800001a001095e5000051e3210000da78029fe5202041e2001087e0002085e5b80091e1089081e0800080e2b80081e1f80091e1000050e30000a0a3b000c9a1000095e5000050e3830000ca20029fe5cef8fceb1c129fe5200801e08000a0e1a007a0e1011080e204029fe50010cae5c6f8fcebfc119fe50020a0e3200801e00002a0e1a007a0e10001a0e1b000c4e1b020c9e1700000ea000051e36e0000aae8019fe5202081e2001087e0002085e5b80091e1089081e0800040e2b80081e1f80091e1000050e30000a0b3b000c9b1000095e5000050e35f0000ba90019fe5aaf8fceb8c119fe5200801e08000a0e1a007a0e1011080e274019fe50010cae5a2f8fceb6c119fe50020a0e3200801e00002a0e1a007a0e10001a0e1b000c4e1b020c9e14c0000ea010050e32500001a001095e554019fe5201081e2002087e0001085e5b81092e1060ba0e3000060e2801041e2b81082e1f81092e1082082e0000051e13a0ba0d3b000c2d1170b87e2b812d0e1002095e58113a0e1061c81e2010052e1340000ba0010a0e30010cae5b812d0e1d8009fe58113a0e1061c81e2001085e579f8fcebc8109fe5200801e08002a0e1a007a0e18001a0e1100080e2b000c4e1240000ea001095e5bc009fe5202041e2001087e0002085e5b80091e1082081e0800080e2b80081e1f80091e1060b50e3060ba0a3b000c2a1170b87e2b812d0e1002095e58113a0e1061c81e2001061e2010052e10f0000ca0010a0e30010cae5b812d0e144009fe58113a0e1061c81e2001061e2001085e553f8fceb30109fe5200801e08002a0e1a007a0e18001a0e1100080e2b000c4e10700a0e10610a0e1b8fcffebf047bde81eff2fe190460000b8d40902ff7f0000644600006846000060460000914600008846000084460000", "lang": "c", "divergences": 84, "c_source": "/* NONMATCHING div=84: all diffs are ONE 3-cycle callee-saved rename\n * (ROM o=r7,i=r6,idx=r8 vs cand o=r8,i=r7,idx=r6; ranks follow first-def\n * order, idx-highest unreachable: named idx fixed vel->r5, but register kw\n * and param-copy decls break size / coalesce away - rotation wall family)\n * + one assoc pair (0x4688 store base) + 1 pool word.\n * func_ov006_020fd2d8 @ 0x020fd2d8 size 0x5bc (ov006) — per-slot drift/bob update,\n * sibling of matched func_ov006_020fd894 (same 0x38-stride cluster + helpers). */\ntypedef signed char s8;\ntypedef unsigned char u8;\ntypedef short s16;\ntypedef unsigned short u16;\ntypedef int s32;\ntypedef unsigned int u32;\n\n#define ATI(p, off) ((char *)(int)(((long long)(int)((char *)(p) + (off))) & 0xFFFFFFFFFFFFFFFFLL))\n#define ATU(p, off) ((char *)(unsigned int)(((long long)(int)((char *)(p) + (off))) & 0xFFFFFFFFFFFFFFFFLL))\n\nextern int RandomIntInternal(int *seed);\nextern int data_0209d4b8;\nextern void func_ov006_020fcd8c(char *o, int i);\nextern void func_ov006_020fdaf0(char *o, int i);\nextern void func_ov006_020fca1c(char *o, int i);\nextern void func_ov006_020fc9b0(char *o, int i);\nextern void func_ov006_020fcb4c(char *o, int i);\n\nvoid func_ov006_020fd2d8(char *o, int i)\n{\n int idx;\n func_ov006_020fcd8c(o, i);\n idx = i * 0x38;\n if (*(unsigned char *)(o + 0x4690 + idx) == 0)\n {\n *(unsigned char *)(o + 0x4690 + idx) += 1;\n if (*(unsigned short *)(o + 0x5c28) > 0xc)\n {\n *(int *)(ATI(o, idx) + 0x466c) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 3) >> 0xf) << 7) + 0xb80\n + ((*(unsigned short *)(o + 0x5c28) - 0xc) << 7);\n }\n else\n {\n *(int *)(ATU(o, idx) + 0x466c) =\n *(unsigned short *)(o + 0x5c28) * 0xa0\n + (((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 3) >> 0xf) << 7) + 0x400);\n }\n if ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) != 0)\n {\n *(int *)(o + idx + 0x4668) = (*(unsigned short *)(o + 0x5c28) << 7) + 0x600;\n *(unsigned char *)(o + idx + 0x4691) = 0;\n }\n else\n {\n *(int *)(o + idx + 0x4668) = -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600);\n *(unsigned char *)(o + idx + 0x4691) = 0;\n }\n *(unsigned short *)(ATI(o, idx + 0x4600) + 0x88) =\n (((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3)) + 0x20;\n }\n else\n {\n int v12;\n int *vel;\n *(int *)(o + 0x4664 + idx) += *(int *)(o + idx + 0x466c);\n vel = (int *)(o + 0x4668 + idx);\n *(int *)(o + 0x4660 + idx) += *(int *)(o + 0x4668 + idx);\n v12 = *(int *)(o + 0x4660 + idx) >> 12;\n if (v12 > 0xf0)\n {\n u8 d;\n *vel = -*vel;\n d = *(unsigned char *)(o + 0x4691 + idx);\n if (d != 0)\n {\n if (d == 1)\n *(unsigned char *)(o + 0x4691 + idx) = 2;\n else\n *(unsigned char *)(o + 0x4691 + idx) = 1;\n }\n *(int *)(o + 0x4660 + idx) = 0xf0000;\n }\n if (v12 < 0x10)\n {\n u8 d;\n *(int *)(o + 0x4668 + idx) = -*(int *)(o + 0x4668 + idx);\n d = *(unsigned char *)(o + 0x4691 + idx);\n if (d != 0)\n {\n if (d == 1)\n *(unsigned char *)(o + 0x4691 + idx) = 2;\n else\n *(unsigned char *)(o + 0x4691 + idx) = 1;\n }\n *(int *)(o + 0x4660 + idx) = 0x10000;\n }\n func_ov006_020fdaf0(o, i);\n func_ov006_020fca1c(o, i);\n func_ov006_020fc9b0(o, i);\n {\n unsigned short t = *(unsigned short *)(o + 0x4688 + idx);\n if (t != 0)\n {\n *(unsigned short *)(o + 0x4688 + idx) = t - 1;\n if (*vel > 0)\n {\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) <= -0x1800)\n *(unsigned short *)(o + 0x4684 + idx) = 0xe800;\n }\n else if (*vel < 0)\n {\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0x1800)\n *(short *)(o + 0x4684 + idx) = 0x1800;\n }\n if (*(short *)(o + 0x4688 + idx) < 0)\n *(short *)(o + 0x4688 + idx) = 0;\n return;\n }\n {\n u8 st = *(unsigned char *)(o + 0x4691 + idx);\n if (st == 0)\n {\n int v = *vel;\n if (v > 0)\n {\n *vel = v - 0x20;\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0)\n *(short *)(o + 0x4684 + idx) = 0;\n if (*vel <= 0)\n {\n *(unsigned char *)(o + 0x4691 + idx) =\n (((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) + 1;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 4) >> 0xf) << 2);\n *(short *)(o + 0x4684 + idx) = 0;\n }\n }\n else if (v < 0)\n {\n *vel = v + 0x20;\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) < 0)\n *(short *)(o + 0x4684 + idx) = 0;\n if (*vel >= 0)\n {\n *(unsigned char *)(o + 0x4691 + idx) =\n (((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 1) >> 0xf) + 1;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 4) >> 0xf) << 2);\n *(short *)(o + 0x4684 + idx) = 0;\n }\n }\n }\n else if (st == 1)\n {\n *vel += 0x20;\n *(unsigned short *)(o + 0x4684 + idx) -= 0x80;\n if (*(short *)(o + 0x4684 + idx) <= -0x1800)\n *(unsigned short *)(o + 0x4684 + idx) = 0xe800;\n if (*vel >= (*(unsigned short *)(o + 0x5c28) << 7) + 0x600)\n {\n *(unsigned char *)(o + 0x4691 + idx) = 0;\n *vel = (*(unsigned short *)(o + 0x5c28) << 7) + 0x600;\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3) + 0x10;\n }\n }\n else\n {\n *vel -= 0x20;\n *(unsigned short *)(o + 0x4684 + idx) += 0x80;\n if (*(short *)(o + 0x4684 + idx) >= 0x1800)\n *(short *)(o + 0x4684 + idx) = 0x1800;\n if (*vel <= -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600))\n {\n *(unsigned char *)(o + 0x4691 + idx) = 0;\n *vel = -((*(unsigned short *)(o + 0x5c28) << 7) + 0x600);\n *(unsigned short *)(o + 0x4688 + idx) =\n ((((((unsigned int)RandomIntInternal(&data_0209d4b8) >> 16) & 0x7fff) << 5) >> 0xf) << 3) + 0x10;\n }\n }\n }\n }\n }\n func_ov006_020fcb4c(o, i);\n}\n", "source": "fable-batch4-fd2d8"} {"module": "ov006", "addr": "0x020fefc0", "name": "func_ov006_020fefc0", "size": 1068, "target_hex": "f04f2de914d04de2dc139fe500008de50000d1e5d4539fe5d4239fe5080080e30000c1e5b000d5e10030a0e3c4139fe50300c0e3010080e3b000c5e1b040d5e15f00a0e34040c4e3b040c5e1003082e5b020d5e1432002e2011082e1b010c5e15164fceb0040a0e15657fdeb0010a0e10400a0e1c66dfdeb0400a0e14064fceb6000a0e34864fceb0040a0e16010a0e31a2ea0e3055efdeb0400a0e13864fceb6100a0e34064fceb0040a0e10010a0e3022ba0e3a65cfdeb0400a0e13064fceb34339fe534139fe5b020d3e14600a0e30320c2e3012082e3b020c3e1b020d3e14020c2e3b020c3e1b020d3e1432002e2011082e1b010c3e12b64fceb0040a0e15a57fdeb0010a0e10400a0e1a06dfdeb0400a0e11a64fcebf757fdeb0010a0e1dc029fe5012aa0e3bc00cde1bc00dde1d46cfdeb0600a0e31b64fceb0040a0e10010a0e3022ba0e3b15cfdeb0400a0e10b64fcebe000a0e31364fceb04008de5e100a0e31064fceb08008de504009de51915a0e3866dfdeb08009de50010a0e3012ca0e3955dfdeb78029fe50010a0e30020d0e570429fe570629fe50d2082e30020c0e5b020d4e164529fe500009de50320c2e3b020c4e1b070d4e10220a0e30130a0e14070c7e3b070c4e1001086e5b060d4e1436006e2055086e1b050c4e154c0feeb0f57fdeb0010a0e10000a0e3be00cde1be00dde1062aa0e3a16cfdeb00a0a0e30a90a0e10a70a0e10ab0a0e10240a0e30b80a0e10b60a0e18750a0e19557fdebb0a1cde1060080e0051080e0b001dde10420a0e1926cfdeb01a08ae2026086e2018088e2200058e3f3ffffba019089e2180059e3207087e2ecffffbab0419fe5b0119fe5b030d4e10020a0e35c00a0e30330c3e3023083e3b030c4e1b030d4e14030c3e3b030c4e1002081e5b010d4e1431001e2821f81e3b010c4e1c163fceb0040a0e1b256fdeb0010a0e10400a0e1366dfdeb0400a0e1b063fceb5d00a0e3b863fceb0040a0e16010a0e31a2ea0e35b5dfdeb0400a0e1a863fceb5e00a0e3b063fceb0040a0e10010a0e3022ba0e3fe5bfdeb0400a0e1a063fceb18519fe518219fe5b000d5e10030a0e310119fe50300c0e3010080e3b000c5e1b040d5e10500a0e34040c4e3b040c5e1003082e5b020d5e1432002e2011082e1b010c5e19863fceb0040a0e10010a0e3022ba0e3765cfdeb0400a0e18863fceb04009de56616a0e3096dfdeb08009de50010a0e3012ca0e3fe5cfdeb04009de57f63fceb08009de57d63fceb00009de514feffeb00009de539f5ffeb00009de5caeeffeb2000a0e358c4feeb00109de50100a0e3a40081e51020a0e3171b81e2bc21c1e16020a0e3b422c1e100109de5051a81e2100c81e500109de5a40081e514d08de2f04fbde81eff2fe15cd409020e0000041c000004101200000c000004185400007330000054d409020c10000418100004180400000e1000041c100004081000041010000408060000", "lang": "c", "divergences": 85, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\ntypedef signed int s32;\n\nextern int LoadFile(int handle);\nextern int func_02054d88(void);\nextern void DecompressLZ16(int src, int dst);\nextern void Deallocate(int ptr);\nextern void _ZN2GX10LoadBGPlttEPKvjj(int p, u32 a, u32 b);\nextern void func_02056314(int dst, u32 offset, u32 len);\nextern int _ZN2G213GetBG2CharPtrEv(void);\nextern int _ZN2G212GetBG2ScrPtrEv(void);\nextern void MultiStore16(u16 val, int dst, int nbytes);\nextern void func_020563d4(int src, u32 offset, u32 count);\nextern void _ZN2GX11LoadOBJPlttEPKvjj(int p, u32 a, u32 b);\nextern void func_ov004_020af2f8(int a, int b, int c, int d);\nextern int func_02054de8(void);\nextern int _ZN3G2S12GetBG2ScrPtrEv(void);\nextern int _ZN3G2S13GetBG3CharPtrEv(void);\nextern void _ZN3GXS10LoadBGPlttEPKvjj(int p, u32 a, u32 b);\nextern void func_020562b4(int src, u32 offset, u32 count);\nextern void func_020564f4(int src, int offset, int count);\nextern void _ZN3GXS11LoadOBJPlttEPKvjj(int p, u32 a, u32 b);\nextern void func_ov006_020feba8(int c);\nextern void func_ov006_020fc844(int c);\nextern void func_ov006_020fae90(int c);\nextern void func_ov004_020b04d0(int v);\n\nextern u8 data_0209d45c;\nextern u8 data_0209d454;\n\nvoid func_ov006_020fefc0(int arg0)\n{\n int sl, sb, r7, r8, r6, r5, fp;\n int r4;\n int sp0;\n int sp4;\n int sp8;\n volatile u16 spC;\n volatile u16 spE;\n volatile u16 sp10;\n\n sp0 = arg0;\n data_0209d45c |= 8;\n *(volatile u16 *)0x0400000E = (*(volatile u16 *)0x0400000E & ~3) | 1;\n *(volatile u16 *)0x0400000E &= ~0x40;\n *(volatile s32 *)0x0400001C = 0;\n *(volatile u16 *)0x0400000E = (*(volatile u16 *)0x0400000E & 0x43) | 0x1210;\n\n r4 = LoadFile(0x5F);\n DecompressLZ16(r4, func_02054d88());\n Deallocate(r4);\n\n r4 = LoadFile(0x60);\n _ZN2GX10LoadBGPlttEPKvjj(r4, 0x60, 0x1A0);\n Deallocate(r4);\n\n r4 = LoadFile(0x61);\n func_02056314(r4, 0, 0x800);\n Deallocate(r4);\n\n *(volatile u16 *)0x0400000C = (*(volatile u16 *)0x0400000C & ~3) | 1;\n *(volatile u16 *)0x0400000C &= ~0x40;\n *(volatile u16 *)0x0400000C = (*(volatile u16 *)0x0400000C & 0x43) | 0x5418;\n\n r4 = LoadFile(0x46);\n DecompressLZ16(r4, _ZN2G213GetBG2CharPtrEv());\n Deallocate(r4);\n\n spC = 0x3073;\n MultiStore16(spC, _ZN2G212GetBG2ScrPtrEv(), 0x1000);\n\n r4 = LoadFile(6);\n func_020563d4(r4, 0, 0x800);\n Deallocate(r4);\n\n sp4 = LoadFile(0xE0);\n sp8 = LoadFile(0xE1);\n DecompressLZ16(sp4, 0x06400000);\n _ZN2GX11LoadOBJPlttEPKvjj(sp8, 0, 0x100);\n\n data_0209d454 |= 0xD;\n *(volatile u16 *)0x0400100C &= ~3;\n *(volatile u16 *)0x0400100C &= ~0x40;\n *(volatile s32 *)0x04001018 = 0;\n *(volatile u16 *)0x0400100C = (*(volatile u16 *)0x0400100C & 0x43) | 0x418;\n\n func_ov004_020af2f8(sp0, 0, 2, 0);\n\n spE = 0;\n MultiStore16(spE, func_02054de8(), 0x6000);\n\n sl = 0;\n sb = 0;\n r7 = 0;\n fp = 0;\n r4 = 2;\n do {\n r8 = fp;\n r6 = fp;\n r5 = r7 * 2;\n do {\n sp10 = sl;\n MultiStore16(sp10, _ZN3G2S12GetBG2ScrPtrEv() + r6 + r5, r4);\n sl += 1;\n r6 += r4;\n r8 += 1;\n } while (r8 < 0x20);\n sb += 1;\n r7 += 0x20;\n } while (sb < 0x18);\n\n *(volatile u16 *)0x0400100E = (*(volatile u16 *)0x0400100E & ~3) | 2;\n *(volatile u16 *)0x0400100E &= ~0x40;\n *(volatile s32 *)0x0400101C = 0;\n *(volatile u16 *)0x0400100E = (*(volatile u16 *)0x0400100E & 0x43) | 0x208;\n\n r4 = LoadFile(0x5C);\n DecompressLZ16(r4, _ZN3G2S13GetBG3CharPtrEv());\n Deallocate(r4);\n\n r4 = LoadFile(0x5D);\n _ZN3GXS10LoadBGPlttEPKvjj(r4, 0x60, 0x1A0);\n Deallocate(r4);\n\n r4 = LoadFile(0x5E);\n func_020562b4(r4, 0, 0x800);\n Deallocate(r4);\n\n *(volatile u16 *)0x04001008 = (*(volatile u16 *)0x04001008 & ~3) | 1;\n *(volatile u16 *)0x04001008 &= ~0x40;\n *(volatile s32 *)0x04001010 = 0;\n *(volatile u16 *)0x04001008 = (*(volatile u16 *)0x04001008 & 0x43) | 0x608;\n\n r4 = LoadFile(5);\n func_020564f4(r4, 0, 0x800);\n Deallocate(r4);\n\n DecompressLZ16(sp4, 0x06600000);\n _ZN3GXS11LoadOBJPlttEPKvjj(sp8, 0, 0x100);\n Deallocate(sp4);\n Deallocate(sp8);\n\n func_ov006_020feba8(sp0);\n func_ov006_020fc844(sp0);\n func_ov006_020fae90(sp0);\n func_ov004_020b04d0(0x20);\n\n *(s32 *)(sp0 + 0xA4) = 1;\n *(u16 *)(sp0 + 0x5C1C) = 0x10;\n *(u16 *)(sp0 + 0x5C24) = 0x60;\n *(s32 *)(sp0 + 0x5C10) = 1;\n *(s32 *)(sp0 + 0xA4) = 1;\n}", "source": "fanout-opus"} {"module": "ov075", "addr": "0x0211867c", "name": "func_ov075_0211867c", "size": 568, "target_hex": "f0432de904d04de20050a0e10395fceb0040a0e1b41efceb000050e30800000a181ffceb8e1efcebec119fe50500a0e10520a0e3a40600eb490fa0e334e8fbeb500000eabb94fceb000050e33600000a740295e5000050e32d00001a0030a0e3b8119fe50320a0e1b4019fe5b4719fe503c0a0e101e0a0e30060d1e5000056e30e00000a026180e0b280d6e10261d7e70291a0e10c8008e2000056e3083083e10400000a096087e00160d6e5000056e30e60a0110000001a0c60a0e1063083e1012082e2040052e3011081e2e9ffffba54019fe5992f85e2001092e5000090e5000041e0000082e5640295e5000050e3030000da870f50e31a0000aa000053e31800000aeb1efceb0100a0e3740285e5140000ea0500a0e169f9ffeb000050e31000000a5f1efceb0e0000ea740295e5000050e30b00001aec009fe5992f85e2001092e5000090e5000041e0000082e5640295e51e0e50e3020000aad51efceb0100a0e3740285e5ac94fcebbc109fe50001a0e1b00091e10c00d0e30100000a0e00a0e3e2e7fbeb6d0f85e2d61ffceb1e0e85e2d41ffceb830f85e2d21ffceb8c109fe50400d1e7044081e0000050e30100001a8e0f85e2cb1ffcebd901d5e5000050e304d08d12f043bd181eff2f110502d5e5000050e304d08d12f043bd181eff2f110000a0e3da01c5e50110a0e30512c5e50612c5e50000d4e5000050e33112c5053212c5055d12c5055e12c50504d08de2f043bde81eff2fe110d811025cfc0902580e0a02e80d0a0244ee08025a0e0a02f0b20902", "lang": "c", "divergences": 85, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\n\nextern int func_0203da9c(void);\nextern u8 func_02020168(void);\nextern void func_02020304(void);\nextern void func_020200e0(void);\nextern void func_ov075_0211a148(char* c, void* a, int b);\nextern void func_02012790(int a);\nextern int func_0203d9b4(void);\nextern void func_02020334(void);\nextern int func_ov075_02116d40(void* c);\nextern void func_02020124(void);\nextern void func_02020768(void* p);\n\nextern char data_ov075_0211d810[];\nextern u8 data_0209fc5c[];\nextern u16 data_020a0e58[];\nextern u8 data_020a0de8[];\nextern int data_0208ee44;\nextern u8 data_0209b2f0[];\n\nvoid func_ov075_0211867c(void* self)\n{\n char* c = (char*)self;\n int id = func_0203da9c();\n\n if (func_02020168() != 0) {\n func_02020304();\n func_020200e0();\n func_ov075_0211a148(c, data_ov075_0211d810, 5);\n func_02012790(0x124);\n } else {\n if (func_0203d9b4() != 0) {\n if (*(int*)(c + 0x274) == 0) {\n int r3 = 0;\n int i = 0;\n u8* g = data_0209fc5c;\n for (; i < 4; i++, g++) {\n if (*g != 0) {\n u16* hw = (u16*)((char*)data_020a0e58 + (i << 2));\n int bits = hw[1] & 0xc;\n r3 |= bits;\n if (data_020a0de8[i << 2] != 0) {\n int b = 0;\n if (data_020a0de8[(i << 2) + 1] != 0)\n b = 1;\n r3 |= b;\n } else {\n r3 |= 0;\n }\n }\n }\n {\n int *q = (int*)(c + 0x264);\n *q = *q - data_0208ee44;\n }\n {\n int t = *(int*)(c + 0x264);\n if (t <= 0)\n goto do_stop;\n if (t >= 0x21c)\n goto after_timer;\n if (r3 == 0)\n goto after_timer;\n do_stop:\n func_02020334();\n *(int*)(c + 0x274) = 1;\n }\n } else {\n if (func_ov075_02116d40(c) != 0)\n func_02020124();\n }\n } else {\n if (*(int*)(c + 0x274) == 0) {\n {\n int *q = (int*)(c + 0x264);\n *q = *q - data_0208ee44;\n }\n if (*(int*)(c + 0x264) < 0x1e0) {\n func_02020334();\n *(int*)(c + 0x274) = 1;\n }\n }\n }\n after_timer:\n {\n int r = func_0203da9c();\n u16 v = *(u16*)((char*)data_020a0e58 + (r << 2));\n if ((v & ~0xc) != 0)\n func_02012790(0xe);\n }\n }\n\n func_02020768(c + 0x1b4);\n func_02020768(c + 0x1e0);\n func_02020768(c + 0x20c);\n {\n u8 *bp = data_0209b2f0 + id;\n if (*bp == 0)\n func_02020768(c + 0x238);\n }\n\n if (*(u8*)(c + 0x1d9) != 0)\n return;\n if (*(u8*)(c + 0x205) != 0)\n return;\n\n *(u8*)(c + 0x1da) = 0;\n *(u8*)(c + 0x205) = 1;\n *(u8*)(c + 0x206) = 1;\n if (*(u8*)(data_0209b2f0 + id) == 0) {\n *(u8*)(c + 0x231) = 1;\n *(u8*)(c + 0x232) = 1;\n *(u8*)(c + 0x25d) = 1;\n *(u8*)(c + 0x25e) = 1;\n }\n}\n", "source": "fanout"} {"module": "ov084", "addr": "0x02129cf4", "name": "func_ov084_02129cf4", "size": 480, "target_hex": "30402de90cd04de20050a0e10140a0e1739bfbeb380485e5380495e5000050e30800000aac119fe55c0085e2011085e0ac4cfceb040050e10d0000da1301d5e5060050e30a00003a88119fe55c0085e2011085e09746fceb011b85e278219fe5ba05c1e10cd08de2402485e53040bde81eff2fe1380495e55c1080e2000091e500008de5040091e504008de5080091e508008de51301d5e5060050e33700002a30119fe55c0085e2011085e08d4cfceb040050e10e0000da6d0f85e21d2efceb000050e30a00001a08119fe508219fe55c0085e2011085e0402485e57546fceb011b85e2ba05c1e10cd08de23040bde81eff2fe100108de25c0085e2794cfceb481495e5010050e1170000aa00108de25c0085e2734cfceb400485e5010b85e2b805d0e1000050e30700000a00108de25c0085e25f46fceb011b85e2ba05c1e10cd08de23040bde81eff2fe100008de25c1085e25746fceb011b85e2ba05c1e10cd08de23040bde81eff2fe168009fe50cd08de2400485e53040bde81eff2fe150009fe500108de2000085e0554cfceb040050e140009fc50cd08dc2400485c53040bdc81eff2fc100108de25c0085e24c4cfceb400485e500108de25c0085e23c46fceb011b85e2ba05c1e10cd08de23040bde81eff2fe11c04000000801a06", "lang": "cpp", "divergences": 86, "c_source": "//cpp\nextern \"C\" {\nextern void *_ZN5Actor13ClosestPlayerEv(void *o);\nextern int Vec3_Dist(void *a, void *b);\nextern int Vec3_HorzAngle(void *a, void *b);\nextern int _ZNK12WithMeshClsn8IsOnWallEv(void *o);\n}\n\nextern \"C\" void func_ov084_02129cf4(void *cc, int dist)\n{\n char *c = (char*)cc;\n int v[3];\n\n *(void**)(c + 0x438) = _ZN5Actor13ClosestPlayerEv(c);\n if (*(int*)(c + 0x438) != 0) {\n if (Vec3_Dist(c + 0x5c, c + 0x41c) > dist && *(unsigned char*)(c + 0x113) >= 6) {\n ;\n } else {\n goto L74;\n }\n *(short*)(c + 0x45a) = (short)Vec3_HorzAngle(c + 0x5c, c + 0x41c);\n *(int*)(c + 0x440) = 0x61a8000;\n return;\n }\n\n {\n char *p;\nL74:\n p = *(char**)(c + 0x438);\n v[0] = *(int*)(p + 0x5c);\n v[1] = *(int*)(p + 0x60);\n v[2] = *(int*)(p + 0x64);\n }\n\n if (*(unsigned char*)(c + 0x113) >= 6) {\n if (Vec3_Dist(c + 0x41c, v) > dist) {\n *(int*)(c + 0x440) = 0x61a8000;\n return;\n }\n *(int*)(c + 0x440) = Vec3_Dist(c + 0x5c, v);\n *(short*)(c + 0x45a) = (short)Vec3_HorzAngle(c + 0x5c, v);\n return;\n }\n\n if (Vec3_Dist(c + 0x5c, c + 0x41c) > dist && !_ZNK12WithMeshClsn8IsOnWallEv(c + 0x1b4)) {\n *(int*)(c + 0x440) = 0x61a8000;\n *(short*)(c + 0x45a) = (short)Vec3_HorzAngle(c + 0x5c, c + 0x41c);\n return;\n }\n\n if (Vec3_Dist(c + 0x5c, v) >= *(int*)(c + 0x448)) {\n *(int*)(c + 0x440) = 0x61a8000;\n return;\n }\n *(int*)(c + 0x440) = Vec3_Dist(c + 0x5c, v);\n if (*(unsigned short*)(c + 0x458) == 0) {\n *(short*)(c + 0x45a) = (short)Vec3_HorzAngle(v, c + 0x5c);\n } else {\n *(short*)(c + 0x45a) = (short)Vec3_HorzAngle(c + 0x5c, v);\n }\n}\n", "source": "harvest-wave2"} @@ -709,13 +709,13 @@ {"module": "ov006", "addr": "0x021173c8", "name": "func_ov006_021173c8", "size": 4288, "target_hex": "f04f2de984d04de200a0a0e1050a8ae2980990e50010a0e3e906fceb01098ae2600690e50090a0e3010050e38a02001a050a8ae2981990e5000051e3860200ca640990e51880a0e3000050e3300000da0030e0e36c0d9fe500308de5000090e50820a0e13010a0e36662feeb0930a0e100308de50100a0e304008de58000a0e30810a0e16420a0e308308de5926afeeb8558feeb0030e0e32c2d9fe500308de5000192e79010a0e3540090e50820a0e15462feeb0930a0e100308de50100a0e304008de508308de5052a8ae2642992e5a000a0e30810a0e17f6afeeb0930a0e100308de50100a0e304008de508308de5052a8ae2644992e56420a0e3940202e0e000a0e30810a0e1736afeeb188088e2019089e21400a0e3990005e00070a0e324708de530708de538708de50040e0e33000a0e320008de501b0a0e38000a0e328008de59000a0e32c008de5a000a0e334008de5e000a0e33c008de5050a8ae2600990e5050050e13e0000ba07018ae0050a80e2680990e5000050e3390000da400c9fe500408de5011087e2010190e720109de50820a0e10430a0e11962feeb280c9fe524109de5070190e724309de514008de500108de504b08de508108de528009de514209de50810a0e1426afeeb3558feebf01b9fe500408de5000191e72c109de5540090e50820a0e10430a0e10462feeb30009de507118ae000008de504008de508008de5c40b9fe530309de5000081e010008de510209de534009de5002092e50810a0e12b6afeeb38009de514109de500008de504b08de508008de510009de538309de5002090e53c009de5910202e00810a0e11f6afeeb188088e2145085e2019089e2017087e2040057e3b9ffffba051a8ae27c0991e5000050e3340000da1400a0e3990000e0601991e5000051e12f0000ba0030e0e3340b9fe500308de5000090e50820a0e13010a0e3d461feeb0030a0e300308de50100a0e304008de50810a0e18000a0e34b2fa0e308308de5006afeebf357feeb0030e0e300308de5e02a9fe59010a0e3000192e70820a0e1540090e5c261feeb0030a0e300308de504308de508308de5a000a0e30810a0e1052a8ae27c2992e5ee69feeb0030a0e300308de50100a0e304008de508308de5e000a0e30810a0e1052a8ae27c4992e54b2fa0e3940202e0e269feeb188088e2019089e2051a8ae2840991e5000050e3340000da1400a0e3990000e0601991e5000051e12f0000ba0030e0e3540a9fe500308de5000090e50820a0e13010a0e39b61feeb0030a0e300308de50100a0e304008de5302a9fe50810a0e18000a0e308308de5c769feebba57feeb0030e0e300308de5fc299fe59010a0e3000192e70820a0e1540090e58961feeb0030a0e300308de504308de508308de5a000a0e30810a0e1052a8ae2842992e5b569feeb0030a0e300308de50100a0e304008de508308de5e000a0e30810a0e1052a8ae2844992e5b0299fe5940202e0a969feeb188088e2019089e2051a8ae2800991e5000050e3340000da1400a0e3990000e0601991e5000051e12f0000ba0030e0e378099fe500308de5000090e50820a0e13010a0e36261feeb0030a0e300308de50100a0e304008de50810a0e18000a0e37d2ea0e308308de58e69feeb8157feeb0030e0e300308de518299fe59010a0e3000192e70820a0e1540090e55061feeb0030a0e300308de504308de508308de5a000a0e30810a0e1052a8ae2802992e57c69feeb0030a0e300308de50100a0e304008de508308de5e000a0e30810a0e1052a8ae2804992e57d2ea0e3940202e07069feeb188088e2019089e21400a0e3990000e00c008de53000a0e340008de54000a0e344008de57d0da0e348008de50070a0e30100a0e350008de58000a0e354008de59000a0e358008de5a000a0e360008de5e000a0e374489fe54c708de55c708de564708de50050e0e320b0a0e368008de55c089fe507118ae0000081e01c008de5000090e5000050e3760000da050a8ae2601990e50c009de5000051e1710000ba000057e30400000a010057e31600000a020057e32800000a3a0000ea00508de5040094e50b10a0e10820a0e10530a0e10661feeb00508de5040094e540109de50820a0e10530a0e10061feeb00508de5040094e544109de50820a0e10530a0e1fa60feebcc679fe5260000ea00508de5000094e50b10a0e10820a0e10530a0e1f260feeb00508de5000094e540109de50820a0e10530a0e1ec60feeb00508de5000094e544109de50820a0e10530a0e1e660feeb48609de5120000ea00508de5080094e50b10a0e10820a0e10530a0e1de60feeb00508de5080094e540109de50820a0e10530a0e1d860feeb00508de5080094e544109de50820a0e10530a0e1d260feeb30679fe54c009de54c309de500008de550009de50810a0e104008de54c009de50620a0e108008de554009de5fb68feebee56feebd4169fe500508de5000191e758109de5540090e50820a0e10530a0e1bd60feeb5c009de51c209de500008de504008de508008de560009de5002092e55c309de50810a0e1e868feeb64009de564309de500008de550009de504008de564009de508008de51c009de5001090e568009de5960102e00810a0e1db68feeb0c009de5188088e2140080e20c008de5019089e2017087e2030057e37effffba051a8ae2780991e5000050e3340000da1400a0e3990000e0601991e5000051e12f0000ba0030e0e30c069fe500308de5140090e50820a0e13010a0e38e60feeb0030a0e300308de50100a0e304008de510269fe50810a0e18000a0e308308de5ba68feebad56feeb0030e0e300308de5c8259fe59010a0e3000192e70820a0e1540090e57c60feeb0030a0e300308de504308de508308de5a000a0e30810a0e1052a8ae2782992e5a868feeb0030a0e300308de50100a0e304008de508308de5e000a0e30810a0e1052a8ae2784992e590259fe5940202e09c68feeb188088e2019089e2051a8ae2940991e5000050e3340000da1400a0e3990000e0601991e5000051e12f0000ba0030e0e358059fe500308de5000090e50820a0e13010a0e35560feeb0030a0e300308de50100a0e304008de50810a0e18000a0e37d2ea0e308308de58168feeb7456feeb0030e0e300308de5e4249fe59010a0e3000192e70820a0e1540090e54360feeb0030a0e300308de504308de508308de5a000a0e30810a0e1052a8ae2942992e56f68feeb0030a0e300308de50100a0e304008de508308de5e000a0e30810a0e1052a8ae2944992e57d2ea0e3940202e06368feeb188088e2019089e21400a0e3990001e0050a8ae2600990e5010050e1210000ba08009ae5ff0010e20700001a0030e0e378049fe500308de5000090e50820a0e14010a0e31c60feeb060000ea0030e0e35c049fe500308de5000090e50820a0e14010a0e31460feeb8f57feeb0030a0e30020a0e100308de50100a0e304008de50810a0e1e000a0e308308de53f68feeb050a8ae2601990e5019089e2460f51e3461fa0b3601980b501098ae2600690e5010050e31500001a050a8ae2600990e54b0f50e3110000ba070059e3040000ba0a00a0e18010a0e3a820a0e3e563feeb0a0000ea060059e30400001a0a00a0e1e010a0e3a820a0e3de63feeb030000ea0a00a0e1e010a0e3a020a0e3d963feeb08009ae5ff0010e20300001a050a8ae25c09d0e5000050e30100001a0a00a0e131f3ffeb5c57feeb0610a0e30167feeb7057feebe466feeb0090a0e36c908de570908de574908de57c908de578908de50050e0e34c439fe54c039fe509118ae000b081e000209be5000052e3510000da38039fe5000081e018008de5000090e5020050e33f0000ba6c009de589118ae000008de504008de508008de510039fe50530a0e1007081e008039fe5006081e0000096e5001097e54006a0e1100040e24116a0e1ed67feebdc029fe509118ae0002091e770809de5000052e30400000a0210a0e1910482e0a221b0e1018088e2faffff1ad555feeb00508de56c129fe5002097e5000191e7001096e5540090e54116a0e1881181e0081041e20530a0e14226a0e1a05ffeeb00309be574009de5000053e30400000a0320a0e1921483e0a331b0e1010080e2faffff1a78109de50530a0e100108de504108de508108de5002096e5001097e54226a0e1800182e018209de5080080e2002092e54116a0e1be67feeb0b0000ea7c009de500008de504008de508008de589018ae0010980e2cc1790e5c83790e54116a0e14306a0e10530a0e1b167feeb019089e2050059e3a4ffffba0040a0e3ec719fe5ec519fe50480a0e10290a0e30060e0e304008ae0010980e20408d0e5010050e31200001a04018ae0010980e2142890e50630a0e19512c0e0c000a0e1a21fa0e1000081e084118ae0030050e300808de5011981e20900a0c1582891e554b891e5000197e74b16a0e14226a0e15b5ffeeb014084e2100054e3e4ffffba050a8ae2585990e50000a0e3000055e30b0000da60319fe5a51fa0e19325c4e0044085e04442a0e150319fe5044081e09314c2e0014045e00f0054e30100a0c3030000ea01198ae2841791e5000051e30100a0c308109ae5ff1011e20800001a0020a0e318119fe500208de5000191e71810a0e38f20e0e30030e0e3385ffeeb070000ea0020a0e3f8109fe500208de5000191e71810a0e38f20e0e30030e0e32f5ffeeb050a8ae2585990e50000a0e3000055e30b0000dabc309fe5a51fa0e19325c4e0044085e04442a0e1ac309fe5044081e09314c2e0014045e00f0054e30100a0c3030000ea01198ae2881791e5000051e30100a0c308109ae5ff1011e22100001a0030e0e374109fe500308de5000191e7e810a0e38f20e0e3105ffeeb200000eae08a1302b8ec1302fced1202685900005c761302787a1302b80b00006c7a13020c7a1302885900008813000010270000e0821302d08b1302f48b1302cdcccccc8c470000a0470000cc470000c8470000607a130267666666898888881e000000408a1302888a13020030e0e310101fe500308de5000191e7e810a0e38f20e0e3ee5efeeb01598ae2740695e50040a0e3000050e3090000da04018ae0010980e2400790e5001090e5041091e531ff2fe1740695e5014084e2000054e1f5ffffba01098ae2780790e5000050e30200000a001090e5041091e531ff2fe101598ae2680695e50040a0e3000050e3090000da04018ae0010980e2880690e5001090e5041091e531ff2fe1680695e5014084e2000054e1f5ffffba01598ae26c0695e50040a0e3000050e3090000da04018ae0010980e2200790e5001090e5041091e531ff2fe16c0695e5014084e2000054e1f5ffffba01598ae2700695e50040a0e3000050e3090000da04018ae0010980e2bc0690e5001090e5041091e531ff2fe1700695e5014084e2000054e1f5ffffba01598ae2780695e50040a0e3000050e3090000da04018ae0010980e24c0790e5001090e5041091e531ff2fe1780695e5014084e2000054e1f5ffffba01598ae27c0695e50040a0e3000050e3090000da04018ae0010980e2640790e5001090e5041091e531ff2fe17c0695e5014084e2000054e1f5ffffba01598ae2800695e50040a0e3000050e3090000da04018ae0010980e2700790e5001090e5041091e531ff2fe1800695e5014084e2000054e1f5ffffba01098ae2840690e5001090e5041091e531ff2fe101098ae27c0790e5000050e30200000a001090e5041091e531ff2fe101098ae2800790e5000050e30200000a001090e5041091e531ff2fe101498ae2680694e50050a0e3000050e3070000da05018ae0010980e2880690e5f3edffeb680694e5015085e2000055e1f7ffffba08009ae5ff0010e20500001a050a8ae25c09d0e5000050e30100000a0a00a0e1a5f1ffeb0100a0e384d08de2f04fbde81eff2fe1", "lang": "cpp", "divergences": 15, "c_source": "//cpp\n// NONMATCHING: 18/1072 words differ (div=18), all mwccarm spill-SLOT ORDERING internals.\n// Loop 2's digit-count reload (was the 3-word split add-#0x4000 cluster) is FIXED: the\n// inner-placement u64 launder ((int)g + sb*4 + 0x478c) & 0xFFFFFFFFFFFFFFFFLL forces the\n// pooled-constant register-offset form ldr r2,[r1,r0] the ROM has. Remaining 18 words are\n// ONE web mis-sorted in the spill-slot allocator: loop C's pcnt should take sp+0x10 (before\n// val at 0x14, tags at 0x20-0x3c) but lands at 0x2c wedged among the hoisted tag constants,\n// shifting z1/t0/t1/t2 down 4 bytes and loop G's pcnt2 from 0x1c to 0x14. Slot ORDER proved\n// invariant under ~35 lever attempts: decl/assignment order+scope (block/outer/function),\n// launder spelling (inner/outer/unsigned/~0LL), identity merge/rename, subscript/int-addr/\n// block-temp/volatile/register forms, dead extra defs, named-vs-literal tag constants,\n// opt_lifetimes/dead_assignments/loop_invariants/unroll_loops pragmas (same or worse).\n// decomp-permuter cannot attack this class: its scorer normalizes sp offsets (scores 0).\n// Note: loop C literal constants and a C99 fn-ptr vtable emulation both compile to the\n// IDENTICAL bytes as the named-tag //cpp virtual version (frontend-invariant residual).\n// func_ov006_021173c8 @ 0x021173c8 size 0x10c0 (ov006), mwccarm 1.2/sp2p3.\n\n#pragma opt_common_subs off\n#pragma opt_strength_reduction off\n\nstruct DispObj {\n virtual void f0();\n virtual void f1();\n};\n\nextern \"C\" {\nvoid func_02018f8c(void *p, int a);\nvoid func_ov004_020afdd0(int a0, int a1, int a2, int a3, int a4);\nvoid func_ov004_020b1ea4(int a0, int a1, int a2, int a3, int a4, int a5, int a6);\nint func_ov004_020ad674(void);\nint func_ov004_020adbc0(void);\nint func_ov004_020adc1c(void);\nvoid func_ov004_020b1a5c(int a0, int a1);\nint func_ov004_020b19f0(void *self);\nvoid func_ov004_020b0d8c(void *c, int a1, int a2);\nvoid func_ov006_02114b10(void *self);\nvoid func_ov006_02113c14(void *self);\n\nextern int data_ov006_02138ae0[];\nextern char *data_ov006_0213ecb8[];\nextern int data_ov006_0212edfc[];\nextern int data_ov006_0213765c[];\nextern int data_ov006_02137a78[];\nextern int data_ov006_02137a6c[];\nextern int data_ov006_021382e0[];\nextern int data_ov006_02138bd0[];\nextern int data_ov006_02138bf4[];\nextern int data_ov006_02137a0c[];\nextern int data_ov006_02137a60[];\nextern int data_ov006_02138a40[];\nextern int data_ov006_02138a88[];\n}\n\n#define I(off) (*(int *)(g + (off)))\n#define UC(off) (*(unsigned char *)(g + (off)))\n#define LP(e) ((int *)(((long long)(int)(e)) & 0xFFFFFFFFFFFFFFFFLL))\n\nextern \"C\" int func_ov006_021173c8(void *this_)\n{\n char *g = (char *)this_;\n int col;\n int xpos;\n int r7;\n int limit;\n int i;\n int j;\n int limG;\n int *pcnt;\n int *pcnt2;\n int val;\n\n func_02018f8c(*(void **)(g + 0x5998), 0);\n col = 0;\n\n if (I(0x4660) == 1 && I(0x5998) <= 0) {\n xpos = 0x18;\n\n /* Block B: row 0 */\n if (I(0x5964) > 0) {\n func_ov004_020afdd0(data_ov006_02138ae0[0], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0x64, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x5964), 0, 0, 1, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x5964) * 0x64, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Loop C: rows 1..4 */\n limit = col * 0x14;\n for (r7 = 0; r7 < 4; r7++) {\n if (I(0x5960) >= limit && *(int *)(g + r7 * 4 + 0x5968) > 0) {\n func_ov004_020afdd0(data_ov006_02138ae0[r7 + 1], 0x30, xpos, -1, -1);\n val = data_ov006_0212edfc[r7];\n func_ov004_020b1ea4(0x80, xpos, val, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n pcnt = (int *)(((long long)(int)(g + r7 * 4 + 0x5968)) & 0xFFFFFFFFFFFFFFFFLL);\n func_ov004_020b1ea4(0xa0, xpos, *pcnt, 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, val * *pcnt, 0, 0, 1, 0);\n xpos += 0x18;\n limit += 0x14;\n col++;\n }\n }\n\n /* Block D */\n if (I(0x597c) > 0 && I(0x5960) >= col * 0x14) {\n func_ov004_020afdd0(data_ov006_0213765c[0], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0x12c, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x597c), 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x597c) * 0x12c, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Block E */\n if (I(0x5984) > 0 && I(0x5960) >= col * 0x14) {\n func_ov004_020afdd0(data_ov006_02137a78[0], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0xbb8, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x5984), 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x5984) * 0xbb8, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Block F */\n if (I(0x5980) > 0 && I(0x5960) >= col * 0x14) {\n func_ov004_020afdd0(data_ov006_02137a6c[0], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0x7d0, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x5980), 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x5980) * 0x7d0, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Loop G: rows with per-row multiplier */\n limG = col * 0x14;\n for (j = 0; j < 3; j++) {\n pcnt2 = (int *)(((long long)(int)(g + j * 4 + 0x5988)) & 0xFFFFFFFFFFFFFFFFLL);\n if (*pcnt2 > 0 && I(0x5960) >= limG) {\n int mult;\n switch (j) {\n case 0:\n func_ov004_020afdd0(data_ov006_02137a0c[1], 0x20, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[1], 0x30, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[1], 0x40, xpos, -1, -1);\n mult = 5000;\n break;\n case 1:\n func_ov004_020afdd0(data_ov006_02137a0c[0], 0x20, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[0], 0x30, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[0], 0x40, xpos, -1, -1);\n mult = 8000;\n break;\n case 2:\n func_ov004_020afdd0(data_ov006_02137a0c[2], 0x20, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[2], 0x30, xpos, -1, -1);\n func_ov004_020afdd0(data_ov006_02137a0c[2], 0x40, xpos, -1, -1);\n mult = 10000;\n break;\n }\n func_ov004_020b1ea4(0x80, xpos, mult, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, *pcnt2, 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, mult * *pcnt2, 0, 0, 1, 0);\n xpos += 0x18;\n limG += 0x14;\n col++;\n }\n }\n\n /* Block H */\n if (I(0x5978) > 0 && I(0x5960) >= col * 0x14) {\n func_ov004_020afdd0(data_ov006_02138ae0[5], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0x2710, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x5978), 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x5978) * 0x2710, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Block I */\n if (I(0x5994) > 0 && I(0x5960) >= col * 0x14) {\n func_ov004_020afdd0(data_ov006_021382e0[0], 0x30, xpos, -1, -1);\n func_ov004_020b1ea4(0x80, xpos, 0x7d0, 0, 0, 1, 0);\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54), 0x90, xpos, -1, -1);\n func_ov004_020b1ea4(0xa0, xpos, I(0x5994), 0, 0, 0, 0);\n func_ov004_020b1ea4(0xe0, xpos, I(0x5994) * 0x7d0, 0, 0, 1, 0);\n xpos += 0x18;\n col++;\n }\n\n /* Block J: timer */\n if (I(0x5960) >= col * 0x14) {\n if ((I(8) & 0xff) == 0)\n func_ov004_020afdd0(data_ov006_02138bd0[0], 0x40, xpos, -1, -1);\n else\n func_ov004_020afdd0(data_ov006_02138bf4[0], 0x40, xpos, -1, -1);\n func_ov004_020b1ea4(0xe0, xpos, func_ov004_020adbc0(), 0, 0, 1, 0);\n col++;\n if (I(0x5960) < 0x118)\n I(0x5960) = 0x118;\n }\n\n /* Block K */\n if (I(0x4660) == 1 && I(0x5960) >= 0x12c) {\n if (col >= 7)\n func_ov004_020b0d8c(g, 0x80, 0xa8);\n else if (col == 6)\n func_ov004_020b0d8c(g, 0xe0, 0xa8);\n else\n func_ov004_020b0d8c(g, 0xe0, 0xa0);\n }\n }\n\n /* merge */\n if ((I(8) & 0xff) != 0 || UC(0x595c) == 0)\n func_ov006_02114b10(g);\n\n /* Section 2 */\n func_ov004_020b1a5c(func_ov004_020adbc0(), 6);\n func_ov004_020b19f0((void *)func_ov004_020adc1c());\n\n /* Loop 2: item list (sb reused as index) */\n {\n int sb;\n for (sb = 0; sb < 5; sb++) {\n int *pcnt = LP(g + sb * 4 + 0x478c);\n int cnt = *pcnt;\n if (cnt > 0) {\n int *pmode = LP(g + sb * 4 + 0x47a0);\n int mode = *pmode;\n if (mode >= 2) {\n unsigned int u;\n int nd;\n int *py = LP(g + sb * 8 + 0x47cc);\n int *px = LP(g + sb * 8 + 0x47c8);\n func_ov004_020b1ea4((*px >> 12) - 0x10, *py >> 12, cnt, -1, 0, 0, 0);\n nd = 0;\n u = (unsigned int)*(int *)(((int)g + sb * 4 + 0x478c) & 0xFFFFFFFFFFFFFFFFLL);\n if (u != 0) {\n do {\n u /= 10;\n nd++;\n } while (u != 0);\n }\n i = func_ov004_020ad674();\n func_ov004_020afdd0(*(int *)(data_ov006_0213ecb8[i] + 0x54),\n (*px >> 12) + nd * 8 - 8, *py >> 12, -1, -1);\n nd = 0;\n u = (unsigned int)*pcnt;\n if (u != 0) {\n do {\n u /= 10;\n nd++;\n } while (u != 0);\n }\n func_ov004_020b1ea4((*px >> 12) + nd * 8 + 8, *py >> 12, *pmode, -1, 0, 0, 0);\n } else {\n int y = *(int *)(g + sb * 8 + 0x47cc);\n int x = *(int *)(g + sb * 8 + 0x47c8);\n func_ov004_020b1ea4(x >> 12, y >> 12, cnt, -1, 0, 0, 0);\n }\n }\n }\n }\n\n /* Loop 3: 16 slots */\n {\n int r4;\n int two = 2, neg = -1, zero = 0;\n for (r4 = 0; r4 < 0x10; r4++) {\n if (*(unsigned char *)(g + r4 + 0x4804) == 1) {\n int idx = *(int *)(g + r4 * 4 + 0x4814) / 5;\n if (idx > 3)\n idx = two;\n func_ov004_020afdd0(data_ov006_02137a60[idx],\n *(int *)(g + r4 * 8 + 0x4854) >> 12,\n *(int *)(g + r4 * 8 + 0x4858) >> 12, neg, zero);\n }\n }\n }\n\n /* Block M */\n {\n int v = I(0x5958);\n int flag = 0;\n if (v > 0) {\n if (v % 30 > 0xf)\n flag = 1;\n } else {\n if (I(0x4784) > 0)\n flag = 1;\n }\n if ((I(8) & 0xff) == 0)\n func_ov004_020afdd0(data_ov006_02138a40[flag], 0x18, -0x90, -1, 0);\n else\n func_ov004_020afdd0(data_ov006_02138a88[flag], 0x18, -0x90, -1, 0);\n }\n\n /* Block N */\n {\n int v = I(0x5958);\n int flag = 0;\n if (v > 0) {\n if (v % 30 > 0xf)\n flag = 1;\n } else {\n if (I(0x4788) > 0)\n flag = 1;\n }\n if ((I(8) & 0xff) == 0)\n func_ov004_020afdd0(data_ov006_02138a40[flag], 0xe8, -0x90, -1, -1);\n else\n func_ov004_020afdd0(data_ov006_02138a88[flag], 0xe8, -0x90, -1, -1);\n }\n\n /* Dispatch loops */\n {\n int r4;\n for (r4 = 0; r4 < I(0x4674); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x4740))->f1();\n }\n if (*(void **)(g + 0x4778) != 0)\n ((DispObj *)*(void **)(g + 0x4778))->f1();\n {\n int r4;\n for (r4 = 0; r4 < I(0x4668); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x4688))->f1();\n }\n {\n int r4;\n for (r4 = 0; r4 < I(0x466c); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x4720))->f1();\n }\n {\n int r4;\n for (r4 = 0; r4 < I(0x4670); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x46bc))->f1();\n }\n {\n int r4;\n for (r4 = 0; r4 < I(0x4678); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x474c))->f1();\n }\n {\n int r4;\n for (r4 = 0; r4 < I(0x467c); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x4764))->f1();\n }\n {\n int r4;\n for (r4 = 0; r4 < I(0x4680); r4++)\n ((DispObj *)*(void **)(g + r4 * 4 + 0x4770))->f1();\n }\n ((DispObj *)*(void **)(g + 0x4684))->f1();\n if (*(void **)(g + 0x477c) != 0)\n ((DispObj *)*(void **)(g + 0x477c))->f1();\n if (*(void **)(g + 0x4780) != 0)\n ((DispObj *)*(void **)(g + 0x4780))->f1();\n {\n int r5;\n for (r5 = 0; r5 < I(0x4668); r5++)\n func_ov006_02113c14(*(void **)(g + r5 * 4 + 0x4688));\n }\n\n if ((I(8) & 0xff) == 0 && UC(0x595c) != 0)\n func_ov006_02114b10(g);\n\n return 1;\n}\n", "source": "lunavyqo-e7f2c-nearmiss-pr"} {"module": "ov075", "addr": "0x0211bb00", "name": "__sinit_ov075_0211bb00", "size": 2588, "target_hex": "00402de90cd04de210089fe568e9ffeb0c089fe580c0a0e31030a0e304189fe504289fe5b0c0c0e1b230c0e1aa5dfdebf8079fe53c30a0e3e8179fe5f0279fe5b030c0e11030a0e3b230c0e1a25dfdebe0079fe51c30a0e3c8179fe5d8279fe5b030c0e11030a0e3b230c0e19a5dfdebc8079fe50810a0e3b010c0e11010a0e3b210c0e19c179fe5b4279fe5925dfdebb0079fe50810a0e3b010c0e11010a0e3b210c0e17c179fe59c279fe58a5dfdeb98079fe52010a0e3b010c0e11010a0e3b210c0e15c179fe584279fe5825dfdeb80079fe53010a0e3b010c0e11010a0e3b210c0e13c179fe56c279fe57a5dfdeb68079fe52010a0e3b010c0e1b210c0e120179fe558279fe5735dfdeb54079fe52810a0e3b010c0e11010a0e3b210c0e100179fe540279fe56b5dfdeb3c079fe55810a0e3b010c0e11010a0e3b210c0e1e0169fe528279fe5635dfdeb24079fe57810a0e3b010c0e11010a0e3b210c0e1c0169fe510279fe55b5dfdeb0c079fe52010a0e3b010c0e11010a0e3b210c0e1a0169fe5f8269fe5535dfdebf4069fe50a10a0e3b010c0e11010a0e3b210c0e180169fe5e0269fe54b5dfdebdc069fe50010a0e3b010c0e1b210c0e164169fe5cc269fe5445dfdeb2020a0e3c4069fe51010a0e3b020c0e1b210c0e144169fe5b4269fe53c5dfdebb0069fe51810a0e3b010c0e11010a0e3b210c0e124169fe59c269fe5345dfdeb98069fe51c10a0e3b010c0e11010a0e3b210c0e104169fe584269fe52c5dfdeb80069fe51c10a0e3b010c0e11010a0e3b210c0e1e4159fe56c269fe5245dfdeb68069fe52010a0e3b010c0e11010a0e3b210c0e1c4159fe554269fe51c5dfdeb3020a0e34c069fe51010a0e3b020c0e1b210c0e1a4159fe53c269fe5145dfdeb38069fe53010a0e3b010c0e11010a0e3b210c0e184159fe524269fe50c5dfdeb20069fe53010a0e3b010c0e11010a0e3b210c0e164159fe50c269fe5045dfdeb08069fe53010a0e3b010c0e11010a0e3b210c0e144159fe5f4259fe5fc5cfdebf0059fe51810a0e3b010c0e11010a0e3b210c0e124159fe5dc259fe5f45cfdeb2020a0e3d4059fe51010a0e3b020c0e1b210c0e104159fe5c4259fe5ec5cfdebc0059fe52010a0e3b010c0e11010a0e3b210c0e1e4149fe5ac259fe5e45cfdeba8059fe52810a0e3b010c0e11010a0e3b210c0e1c4149fe594259fe5dc5cfdeb90059fe52010a0e3b010c0e11010a0e3b210c0e1a4149fe57c259fe5d45cfdeb78059fe53010a0e3b010c0e11010a0e3b210c0e184149fe564259fe5cc5cfdeb60059fe560e59fe5001090e5040090e500108de504008de500108ee504008ee510108ee514008ee540259fe540c59fe5003092e5042092e508308ee50c208ee510108ce514008ce528359fe528259fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce508e59fe508359fe508259fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee5e8249fe5e8c49fe5003092e5042092e510308ee514208ee510108ce514008ce5d0349fe5d0249fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce5b0e49fe5b0349fe5b0249fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee590249fe590c49fe5003092e5042092e510308ee514208ee510108ce514008ce578349fe578249fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce558e49fe558349fe558249fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee538249fe538c49fe5003092e5042092e510308ee514208ee510108ce514008ce520349fe520249fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce500e49fe500349fe500249fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee5e0239fe5e0c39fe5003092e5042092e510308ee514208ee510108ce514008ce5c8339fe5c8239fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce5a8c39fe5a8239fe500108ce504008ce510108ce514008ce5003092e5042092e508308ce50c208ce588e39fe588339fe588239fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee568239fe568c39fe5003092e5042092e510308ee514208ee558339fe558239fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce538239fe538e39fe5003092e5042092e510308ce514208ce528339fe528239fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee508239fe508c39fe5003092e5042092e510308ee514208ee510108ce514008ce5f0329fe5f0229fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce5d0e29fe5d0229fe510108ee514008ee5003092e5042092e500308ee504208ee5b8229fe5b8329fe500c092e5042092e508c08ee50c208ee5081083e50c0083e5101083e5140083e598229fe598c29fe500e092e5042092e500e083e5042083e588329fe588229fe500e093e5043093e500e08ce504308ce5003092e5042092e508308ce50c208ce568229fe568e29fe5003092e5042092e510308ce514208ce558329fe558229fe500c093e5043093e500c08ee504308ee5003092e5042092e508308ee50c208ee538229fe538329fe500c092e5101083e510c08ee5140083e5041092e524029fe514108ee5001090e5040090e5001083e5040083e510029fe5001090e5040090e5081083e50c0083e50cd08de20040bde81eff2fe11cd7110248d911028cb90302fcd511024cd91102bcd6110250d91102c8d6110254d91102e0d6110258d91102a4d611025cd91102ecd6110260d91102f8d6110264d9110210d7110268d9110298d611026cd91102c0d5110270d91102ccd5110274d91102d8d5110278d91102b0d611027cd91102e4d511022cd71102f0d5110230d711028cd6110234d7110208d6110238d7110214d611023cd7110220d6110240d711022cd6110244d7110238d6110248d7110244d611024cd7110204d7110250d7110250d6110254d711025cd6110258d71102d4d611025cd7110268d6110260d7110274d6110264d7110280d61102586b080240d81102d0c8110258d8110200c7110250c7110288d8110250c8110228c81102c8c81102a0d81102f8c61102d8c71102d0d81102c0c81102d8c8110218c7110200d91102b0c71102b8c8110218d9110278c8110260c7110280c7110268d7110210c81102e8c7110280d7110268c7110298c8110238c71102b0d71102a8c8110240c81102c8d71102b8c71102e0d7110228c7110230c8110260c8110210d8110218c8110270c7110288c8110270d8110258c8110208c8110298c71102b8d81102a8c71102c8c71102e8d81102f0c7110248c7110230d91102a0c8110298d7110258c7110240c71102a0c71102f8d7110268c8110200c8110238c8110228d8110248c8110220c81102", "lang": "c", "divergences": 10, "c_source": "#pragma opt_common_subs off\nstruct P2 { int a, b; };\nstruct P6 { struct P2 lo, hi, tail; };\n\nextern void func_ov075_021160b4(void *);\nextern void func_020731dc(void *, void *, void **);\nextern void func_0203b98c(void);\n\nextern char data_ov075_0211d71c[];\n\nextern int data_ov075_0211d5c0;\nextern int data_ov075_0211d5cc;\nextern int data_ov075_0211d5d8;\nextern int data_ov075_0211d5e4;\nextern int data_ov075_0211d5f0;\nextern int data_ov075_0211d5fc;\nextern int data_ov075_0211d608;\nextern int data_ov075_0211d614;\nextern int data_ov075_0211d620;\nextern int data_ov075_0211d62c;\nextern int data_ov075_0211d638;\nextern int data_ov075_0211d644;\nextern int data_ov075_0211d650;\nextern int data_ov075_0211d65c;\nextern int data_ov075_0211d668;\nextern int data_ov075_0211d674;\nextern int data_ov075_0211d680;\nextern int data_ov075_0211d68c;\nextern int data_ov075_0211d698;\nextern int data_ov075_0211d6a4;\nextern int data_ov075_0211d6b0;\nextern int data_ov075_0211d6bc;\nextern int data_ov075_0211d6c8;\nextern int data_ov075_0211d6d4;\nextern int data_ov075_0211d6e0;\nextern int data_ov075_0211d6ec;\nextern int data_ov075_0211d6f8;\nextern int data_ov075_0211d704;\nextern int data_ov075_0211d710;\n\nextern int data_ov075_0211d72c;\nextern int data_ov075_0211d730;\nextern int data_ov075_0211d734;\nextern int data_ov075_0211d738;\nextern int data_ov075_0211d73c;\nextern int data_ov075_0211d740;\nextern int data_ov075_0211d744;\nextern int data_ov075_0211d748;\nextern int data_ov075_0211d74c;\nextern int data_ov075_0211d750;\nextern int data_ov075_0211d754;\nextern int data_ov075_0211d758;\nextern int data_ov075_0211d75c;\nextern int data_ov075_0211d760;\nextern int data_ov075_0211d764;\n\nextern int data_ov075_0211d948;\nextern int data_ov075_0211d94c;\nextern int data_ov075_0211d950;\nextern int data_ov075_0211d954;\nextern int data_ov075_0211d958;\nextern int data_ov075_0211d95c;\nextern int data_ov075_0211d960;\nextern int data_ov075_0211d964;\nextern int data_ov075_0211d968;\nextern int data_ov075_0211d96c;\nextern int data_ov075_0211d970;\nextern int data_ov075_0211d974;\nextern int data_ov075_0211d978;\nextern int data_ov075_0211d97c;\n\nextern struct P2 data_02086b58;\nextern struct P2 data_ov075_0211c6f8;\nextern struct P2 data_ov075_0211c700;\nextern struct P2 data_ov075_0211c718;\nextern struct P2 data_ov075_0211c728;\nextern struct P2 data_ov075_0211c738;\nextern struct P2 data_ov075_0211c740;\nextern struct P2 data_ov075_0211c748;\nextern struct P2 data_ov075_0211c750;\nextern struct P2 data_ov075_0211c758;\nextern struct P2 data_ov075_0211c760;\nextern struct P2 data_ov075_0211c768;\nextern struct P2 data_ov075_0211c770;\nextern struct P2 data_ov075_0211c780;\nextern struct P2 data_ov075_0211c798;\nextern struct P2 data_ov075_0211c7a0;\nextern struct P2 data_ov075_0211c7a8;\nextern struct P2 data_ov075_0211c7b0;\nextern struct P2 data_ov075_0211c7b8;\nextern struct P2 data_ov075_0211c7c8;\nextern struct P2 data_ov075_0211c7d8;\nextern struct P2 data_ov075_0211c7e8;\nextern struct P2 data_ov075_0211c7f0;\nextern struct P2 data_ov075_0211c800;\nextern struct P2 data_ov075_0211c808;\nextern struct P2 data_ov075_0211c810;\nextern struct P2 data_ov075_0211c818;\nextern struct P2 data_ov075_0211c820;\nextern struct P2 data_ov075_0211c828;\nextern struct P2 data_ov075_0211c830;\nextern struct P2 data_ov075_0211c838;\nextern struct P2 data_ov075_0211c840;\nextern struct P2 data_ov075_0211c848;\nextern struct P2 data_ov075_0211c850;\nextern struct P2 data_ov075_0211c858;\nextern struct P2 data_ov075_0211c860;\nextern struct P2 data_ov075_0211c868;\nextern struct P2 data_ov075_0211c878;\nextern struct P2 data_ov075_0211c888;\nextern struct P2 data_ov075_0211c898;\nextern struct P2 data_ov075_0211c8a0;\nextern struct P2 data_ov075_0211c8a8;\nextern struct P2 data_ov075_0211c8b8;\nextern struct P2 data_ov075_0211c8c0;\nextern struct P2 data_ov075_0211c8c8;\nextern struct P2 data_ov075_0211c8d0;\nextern struct P2 data_ov075_0211c8d8;\n\nextern struct P6 data_ov075_0211d768;\nextern struct P6 data_ov075_0211d780;\nextern struct P6 data_ov075_0211d798;\nextern struct P6 data_ov075_0211d7b0;\nextern struct P6 data_ov075_0211d7c8;\nextern struct P6 data_ov075_0211d7e0;\nextern struct P6 data_ov075_0211d7f8;\nextern struct P6 data_ov075_0211d810;\nextern struct P6 data_ov075_0211d828;\nextern struct P6 data_ov075_0211d840;\nextern struct P6 data_ov075_0211d858;\nextern struct P6 data_ov075_0211d870;\nextern struct P6 data_ov075_0211d888;\nextern struct P6 data_ov075_0211d8a0;\nextern struct P6 data_ov075_0211d8b8;\nextern struct P6 data_ov075_0211d8d0;\nextern struct P6 data_ov075_0211d8e8;\nextern struct P6 data_ov075_0211d900;\nextern struct P6 data_ov075_0211d918;\nextern struct P6 data_ov075_0211d930;\n\nvoid __sinit_ov075_0211bb00(void)\n{\n short *p;\n struct P2 tmp;\n int ta, tb;\n\n func_ov075_021160b4(data_ov075_0211d71c);\n\n p = (short *)(&data_ov075_0211d948);\n ((short *)(&data_ov075_0211d948))[0] = 0x80;\n ((short *)(&data_ov075_0211d948))[1] = 0x10;\n func_020731dc((short *)(&data_ov075_0211d948), (void *)func_0203b98c, (void **)&data_ov075_0211d5fc);\n\n p = (short *)(&data_ov075_0211d94c); p[0] = 0x3c; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6bc);\n p = (short *)(&data_ov075_0211d950); p[0] = 0x1c; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6c8);\n\n p = (short *)(&data_ov075_0211d954); p[0] = 8; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6e0);\n p = (short *)(&data_ov075_0211d958); p[0] = 8; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6a4);\n p = (short *)(&data_ov075_0211d95c); p[0] = 0x20; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6ec);\n p = (short *)(&data_ov075_0211d960); p[0] = 0x30; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6f8);\n p = (short *)(&data_ov075_0211d964); p[0] = 0x20; p[1] = 0x20;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d710);\n p = (short *)(&data_ov075_0211d968); p[0] = 0x28; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d698);\n p = (short *)(&data_ov075_0211d96c); p[0] = 0x58; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d5c0);\n p = (short *)(&data_ov075_0211d970); p[0] = 0x78; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d5cc);\n p = (short *)(&data_ov075_0211d974); p[0] = 0x20; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d5d8);\n p = (short *)(&data_ov075_0211d978); p[0] = 0xa; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6b0);\n p = (short *)(&data_ov075_0211d97c); p[0] = 0; p[1] = 0;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d5e4);\n\n {\n int sz = 0x20;\n int h = 0x10;\n ((short *)(&data_ov075_0211d72c))[0] = (short)sz;\n ((short *)(&data_ov075_0211d72c))[1] = (short)h;\n func_020731dc((short *)(&data_ov075_0211d72c), (void *)func_0203b98c, (void **)&data_ov075_0211d5f0);\n }\n\n p = (short *)(&data_ov075_0211d730); p[0] = 0x18; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d68c);\n p = (short *)(&data_ov075_0211d734); p[0] = 0x1c; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d608);\n p = (short *)(&data_ov075_0211d738); p[0] = 0x1c; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d614);\n p = (short *)(&data_ov075_0211d73c); p[0] = 0x20; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d620);\n\n {\n int sz = 0x30;\n int h = 0x10;\n ((short *)(&data_ov075_0211d740))[0] = (short)sz;\n ((short *)(&data_ov075_0211d740))[1] = (short)h;\n func_020731dc((short *)(&data_ov075_0211d740), (void *)func_0203b98c, (void **)&data_ov075_0211d62c);\n }\n\n p = (short *)(&data_ov075_0211d744); p[0] = 0x30; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d638);\n p = (short *)(&data_ov075_0211d748); p[0] = 0x30; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d644);\n p = (short *)(&data_ov075_0211d74c); p[0] = 0x30; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d704);\n p = (short *)(&data_ov075_0211d750); p[0] = 0x18; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d650);\n\n {\n int sz = 0x20;\n int h = 0x10;\n ((short *)(&data_ov075_0211d754))[0] = (short)sz;\n ((short *)(&data_ov075_0211d754))[1] = (short)h;\n func_020731dc((short *)(&data_ov075_0211d754), (void *)func_0203b98c, (void **)&data_ov075_0211d65c);\n }\n\n p = (short *)(&data_ov075_0211d758); p[0] = 0x20; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d6d4);\n p = (short *)(&data_ov075_0211d75c); p[0] = 0x28; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d668);\n p = (short *)(&data_ov075_0211d760); p[0] = 0x20; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d674);\n p = (short *)(&data_ov075_0211d764); p[0] = 0x30; p[1] = 0x10;\n func_020731dc(p, (void *)func_0203b98c, (void **)&data_ov075_0211d680);\n\n tmp = data_02086b58;\n ta = tmp.a;\n tb = tmp.b;\n\n data_ov075_0211d840.lo = tmp;\n data_ov075_0211d840.tail.a = tb ? ta : ta;\n data_ov075_0211d840.tail.b = tb;\n data_ov075_0211d840.hi = data_ov075_0211c8d0;\n\n data_ov075_0211d858.tail.a = tb ? ta : ta;\n data_ov075_0211d858.tail.b = tb;\n data_ov075_0211d858.lo = data_ov075_0211c700;\n data_ov075_0211d858.hi = data_ov075_0211c750;\n\n data_ov075_0211d888.lo = data_ov075_0211c850;\n data_ov075_0211d888.hi = data_ov075_0211c828;\n data_ov075_0211d888.tail = data_ov075_0211c8c8;\n\n data_ov075_0211d8a0.tail.a = tb ? ta : ta;\n data_ov075_0211d8a0.tail.b = tb;\n data_ov075_0211d8a0.lo = data_ov075_0211c6f8;\n data_ov075_0211d8a0.hi = data_ov075_0211c7d8;\n\n data_ov075_0211d8d0.lo = data_ov075_0211c8c0;\n data_ov075_0211d8d0.hi = data_ov075_0211c8d8;\n data_ov075_0211d8d0.tail = data_ov075_0211c718;\n\n data_ov075_0211d900.tail.a = tb ? ta : ta;\n data_ov075_0211d900.tail.b = tb;\n data_ov075_0211d900.lo = data_ov075_0211c7b0;\n data_ov075_0211d900.hi = data_ov075_0211c8b8;\n\n data_ov075_0211d918.lo = data_ov075_0211c878;\n data_ov075_0211d918.hi = data_ov075_0211c760;\n data_ov075_0211d918.tail = data_ov075_0211c780;\n\n data_ov075_0211d768.tail.a = tb ? ta : ta;\n data_ov075_0211d768.tail.b = tb;\n data_ov075_0211d768.lo = data_ov075_0211c810;\n data_ov075_0211d768.hi = data_ov075_0211c7e8;\n\n data_ov075_0211d780.lo = data_ov075_0211c768;\n data_ov075_0211d780.hi = data_ov075_0211c898;\n data_ov075_0211d780.tail = data_ov075_0211c738;\n\n data_ov075_0211d7b0.tail.a = tb ? ta : ta;\n data_ov075_0211d7b0.tail.b = tb;\n data_ov075_0211d7b0.lo = data_ov075_0211c8a8;\n data_ov075_0211d7b0.hi = data_ov075_0211c840;\n\n data_ov075_0211d7c8.lo = tmp;\n data_ov075_0211d7c8.tail.a = tb ? ta : ta;\n data_ov075_0211d7c8.tail.b = tb;\n data_ov075_0211d7c8.hi = data_ov075_0211c7b8;\n\n data_ov075_0211d7e0.lo = data_ov075_0211c728;\n data_ov075_0211d7e0.hi = data_ov075_0211c830;\n data_ov075_0211d7e0.tail = data_ov075_0211c860;\n\n data_ov075_0211d810.lo = data_ov075_0211c818;\n data_ov075_0211d810.hi = data_ov075_0211c770;\n data_ov075_0211d810.tail = data_ov075_0211c888;\n\n data_ov075_0211d870.lo = data_ov075_0211c858;\n data_ov075_0211d870.hi = data_ov075_0211c808;\n data_ov075_0211d870.tail = data_ov075_0211c798;\n\n data_ov075_0211d8b8.tail.a = tb ? ta : ta;\n data_ov075_0211d8b8.tail.b = tb;\n data_ov075_0211d8b8.lo = data_ov075_0211c7a8;\n data_ov075_0211d8b8.hi = data_ov075_0211c7c8;\n\n data_ov075_0211d8e8.lo = data_ov075_0211c7f0;\n data_ov075_0211d8e8.tail.a = tb ? ta : ta;\n data_ov075_0211d8e8.tail.b = tb;\n data_ov075_0211d8e8.hi = data_ov075_0211c748;\n\n data_ov075_0211d930.hi = tmp;\n data_ov075_0211d930.tail.a = tb ? ta : ta;\n data_ov075_0211d930.tail.b = tb;\n data_ov075_0211d930.lo = data_ov075_0211c8a0;\n\n data_ov075_0211d798.lo = data_ov075_0211c758;\n data_ov075_0211d798.hi = data_ov075_0211c740;\n data_ov075_0211d798.tail = data_ov075_0211c7a0;\n\n data_ov075_0211d7f8.lo = data_ov075_0211c868;\n data_ov075_0211d7f8.hi = data_ov075_0211c800;\n data_ov075_0211d7f8.tail = data_ov075_0211c838;\n\n data_ov075_0211d828.tail.a = tb ? ta : ta;\n data_ov075_0211d828.tail.b = tb;\n data_ov075_0211d828.lo = data_ov075_0211c848;\n data_ov075_0211d828.hi = data_ov075_0211c820;\n}\n", "source": "lunavyqo-grok-build-batch6"} {"module": "ov006", "addr": "0x0210c9e0", "name": "func_ov006_0210c9e0", "size": 2076, "target_hex": "f04f2de904d04de20040a0e1012984e2b41692e50d0051e301f18f90d10100ea0c0000ea270000ea330000ea3a0000eaf30000ea2a0100ea390100ea4b0100eab00100ea7c0100eabd0100ea7a0100eabb0100ea970100ea0010a0e30130a0e3010084e0010980e2011081e20237c0e5030051e3f9ffffba010984e20020a0e30527c0e50a27c0e50b27c0e51c179fe5b43680e5010084e015feffebc400d4e53c10a0e3000050e30100a003c300c405c400c4050000a003b00cc401010984e20c17c0e5a70100eae4069fe5000084e0c7b8fceb000050e3a201001a160ea0e32317fceb010984e21e10a0e30c17c0e50210a0e3b41680e59a0100eab0069fe5000084e0bab8fceb000050e3010984020310a003b4168005920100ea0090a0e30980a0e18c669fe50930a0e188069fe588b69fe588169fe588269fe5085084e002a085e00050dae5010055e30400000a085184e0015985e2a45695e5000055e32000000a015984e20857d5e5087184e0019089e208c085e00150b7e70cc196e70c5045e0005087e5005097e5000055e3140000aa0050dae5010055e3003087151000001a20569fe508a084e005508ae000a0d5e501a08ae200a0c5e500c0d5e590accee04ee1a0e1acafa0e10ee08ae09beecae00ee04ce000e0c5e5005097e5015785e2005087e5018088e2030058e3d1ffffba000059e30700000a010984e2b00690e5c4259fe50210a0e30030a0e33316fceb011984e2b00681e5010984e20507d0e5030050e34000002aa0059fe5a0159fe50020d0e50030a0e30201d1e70211a0e1000050e30300000a88059fe50100d0e7000050e30130a013000053e34001000a6c059fe50211a0e1010080e00290d0e50360d0e560859fe544259fe50050a0e31f10e0e3050084e00230f0e7010053e32100001a853188e0857198e7043093e5077049e0200057e3033046e01a0000ca010057e1180000ba200053e3160000ca010053e1140000ba10159fe50030a0e30030c0e5012084e00010d2e5010984e2011081e20010c2e57116d0e5000051e30300000a7136c0e5a80094e5b41094e5ac82feebd0149fe5d4049fe5851191e70116a0e18616fceb110100ea015085e2030055e3d6ffffba0d0100ea0130a0e30020a0e30210a0e1020184e0010980e2a40690e5012082e2000050e30130a011030052e3f7ffffba010053e30001001a0400a0e1ecfdffeb011984e20a07c1e50000a0e3b80681e50a07d1e5000050e30700000a0927d1e558049fe558149fe5003084e00200d1e7001093e5000081e0000083e5010984e20b27d0e5000052e30500000a030052e328049f3500108430000091358200803000008135010984e2a83094e5b82690e57c0690e5b41094e5923020e07382feeb010984e20410a0e3b41680e53c10a0e30c17c0e5d80000eaa8039fe5000084e0f8b7fceb000050e3d300001a010984e20a17d0e5000051e30800000a0927d0e5c0039fe5c0139fe50231a0e1bc239fe5f31091e1f32092e1000084e0fafcffeb010984e20b07d0e5000050e30a00000a030050e30800002a010040e290139fe50031a0e18c239fe58c039fe5f31091e1f32092e1000084e0ebfcffeb011984e2b80691e5000050e30900000a6c039fe50520a0e3b42681e56420a0e3000084e00c27c1e5bafcffeb2600a0e33c16fceb050000ea0700a0e3b40681e53c20a0e30e00a0e30c27c1e53516fceb0000a0e3c300c4e5a00000eac8029fe5000084e0c0b7fceb000050e39b00001a011984e2ac029fe5b81691e5000084e0f4fcffeb010984e23c10a0e30c17c0e50610a0e3b41680e5900000ea800692e5000050e30100a0030000a013000050e38a00000aa80094e5fd82feeb68029fe5000084e0a8b7fceb000050e38300001a0400a0e1002090e50410a0e3482092e532ff2fe17d0000ea3c029fe5000084e09db7fceb000050e37800001aa80094e5000050e3050000da0400a0e1002090e50510a0e3482092e532ff2fe16f0000ea0450a0e10060a0e30d10a0e308729fe50c829fe5f8019fe5f8b19fe5062184e0079082e0003099e5062084e0013783e2003089e5083082e00020d3e5016086e2030056e3012082e20020c3e50020d3e59092cae04aa1a0e1a29fa0e10aa089e09b9acae009a042e000a0c3e50020d3e5022085e0012982e2c016c2e5155085e2e5ffffba010984e20910a0e3b41680e54a0000ea80019fe5091041e2c150a0e1003084e0051193e7050184e0021a41e2051183e7011980e2a40691e5000050e33e0000aa0030a0e398019fe5a43681e50a10a0e30c17c2e5002084e0001092e550019fe5011081e2001082e5851190e7590fa0e30116a0e1a415fceb000055e32e00001a0200a0e37784feeb2b0000ea54019fe5001084e0000091e5020a40e2000081e5ac0692e5000050e3230000aa0000a0e3ac0682e53c00a0e30c07c2e50810a0e3ec009fe5b41682e5101090e5590fa0e30116a0e18c15fceb170000eaa4009fe5000084e037b7fceb000050e31200001af4009fe53684fcebec009fe50210a0e3e286fceb0010a0e30120a0e10500a0e38984fceb080000ea68009fe5000084e028b7fceb000050e3b4009f050010840000009105010080020000810540009fe5000084e0001090e5001091e531ff2fe170009fe5000084e043fcffeb78009fe5000084e040fcffeb70009fe5000084e009fcffeb0100a0e304d08de2f04fbde81eff2fe1604600000c47000000e61302310cc33015000000a446000002470000ff46000061010000400e0a02e80d0a02e90d0a023ce613020547000062010000b8460000d8e413028446000054e6130256e61302f8e41302fae41302904600009c460000b4460000ac4600001cf60902", "lang": "c", "divergences": 798, "c_source": "typedef signed char s8;\ntypedef unsigned char u8;\ntypedef signed short s16;\ntypedef unsigned short u16;\ntypedef signed int s32;\ntypedef unsigned int u32;\n\ntypedef void (*vfunc0)(void);\ntypedef void (*vfunc2)(u32, u32);\n\nextern u8 DecIfAbove0_Byte(u8* p);\nextern void func_ov006_0210c2d4(u8 *c);\nextern void Sound_PlayBank2_2D(u32 a);\nextern u32 func_020124c4(u32 a, u32 b, u32 c, u32 d);\nextern void func_ov004_020ad79c(u32 r0arg, u32 r1arg);\nextern void func_02012718(void *a, s32 b);\nextern u32 func_ov006_0210c500(u32 self);\nextern void func_ov006_0210c218(u8 *p, s16 a, s16 b);\nextern void func_ov006_0210c180(u8 *c);\nextern u32 func_02012790(u32 a);\nextern void func_ov006_0210c2c0(u32* p, s32 v);\nextern void func_ov004_020adb1c(u32 self);\nextern void func_ov004_020ae274(void* c);\nextern void Scene_SetFaders(void *fader);\nextern void func_0202ec9c(void *thiz, u32 arg1);\nextern void Scene_StartSceneFade(u32 a, u32 b, u16 c);\nextern void func_ov006_0210c278(u8 *o);\nextern void func_ov006_0210c1a8(u32 *o);\n\nextern u8 data_020a0e40;\nextern u8 data_020a0de8;\nextern u8 data_020a0de9;\nextern s32 data_ov006_0213e600;\nextern s32 data_ov006_0213e63c;\nextern u8 data_ov006_0213e4d8;\nextern s16 data_ov006_0213e654;\nextern s16 data_ov006_0213e656;\nextern s16 data_ov006_0213e4f8;\nextern s16 data_ov006_0213e4fa;\nextern u32 data_0209f61c;\n\nvoid func_ov006_0210c9e0(u32 r4) {\n u32 base4000 = r4 + 0x4000;\n switch (*(u32*)(base4000 + 0x6b4)) {\n case 0:\n case 1: {\n u32 i;\n for (i = 0; i < 3; i++) {\n *(u8*)(base4000 + i + 0x702) = 1;\n }\n *(u8*)(base4000 + 0x705) = 0;\n *(u8*)(base4000 + 0x70a) = 0;\n *(u8*)(base4000 + 0x70b) = 0;\n *(u32*)(base4000 + 0x6b4) = 1;\n func_ov006_0210c2d4((u8*)(r4 + 0x4660));\n if (*(u8*)(r4 + 0xc4) == 0) {\n *(u8*)(r4 + 0xc3) = 1;\n *(u8*)(r4 + 0xc4) = 1;\n *(u16*)(r4 + 0xc0) = 0;\n }\n *(u8*)(base4000 + 0x70c) = 0x3c;\n break;\n }\n case 2: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n Sound_PlayBank2_2D(0x160);\n *(u8*)(base4000 + 0x70c) = 0x1e;\n *(u32*)(base4000 + 0x6b4) = 2;\n }\n break;\n }\n case 3: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n *(u32*)(base4000 + 0x6b4) = 3;\n }\n break;\n }\n case 4: {\n u32 flag = 0;\n u32 i;\n for (i = 0; i < 3; i++) {\n if (*(u8*)(r4 + i + 0x4702) == 1) {\n u32 p = r4 + 0x46a4 + i * 4;\n if (*(u32*)p != 0) {\n u32 v = *(u8*)(base4000 + 0x708) + i;\n s32 diff = *(s32*)p - *(s32*)(&data_ov006_0213e600 + v);\n *(s32*)p = diff;\n if (diff < 0) {\n if (*(u8*)(r4 + i + 0x4702) == 1) {\n u8 n = *(u8*)(r4 + i + 0x46ff) + 1;\n *(u8*)(r4 + i + 0x46ff) = n - (n / 21) * 21;\n *(u32*)p += 0x40000;\n flag++;\n } else {\n *(u32*)p = 0;\n }\n }\n }\n }\n }\n if (flag != 0) {\n *(u32*)(base4000 + 0x6b0) = func_020124c4(*(u32*)(base4000 + 0x6b0), 2, 0x161, 0);\n if (*(u8*)(base4000 + 0x705) < 3) {\n u8 idx = data_020a0e40;\n if (*(u8*)(&data_020a0de8 + idx * 4) != 0 &&\n *(u8*)(&data_020a0de9 + idx * 4) != 0) {\n u8 *arr = &data_020a0de8 + idx * 4;\n u8 sb = arr[2];\n u8 r6 = arr[3];\n u32 j;\n for (j = 0; j < 3; j++) {\n if (*(u8*)(r4 + j + 0x4702) == 1) {\n s16 x = sb - *(s16*)((u8*)&data_ov006_0213e63c + j * 8);\n s16 y = r6 - *(s16*)((u8*)&data_ov006_0213e63c + j * 8 + 4);\n if (x <= 0x20 && x >= -0x20 && y <= 0x20 && y >= -0x20) {\n *(u8*)(r4 + j + 0x4702) = 0;\n *(u8*)(r4 + 0x4705) += 1;\n if (*(u8*)(base4000 + 0x671) != 0) {\n *(u8*)(base4000 + 0x671) = 0;\n func_ov004_020ad79c(*(u32*)(r4 + 0xa8), *(u32*)(r4 + 0xb4));\n }\n func_02012718((void*)0x162, *(s32*)(&data_ov006_0213e63c + j * 2) << 12);\n return;\n }\n }\n }\n }\n } else {\n u32 all_zero = 1;\n u32 k;\n for (k = 0; k < 3; k++) {\n if (*(u32*)(r4 + 0x46a4 + k * 4) != 0) {\n all_zero = 0;\n }\n }\n if (all_zero) {\n u8 res = func_ov006_0210c500(r4);\n *(u8*)(r4 + 0x470a) = res;\n *(u32*)(base4000 + 0x6b8) = 0;\n if (res != 0) {\n u8 r2 = *(u8*)(r4 + 0x4709);\n *(u32*)(base4000 + 0x46b8) += *(u8*)(&data_ov006_0213e4d8 + r2);\n if (*(u8*)(r4 + 0x470b) != 0 && *(u8*)(r4 + 0x470b) < 3) {\n *(u32*)(base4000 + 0x46b8) += *(u8*)(r4 + 0x470b) * 2;\n }\n func_ov004_020ad79c(*(u32*)(r4 + 0xa8) + *(u32*)(base4000 + 0x6b8) * *(u32*)(base4000 + 0x67c), *(u32*)(r4 + 0xb4));\n *(u32*)(base4000 + 0x6b4) = 4;\n *(u8*)(base4000 + 0x70c) = 0x3c;\n }\n }\n }\n }\n break;\n }\n case 5: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n if (*(u8*)(r4 + 0x470a) != 0) {\n u8 r1 = *(u8*)(r4 + 0x4709);\n func_ov006_0210c218((u8*)(r4 + 0x4684), *(s16*)(&data_ov006_0213e654 + r1), *(s16*)(&data_ov006_0213e656 + r1));\n }\n if (*(u8*)(r4 + 0x470b) != 0 && *(u8*)(r4 + 0x470b) < 3) {\n u8 r0 = *(u8*)(r4 + 0x470b) - 1;\n func_ov006_0210c218((u8*)(r4 + 0x4690), *(s16*)(&data_ov006_0213e4f8 + r0), *(s16*)(&data_ov006_0213e4fa + r0));\n }\n if (*(u32*)(base4000 + 0x6b8) != 0) {\n *(u32*)(base4000 + 0x6b4) = 5;\n *(u8*)(base4000 + 0x70c) = 0x64;\n func_ov006_0210c180((u8*)(r4 + 0x469c));\n func_02012790(0x26);\n } else {\n *(u32*)(base4000 + 0x6b4) = 7;\n *(u8*)(base4000 + 0x70c) = 0x3c;\n func_02012790(0xe);\n *(u8*)(r4 + 0xc3) = 0;\n }\n }\n break;\n }\n case 6: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n func_ov006_0210c2c0((u32*)(r4 + 0x4660), *(s32*)(base4000 + 0x6b8));\n *(u8*)(base4000 + 0x70c) = 0x3c;\n *(u32*)(base4000 + 0x6b4) = 6;\n }\n break;\n }\n case 7: {\n if (*(u32*)(r4 + 0x4680) == 0) {\n func_ov004_020adb1c(*(u32*)(r4 + 0xa8));\n }\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n (*(vfunc2*)*(u32*)*(u32*)(r4 + 0x4660))(r4, 4);\n }\n break;\n }\n case 8: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n if (*(u32*)(r4 + 0xa8) > 0) {\n (*(vfunc2*)*(u32*)*(u32*)(r4 + 0x4660))(r4, 5);\n }\n }\n break;\n }\n case 9: {\n u32 i;\n u32 p = r4;\n for (i = 0; i < 3; i++) {\n *(u32*)(p + 0x46a4 + i * 4) += 0x40000;\n u8 n = *(u8*)(p + i + 0x46ff) + 1;\n *(u8*)(p + i + 0x46ff) = n - (n / 21) * 21;\n *(u8*)(p + *(u8*)p + *(u8*)(p + i + 0x46ff) + 0x46c0) = 0xd;\n p += 0x15;\n }\n *(u32*)(base4000 + 0x6b4) = 9;\n break;\n }\n case 10: {\n u32 idx = (*(u32*)(base4000 + 0x6b4) - 9) >> 1;\n u32 p = r4 + 0x46a4 + idx * 4;\n *(s32*)p -= 0x2000;\n if (*(s32*)p < 0) {\n *(u32*)p = 0;\n *(u8*)(base4000 + 0x70c) = 0xa;\n *(u32*)(base4000 + 0x6b4) += 1;\n func_02012718((void*)0x164, *(s32*)(&data_ov006_0213e63c + idx * 2) << 12);\n if (idx == 0) {\n func_ov004_020ae274((void*)2);\n }\n }\n break;\n }\n case 11: {\n u32 p = r4 + 0x46ac;\n *(s32*)p -= 0x2000;\n if (*(s32*)p < 0) {\n *(u32*)p = 0;\n *(u8*)(base4000 + 0x70c) = 0x3c;\n *(u32*)(base4000 + 0x6b4) = 8;\n func_02012718((void*)0x164, *(s32*)(&data_ov006_0213e63c + 2) << 12);\n }\n break;\n }\n case 12: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n Scene_SetFaders(&data_0209f61c);\n func_0202ec9c(&data_0209f61c, 2);\n Scene_StartSceneFade(5, 0, 0);\n }\n break;\n }\n case 13: {\n if (DecIfAbove0_Byte((u8*)(r4 + 0x470c)) == 0) {\n *(u32*)(base4000 + 0x46b4) += 1;\n }\n (*(vfunc0*)*(u32*)*(u32*)(r4 + 0x4660))();\n func_ov006_0210c278((u8*)(r4 + 0x4684));\n func_ov006_0210c278((u8*)(r4 + 0x4690));\n func_ov006_0210c1a8((u32*)(r4 + 0x469c));\n return;\n }\n }\n}\n", "source": "fanout-glm-5.2"} -{"module": "arm9", "addr": "0x02047910", "name": "func_02047910", "size": 2340, "target_hex": "f04f2de9c4d04de200008de50c0090e50170a0e184008de500009de50260a0e1101090e584008de288108de500109de50350a0e1141091e58c108de50c1097e590108de5101097e594108de5141097e598108de55e2f00eb0080a0e190008de25b2f00eb089040e084a09de590109de595c9cbe00a3041e09593c3e088209de594009de58c109de5020040e098409de595e0c0e0014044e008008de59544c0e010008de5020ba0e300c09ce000b0abe2009099e00c408de52cc6a0e10bca8ce10030a3e22996a0e1039a89e109308ae000a09ee008909de52aa6a0e10090a9e209aa8ae10aa082e00c209de50c8088e0009092e010209de52996a0e10020a2e2029a89e1099081e0a8308de59323c1e0aca08de59acacbe099a9c3e000a09ae0b0908de50090a3e22a36a0e1093a83e1009092e00020a1e200109ce02996a0e10000abe22116a0e1029a89e1001a81e1010089e0000093e0c54fa0e1c4d08d02f04fbd081eff2f01a8008de20010a0e1992e00eba8009de5021ba0e39038c2e0013093e00000a2e22326a0e1002a82e10c2086e5ac209de584008de29298c3e0019099e00020a3e22936a0e1023a83e1103086e5b0209de59288c3e0012098e00010a3e22226a0e1012a82e100109de5142086e5001091e584108de500109de5041091e588108de500109de5081091e58c108de5001097e590108de5041097e594108de5081097e598108de5f02e00eb0080a0e190008de2ed2e00eb08a040e084009de590109de594b09de5003041e0c31fa0e118108de588109de514008de51c108de51c209de5ca9fa0e102204be0c2bfa0e120b08de595ca8be095b92be094ba2be0020ba0e300a09ce00090abe22aa6a0e109aa8ae18c109de598e09de50a8088e001a04ee0ca9fa0e124908de518909de595c38be095b92be000909ce094b32be00030abe22996a0e1039a89e114309de5099083e099e9c3e070308de59c908de520309de595b289e0959329e000309be0949229e00020a9e22336a0e1023a83e11c209de595ca8be0032082e0a0208de59292c3e024209de595b22be094ba2be000a09ce00020abe22aa6a0e102aa8ae10aa081e09a2ac1e0a4a08de500a092e00020a1e22a16a0e1021a81e170209de500b09ee000a0a2e2002099e02b96a0e10000a3e22226a0e10a9a89e1002a82e1020089e0000091e0c4d08d02f04fbd081eff2f019c008de20010a0e1192e00eb9c009de5021ba0e39038c2e0013093e00000a2e22326a0e1002a82e1002086e5a0209de584008de29298c3e0019099e00020a3e22936a0e1023a83e1043086e5a4209de59288c3e0012098e00010a3e22226a0e1012a82e100109de5082086e5181091e584108de500109de51c1091e588108de500109de5201091e58c108de5181097e590108de51c1097e594108de5201097e598108de5702e00eb28008de590008de26d2e00eb28109de594b09de501a040e084009de590109de52c008de5008041e0c80fa0e130008de588009de5ca9fa0e134008de534109de5022ba0e301104be0c1bfa0e138b08de595ca8be095b92be094ba2be002a09ce00090abe22aa6a0e109aa8ae128909de595c88be00a9089e004908de530909de58c009de595b92be002909ce094b82be00080abe22996a0e1089a89e12c809de598e09de5099088e000a04ee038809de595c18be095b82be002809ce094b12be00010abe22886a0e1018a88e134109de5caefa0e1088081e095ba81e0951e21e0941a21e002a09be00010a1e22aa6a0e101aa8ae10aa080e09a1ac0e0021091e00000a0e221b6a0e100ba8be19919c0e0021091e00000a0e22116a0e1001a81e19808cce0020090e000c0ace22006a0e10c0a80e1000081e0b4908de5b8808de5bca08de500009be0c4d08d020030a0e3f04fbd081eff2f01ac009de5b0109de53c008de53cb09de5a8009de50b8048e000b049e03c909de501c04ae099accee002909ae003a0aee02996a0e10a9a89e190eccae040a08de591a8cce002a09ae003c0ace02aa6a0e10caa8ae10aa049e09098c8e048808de5ca8fa0e144908de54c808de5918bc9e0028098e00390a9e02886a0e1098a88e102909ee040c09de52996a0e103c0ace00c9a89e1099048e044809de548c09de5028098e003c0ace02886a0e10c8a88e13cc09de59ca08de59cbbcee002b09be003c0aee02bb6a0e10cba8be10b8048e098c8cbe002c09ce02cc6a0e103b0abe074c08de50bba8ce174b08de59abacce002b09be003c0ace050c08de52bc6a0e150b09de5a0908de50bca8ce199e9cbe002e09ee058b08de503b0abe02ee6a0e10bea8ee154b08de574b09de50ec08ce0a4808de50cb09be0c4d08d02f04fbd081eff2f013cb09de508c041e009e04be00ab040e0ce0fa0e15c008de5cc0fa0e160008de5990cc1e0020090e02006a0e10310a1e078008de5010a80e178008de5991bc0e06c008de568108de5980bc1e064108de5989ec1e0028099e00310a1e02886a0e1018a88e178109de55cb09de5081041e0028090e064009de52886a0e10300a0e0008a88e19191c0e07c908de560909de5b4108de580008de59a1c80e09a0920e04c909de5021091e0990c20e00300a0e02116a0e1001a81e1018048e0b8808de59818c0e09a9e88e09a8b28e04ca09de59a8e28e002a099e00390a8e02a86a0e1098a88e168909de502a099e06c909de52aa6a0e10390a9e009aa8ae10aa048e09a9ac8e0029099e0bca08de50380a8e02996a0e1089a89e17c809de580a09de5028098e003a0aae0021091e02826a0e10300a0e02116a0e10a2a82e1001a81e1010082e0000099e0c4d08d02f04fbd081eff2f01b4008de20010a0e1f32c00ebb4209de504009de5021ba0e39230c0e0012093e00000a0e22226a0e1002a82e1182086e5b8209de504009de59230c0e0012093e00000a0e22226a0e1002a82e11c2086e5bc209de504009de59230c0e0012093e00000a0e22226a0e1002a82e1202086e500009de5242097e5240090e5003042e0c32fa0e1959388e0958228e0948328e0013099e00020a8e22336a0e1023a83e1030080e0240086e500009de5282097e5280090e5003042e0c32fa0e1959388e0958228e0948328e0013099e00020a8e22336a0e1023a83e1030080e0280086e500009de52c8090e52c0097e5082040e0957283e0c20fa0e1953023e0011097e0943223e00000a3e22116a0e1001a81e1010088e02c0086e5c4d08de2f04fbde81eff2fe1", "lang": "c", "divergences": 814, "c_source": "\nstruct Vec3 {\n int x;\n int y;\n int z;\n};\n\nextern int LenVec3(struct Vec3 *v);\nextern void NormalizeVec3(struct Vec3 *dst, struct Vec3 *src);\n\nvoid func_02047910(int *param_1, int *param_2, int *param_3, unsigned param_4)\n{\n struct Vec3 a;\n struct Vec3 b;\n struct Vec3 yUnit;\n struct Vec3 xVec;\n struct Vec3 cross1;\n struct Vec3 cross2;\n int lenA;\n int lenB;\n int dx;\n int dy;\n int dz;\n int dlen;\n int zx;\n int zy;\n int zz;\n int len_sq;\n\n /* ---- column 1 (Y axis / indices 3..5) ---- */\n a.x = param_1[3];\n a.y = param_1[4];\n a.z = param_1[5];\n b.x = param_2[3];\n b.y = param_2[4];\n b.z = param_2[5];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n yUnit.x = a.x + (int)(((long long)(int)param_4 * (b.x - a.x) + 0x800) >> 12);\n yUnit.y = a.y + (int)(((long long)(int)param_4 * (b.y - a.y) + 0x800) >> 12);\n lenA = lenA + (int)(((long long)(int)param_4 * (lenB - lenA) + 0x800) >> 12);\n yUnit.z = a.z + (int)(((long long)(int)param_4 * (b.z - a.z) + 0x800) >> 12);\n len_sq = (int)(((long long)yUnit.z * yUnit.z + 0x800) >> 12) +\n (int)(((long long)yUnit.x * yUnit.x + 0x800) >> 12) +\n (int)(((long long)yUnit.y * yUnit.y + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n NormalizeVec3(&yUnit, &yUnit);\n param_3[3] = (int)(((long long)yUnit.x * lenA + 0x800) >> 12);\n param_3[4] = (int)(((long long)yUnit.y * lenA + 0x800) >> 12);\n param_3[5] = (int)(((long long)yUnit.z * lenA + 0x800) >> 12);\n\n /* ---- column 0 (X axis / indices 0..2) ---- */\n a.x = param_1[0];\n a.y = param_1[1];\n a.z = param_1[2];\n b.x = param_2[0];\n b.y = param_2[1];\n b.z = param_2[2];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n dlen = lenB - lenA;\n dx = b.x - a.x;\n dy = b.y - a.y;\n lenA = lenA + (int)(((long long)dlen * (int)param_4 + 0x800) >> 12);\n xVec.x = a.x + (int)(((long long)dx * (int)param_4 + 0x800) >> 12);\n dz = b.z - a.z;\n xVec.y = a.y + (int)(((long long)dy * (int)param_4 + 0x800) >> 12);\n xVec.z = a.z + (int)(((long long)dz * (int)param_4 + 0x800) >> 12);\n len_sq = (int)(((long long)xVec.z * xVec.z + 0x800) >> 12) +\n (int)(((long long)xVec.x * xVec.x + 0x800) >> 12) +\n (int)(((long long)xVec.y * xVec.y + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n NormalizeVec3(&xVec, &xVec);\n param_3[0] = (int)(((long long)xVec.x * lenA + 0x800) >> 12);\n param_3[1] = (int)(((long long)xVec.y * lenA + 0x800) >> 12);\n param_3[2] = (int)(((long long)xVec.z * lenA + 0x800) >> 12);\n\n /* ---- column 2 (Z): lerp, then Cross(Cross(Y, Z), Y) ---- */\n a.x = param_1[6];\n a.y = param_1[7];\n a.z = param_1[8];\n b.x = param_2[6];\n b.y = param_2[7];\n b.z = param_2[8];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n dlen = lenB - lenA;\n dx = b.x - a.x;\n dy = b.y - a.y;\n lenA = lenA + (int)(((long long)dlen * (int)param_4 + 0x800) >> 12);\n zx = a.x + (int)(((long long)dx * (int)param_4 + 0x800) >> 12);\n dz = b.z - a.z;\n zy = a.y + (int)(((long long)dy * (int)param_4 + 0x800) >> 12);\n zz = a.z + (int)(((long long)dz * (int)param_4 + 0x800) >> 12);\n len_sq = (int)(((long long)zz * zz + 0x800) >> 12) +\n (int)(((long long)zx * zx + 0x800) >> 12) +\n (int)(((long long)zy * zy + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n\n cross1.x = (int)(((long long)yUnit.y * (zz - yUnit.z) + 0x800) >> 12) -\n (int)(((long long)yUnit.z * (zy - yUnit.y) + 0x800) >> 12);\n cross1.y = (int)(((long long)yUnit.z * (zx - yUnit.x) + 0x800) >> 12) -\n (int)(((long long)yUnit.x * (zz - yUnit.z) + 0x800) >> 12);\n cross1.z = (int)(((long long)yUnit.x * (zy - yUnit.y) + 0x800) >> 12) -\n (int)(((long long)yUnit.y * (zx - yUnit.x) + 0x800) >> 12);\n\n if ((int)(((long long)cross1.z * cross1.z + 0x800) >> 12) +\n (int)(((long long)cross1.x * cross1.x + 0x800) >> 12) +\n (int)(((long long)cross1.y * cross1.y + 0x800) >> 12) != 0) {\n dz = yUnit.z - cross1.z;\n dy = yUnit.y - cross1.y;\n cross2.x = (int)(((long long)cross1.y * dz + 0x800) >> 12) -\n (int)(((long long)cross1.z * dy + 0x800) >> 12);\n cross2.y = (int)(((long long)cross1.z * (yUnit.x - cross1.x) + 0x800) >> 12) -\n (int)(((long long)dz * cross1.x + 0x800) >> 12);\n cross2.z = (int)(((long long)dy * cross1.x + 0x800) >> 12) -\n (int)(((long long)cross1.y * (yUnit.x - cross1.x) + 0x800) >> 12);\n\n if ((int)(((long long)cross2.z * cross2.z + 0x800) >> 12) +\n (int)(((long long)cross2.x * cross2.x + 0x800) >> 12) +\n (int)(((long long)cross2.y * cross2.y + 0x800) >> 12) != 0) {\n NormalizeVec3(&cross2, &cross2);\n param_3[6] = (int)(((long long)cross2.x * lenA + 0x800) >> 12);\n param_3[7] = (int)(((long long)cross2.y * lenA + 0x800) >> 12);\n param_3[8] = (int)(((long long)cross2.z * lenA + 0x800) >> 12);\n\n /* translation \u2014 only on full success path (matches Ghidra) */\n param_3[9] = param_1[9] +\n (int)(((long long)(param_2[9] - param_1[9]) * (int)param_4 + 0x800) >> 12);\n param_3[10] = param_1[10] +\n (int)(((long long)(param_2[10] - param_1[10]) * (int)param_4 + 0x800) >> 12);\n param_3[11] = param_1[11] +\n (int)(((long long)(param_2[11] - param_1[11]) * (int)param_4 + 0x800) >> 12);\n return;\n }\n return;\n }\n return;\n}\n", "source": "ghidra-full-20260723"} +{"module": "arm9", "addr": "0x02047910", "name": "func_02047910", "size": 2340, "target_hex": "f04f2de9c4d04de200008de50c0090e50170a0e184008de500009de50260a0e1101090e584008de288108de500109de50350a0e1141091e58c108de50c1097e590108de5101097e594108de5141097e598108de55e2f00eb0080a0e190008de25b2f00eb089040e084a09de590109de595c9cbe00a3041e09593c3e088209de594009de58c109de5020040e098409de595e0c0e0014044e008008de59544c0e010008de5020ba0e300c09ce000b0abe2009099e00c408de52cc6a0e10bca8ce10030a3e22996a0e1039a89e109308ae000a09ee008909de52aa6a0e10090a9e209aa8ae10aa082e00c209de50c8088e0009092e010209de52996a0e10020a2e2029a89e1099081e0a8308de59323c1e0aca08de59acacbe099a9c3e000a09ae0b0908de50090a3e22a36a0e1093a83e1009092e00020a1e200109ce02996a0e10000abe22116a0e1029a89e1001a81e1010089e0000093e0c54fa0e1c4d08d02f04fbd081eff2f01a8008de20010a0e1992e00eba8009de5021ba0e39038c2e0013093e00000a2e22326a0e1002a82e10c2086e5ac209de584008de29298c3e0019099e00020a3e22936a0e1023a83e1103086e5b0209de59288c3e0012098e00010a3e22226a0e1012a82e100109de5142086e5001091e584108de500109de5041091e588108de500109de5081091e58c108de5001097e590108de5041097e594108de5081097e598108de5f02e00eb0080a0e190008de2ed2e00eb08a040e084009de590109de594b09de5003041e0c31fa0e118108de588109de514008de51c108de51c209de5ca9fa0e102204be0c2bfa0e120b08de595ca8be095b92be094ba2be0020ba0e300a09ce00090abe22aa6a0e109aa8ae18c109de598e09de50a8088e001a04ee0ca9fa0e124908de518909de595c38be095b92be000909ce094b32be00030abe22996a0e1039a89e114309de5099083e099e9c3e070308de59c908de520309de595b289e0959329e000309be0949229e00020a9e22336a0e1023a83e11c209de595ca8be0032082e0a0208de59292c3e024209de595b22be094ba2be000a09ce00020abe22aa6a0e102aa8ae10aa081e09a2ac1e0a4a08de500a092e00020a1e22a16a0e1021a81e170209de500b09ee000a0a2e2002099e02b96a0e10000a3e22226a0e10a9a89e1002a82e1020089e0000091e0c4d08d02f04fbd081eff2f019c008de20010a0e1192e00eb9c009de5021ba0e39038c2e0013093e00000a2e22326a0e1002a82e1002086e5a0209de584008de29298c3e0019099e00020a3e22936a0e1023a83e1043086e5a4209de59288c3e0012098e00010a3e22226a0e1012a82e100109de5082086e5181091e584108de500109de51c1091e588108de500109de5201091e58c108de5181097e590108de51c1097e594108de5201097e598108de5702e00eb28008de590008de26d2e00eb28109de594b09de501a040e084009de590109de52c008de5008041e0c80fa0e130008de588009de5ca9fa0e134008de534109de5022ba0e301104be0c1bfa0e138b08de595ca8be095b92be094ba2be002a09ce00090abe22aa6a0e109aa8ae128909de595c88be00a9089e004908de530909de58c009de595b92be002909ce094b82be00080abe22996a0e1089a89e12c809de598e09de5099088e000a04ee038809de595c18be095b82be002809ce094b12be00010abe22886a0e1018a88e134109de5caefa0e1088081e095ba81e0951e21e0941a21e002a09be00010a1e22aa6a0e101aa8ae10aa080e09a1ac0e0021091e00000a0e221b6a0e100ba8be19919c0e0021091e00000a0e22116a0e1001a81e19808cce0020090e000c0ace22006a0e10c0a80e1000081e0b4908de5b8808de5bca08de500009be0c4d08d020030a0e3f04fbd081eff2f01ac009de5b0109de53c008de53cb09de5a8009de50b8048e000b049e03c909de501c04ae099accee002909ae003a0aee02996a0e10a9a89e190eccae040a08de591a8cce002a09ae003c0ace02aa6a0e10caa8ae10aa049e09098c8e048808de5ca8fa0e144908de54c808de5918bc9e0028098e00390a9e02886a0e1098a88e102909ee040c09de52996a0e103c0ace00c9a89e1099048e044809de548c09de5028098e003c0ace02886a0e10c8a88e13cc09de59ca08de59cbbcee002b09be003c0aee02bb6a0e10cba8be10b8048e098c8cbe002c09ce02cc6a0e103b0abe074c08de50bba8ce174b08de59abacce002b09be003c0ace050c08de52bc6a0e150b09de5a0908de50bca8ce199e9cbe002e09ee058b08de503b0abe02ee6a0e10bea8ee154b08de574b09de50ec08ce0a4808de50cb09be0c4d08d02f04fbd081eff2f013cb09de508c041e009e04be00ab040e0ce0fa0e15c008de5cc0fa0e160008de5990cc1e0020090e02006a0e10310a1e078008de5010a80e178008de5991bc0e06c008de568108de5980bc1e064108de5989ec1e0028099e00310a1e02886a0e1018a88e178109de55cb09de5081041e0028090e064009de52886a0e10300a0e0008a88e19191c0e07c908de560909de5b4108de580008de59a1c80e09a0920e04c909de5021091e0990c20e00300a0e02116a0e1001a81e1018048e0b8808de59818c0e09a9e88e09a8b28e04ca09de59a8e28e002a099e00390a8e02a86a0e1098a88e168909de502a099e06c909de52aa6a0e10390a9e009aa8ae10aa048e09a9ac8e0029099e0bca08de50380a8e02996a0e1089a89e17c809de580a09de5028098e003a0aae0021091e02826a0e10300a0e02116a0e10a2a82e1001a81e1010082e0000099e0c4d08d02f04fbd081eff2f01b4008de20010a0e1f32c00ebb4209de504009de5021ba0e39230c0e0012093e00000a0e22226a0e1002a82e1182086e5b8209de504009de59230c0e0012093e00000a0e22226a0e1002a82e11c2086e5bc209de504009de59230c0e0012093e00000a0e22226a0e1002a82e1202086e500009de5242097e5240090e5003042e0c32fa0e1959388e0958228e0948328e0013099e00020a8e22336a0e1023a83e1030080e0240086e500009de5282097e5280090e5003042e0c32fa0e1959388e0958228e0948328e0013099e00020a8e22336a0e1023a83e1030080e0280086e500009de52c8090e52c0097e5082040e0957283e0c20fa0e1953023e0011097e0943223e00000a3e22116a0e1001a81e1010088e02c0086e5c4d08de2f04fbde81eff2fe1", "lang": "c", "divergences": 814, "c_source": "\nstruct Vec3 {\n int x;\n int y;\n int z;\n};\n\nextern int LenVec3(struct Vec3 *v);\nextern void NormalizeVec3(struct Vec3 *dst, struct Vec3 *src);\n\nvoid func_02047910(int *param_1, int *param_2, int *param_3, unsigned param_4)\n{\n struct Vec3 a;\n struct Vec3 b;\n struct Vec3 yUnit;\n struct Vec3 xVec;\n struct Vec3 cross1;\n struct Vec3 cross2;\n int lenA;\n int lenB;\n int dx;\n int dy;\n int dz;\n int dlen;\n int zx;\n int zy;\n int zz;\n int len_sq;\n\n /* ---- column 1 (Y axis / indices 3..5) ---- */\n a.x = param_1[3];\n a.y = param_1[4];\n a.z = param_1[5];\n b.x = param_2[3];\n b.y = param_2[4];\n b.z = param_2[5];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n yUnit.x = a.x + (int)(((long long)(int)param_4 * (b.x - a.x) + 0x800) >> 12);\n yUnit.y = a.y + (int)(((long long)(int)param_4 * (b.y - a.y) + 0x800) >> 12);\n lenA = lenA + (int)(((long long)(int)param_4 * (lenB - lenA) + 0x800) >> 12);\n yUnit.z = a.z + (int)(((long long)(int)param_4 * (b.z - a.z) + 0x800) >> 12);\n len_sq = (int)(((long long)yUnit.z * yUnit.z + 0x800) >> 12) +\n (int)(((long long)yUnit.x * yUnit.x + 0x800) >> 12) +\n (int)(((long long)yUnit.y * yUnit.y + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n NormalizeVec3(&yUnit, &yUnit);\n param_3[3] = (int)(((long long)yUnit.x * lenA + 0x800) >> 12);\n param_3[4] = (int)(((long long)yUnit.y * lenA + 0x800) >> 12);\n param_3[5] = (int)(((long long)yUnit.z * lenA + 0x800) >> 12);\n\n /* ---- column 0 (X axis / indices 0..2) ---- */\n a.x = param_1[0];\n a.y = param_1[1];\n a.z = param_1[2];\n b.x = param_2[0];\n b.y = param_2[1];\n b.z = param_2[2];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n dlen = lenB - lenA;\n dx = b.x - a.x;\n dy = b.y - a.y;\n lenA = lenA + (int)(((long long)dlen * (int)param_4 + 0x800) >> 12);\n xVec.x = a.x + (int)(((long long)dx * (int)param_4 + 0x800) >> 12);\n dz = b.z - a.z;\n xVec.y = a.y + (int)(((long long)dy * (int)param_4 + 0x800) >> 12);\n xVec.z = a.z + (int)(((long long)dz * (int)param_4 + 0x800) >> 12);\n len_sq = (int)(((long long)xVec.z * xVec.z + 0x800) >> 12) +\n (int)(((long long)xVec.x * xVec.x + 0x800) >> 12) +\n (int)(((long long)xVec.y * xVec.y + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n NormalizeVec3(&xVec, &xVec);\n param_3[0] = (int)(((long long)xVec.x * lenA + 0x800) >> 12);\n param_3[1] = (int)(((long long)xVec.y * lenA + 0x800) >> 12);\n param_3[2] = (int)(((long long)xVec.z * lenA + 0x800) >> 12);\n\n /* ---- column 2 (Z): lerp, then Cross(Cross(Y, Z), Y) ---- */\n a.x = param_1[6];\n a.y = param_1[7];\n a.z = param_1[8];\n b.x = param_2[6];\n b.y = param_2[7];\n b.z = param_2[8];\n lenA = LenVec3(&a);\n lenB = LenVec3(&b);\n dlen = lenB - lenA;\n dx = b.x - a.x;\n dy = b.y - a.y;\n lenA = lenA + (int)(((long long)dlen * (int)param_4 + 0x800) >> 12);\n zx = a.x + (int)(((long long)dx * (int)param_4 + 0x800) >> 12);\n dz = b.z - a.z;\n zy = a.y + (int)(((long long)dy * (int)param_4 + 0x800) >> 12);\n zz = a.z + (int)(((long long)dz * (int)param_4 + 0x800) >> 12);\n len_sq = (int)(((long long)zz * zz + 0x800) >> 12) +\n (int)(((long long)zx * zx + 0x800) >> 12) +\n (int)(((long long)zy * zy + 0x800) >> 12);\n if (len_sq == 0) {\n return;\n }\n\n cross1.x = (int)(((long long)yUnit.y * (zz - yUnit.z) + 0x800) >> 12) -\n (int)(((long long)yUnit.z * (zy - yUnit.y) + 0x800) >> 12);\n cross1.y = (int)(((long long)yUnit.z * (zx - yUnit.x) + 0x800) >> 12) -\n (int)(((long long)yUnit.x * (zz - yUnit.z) + 0x800) >> 12);\n cross1.z = (int)(((long long)yUnit.x * (zy - yUnit.y) + 0x800) >> 12) -\n (int)(((long long)yUnit.y * (zx - yUnit.x) + 0x800) >> 12);\n\n if ((int)(((long long)cross1.z * cross1.z + 0x800) >> 12) +\n (int)(((long long)cross1.x * cross1.x + 0x800) >> 12) +\n (int)(((long long)cross1.y * cross1.y + 0x800) >> 12) != 0) {\n dz = yUnit.z - cross1.z;\n dy = yUnit.y - cross1.y;\n cross2.x = (int)(((long long)cross1.y * dz + 0x800) >> 12) -\n (int)(((long long)cross1.z * dy + 0x800) >> 12);\n cross2.y = (int)(((long long)cross1.z * (yUnit.x - cross1.x) + 0x800) >> 12) -\n (int)(((long long)dz * cross1.x + 0x800) >> 12);\n cross2.z = (int)(((long long)dy * cross1.x + 0x800) >> 12) -\n (int)(((long long)cross1.y * (yUnit.x - cross1.x) + 0x800) >> 12);\n\n if ((int)(((long long)cross2.z * cross2.z + 0x800) >> 12) +\n (int)(((long long)cross2.x * cross2.x + 0x800) >> 12) +\n (int)(((long long)cross2.y * cross2.y + 0x800) >> 12) != 0) {\n NormalizeVec3(&cross2, &cross2);\n param_3[6] = (int)(((long long)cross2.x * lenA + 0x800) >> 12);\n param_3[7] = (int)(((long long)cross2.y * lenA + 0x800) >> 12);\n param_3[8] = (int)(((long long)cross2.z * lenA + 0x800) >> 12);\n\n /* translation — only on full success path (matches Ghidra) */\n param_3[9] = param_1[9] +\n (int)(((long long)(param_2[9] - param_1[9]) * (int)param_4 + 0x800) >> 12);\n param_3[10] = param_1[10] +\n (int)(((long long)(param_2[10] - param_1[10]) * (int)param_4 + 0x800) >> 12);\n param_3[11] = param_1[11] +\n (int)(((long long)(param_2[11] - param_1[11]) * (int)param_4 + 0x800) >> 12);\n return;\n }\n return;\n }\n return;\n}\n", "source": "ghidra-full-20260723"} {"module": "ov006", "addr": "0x020e1dc8", "name": "func_ov006_020e1dc8", "size": 756, "target_hex": "f04f2de914d04de201b0a0e12c10a0e39b0101e010108de500008de50010a0e110009de5bc229fe5001081e0b8029fe500709de5026081e0005081e000a0a0e3010987e28916d0e5000051e39e00000a0a005be19c00000a642690e5001095e5603690e5010042e04086a0e1980800e0001096e5011043e04196a0e1990920e0c01fa0e13c6efdeb0040a0e10800a0e10910a0e19e65fdeb0008a0e1180054e32008a0e1880000ca4002a0e180b0a0e101008be234629fe58000a0e1f04096e11a00a0e32c10a0e3943087e09a010ce00090a0e3021ba0e3013093e02386a0e18b30a0e1fc519fe500209de5947927e010b09de5052082e00bb082e00cb08de50cb082e004b08de5c4bfa0e19b7027e00040a7e2048a88e110409de500b09de5044092e710709de5084684e00c4082e707708be0012987e2f33096e10b70a0e10c7087e064e692e59c419fe50b60a0e1048086e00c6088e008608de50b60a0e1055087e004b087e0937084e0011097e0934924e0c32fa0e1924024e00000a4e22116a0e1001a81e101068ee00c0088e7010986e28916d0e5000051e34300000a09005ae14100000a642690e500109be5603690e5010042e04076a0e1970700e0001095e5011043e04186a0e1980820e0c01fa0e1e86dfdeb0040a0e10700a0e10810a0e14a65fdeb0008a0e1180054e32008a0e12d0000ca4002a0e18010a0e1012081e2e4009fe58220a0e1f27090e11a40a0e30050a0e397a488e0978528e000209de52c30a0e3992326e0c72fa0e1928428e0023ba0e304209de503909ae00070a8e22986a0e1002092e5078a88e1087682e0012986e2607682e58110a0e1f16090e108009de5968487e0038098e0001090e5967527e0c63fa0e1937427e00030a7e22846a0e1034a84e1041681e0641682e50c109de5e800a0e3001091e5aac1fceb14d08de2f04fbde81eff2fe1019089e2050059e32c6086e2b3ffffba14d08de2f04fbde81eff2fe101a08ae205005ae32c7087e258ffffba14d08de2f04fbde81eff2fe1604600006446000014220802", "lang": "c", "divergences": 999, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef short s16;\n\nextern int _ZN4cstd4sqrtEy(unsigned long long v);\nextern int _ZN4cstd5atan2E5Fix12IiES1_(int a, int b);\nextern void func_02012718(int id, int x);\nextern s16 data_02082214[];\n\nvoid func_ov006_020e1dc8(char *c, int idx)\n{\n int i;\n char *w;\n int *selfx;\n int *selfz;\n int *px;\n int *pz;\n int *sx;\n int n;\n\n *(volatile int *)&n = idx * 0x2c;\n selfx = (int *)(c + n + 0x4660);\n selfz = (int *)(c + n + 0x4664);\n w = c;\n for (i = 0; i < 5; i++, w += 0x2c) {\n if (*(u8 *)(w + 0x4689) != 0 && idx != i) {\n int dz = (*(int *)(w + 0x4664) - *selfz) >> 12;\n int dx = (*(int *)(w + 0x4660) - *selfx) >> 12;\n int dist = _ZN4cstd4sqrtEy((long long)(dx * dx + dz * dz));\n u16 ang = _ZN4cstd5atan2E5Fix12IiES1_(dz, dx);\n if (dist <= 0x18) {\n int s1;\n int m;\n int *qx;\n int *qz;\n char *w2;\n int k;\n int s2;\n idx = (ang >> 4) * 2;\n s1 = data_02082214[idx + 1];\n m = i * 0x2c;\n k = 0;\n *(int * volatile *)&sx = (int *)(c + 0x4660 + n);\n *(int * volatile *)&px = (int *)(c + 0x4660 + m);\n *(int *)(c + 0x4660 + m) = *sx + ((int)(((long long)s1 * 0x1a + 0x800) >> 12) << 12);\n s2 = data_02082214[idx];\n *(int * volatile *)&pz = (int *)(c + 0x4664 + m);\n w2 = c;\n qx = (int *)(c + m + 0x4660);\n qz = (int *)(c + m + 0x4664);\n *(int *)(c + 0x4664 + m) = *(int *)(c + n + 0x4664) + ((int)(((long long)s2 * 0x1a + 0x800) >> 12) << 12);\n for (; k < 5; k++, w2 += 0x2c) {\n if (*(u8 *)(w2 + 0x4689) != 0 && i != k) {\n int dz2 = (*(int *)(w2 + 0x4664) - *qz) >> 12;\n int dx2 = (*(int *)(w2 + 0x4660) - *qx) >> 12;\n int dist2 = _ZN4cstd4sqrtEy((long long)(dx2 * dx2 + dz2 * dz2));\n u16 ang2 = _ZN4cstd5atan2E5Fix12IiES1_(dz2, dx2);\n if (dist2 <= 0x18) {\n int j2 = (ang2 >> 4) * 2;\n int s3 = data_02082214[j2 + 1];\n *(int *)(c + k * 0x2c + 0x4660) = *px + ((int)(((long long)s3 * 0x1a + 0x800) >> 12) << 12);\n {\n int s4 = data_02082214[j2];\n *(int *)(c + k * 0x2c + 0x4664) = *pz + ((int)(((long long)s4 * 0x1a + 0x800) >> 12) << 12);\n }\n func_02012718(0xe8, *sx);\n return;\n }\n }\n }\n return;\n }\n }\n }\n}\n", "source": "fable-subagent", "note": "Nested 5-slot repulsion: loop1 pushes slot i away from slot idx (sin/cos*0x1a via 64-bit rounded umull+mla), nested loop2 pushes slot k away from slot i, sound 0xe8 + early return. Logic fully decoded and check-blocks align; residual is the push-block spill schedule: ROM spills {c@sp0, px@4, pz@8, sx@0xc, n@0x10} and homes idx/j in fp, table in r6, k=0 merged with the umull zero. Load-bearing discoveries: volatile-cast store (*(volatile int*)&n = ...) forces the eager plain spill without volatile-read reloads (plain volatile double-reloads, int n[1] scalar-replaces); dist expr must be spelled dx*dx+dz*dz to get ROM mul(dz)/mla(dx) order (mwcc muls the LAST product first); x-read must be *sx (copy-propagated to [r2,r4]); z-read inline (c+n+0x4664) split form; decl order px,pz,sx before n reproduces slot order. Remaining: candidate 184 vs 189 insns - fewer spill reloads, j homes caller-saved. Try: forcing sx/px/pz reload scheduling or C++ frontend."} {"module": "ov006", "addr": "0x020d27dc", "name": "func_ov006_020d27dc", "size": 3656, "target_hex": "f04f2de964d04de20090a0e1011989e2c82691e50040a0e3000052e30a0000dae40d9fe5042189e0003082e0002093e5014084e2000052e3012042c2002083c5c82691e5020054e1f5ffffba000052e30080a0e364d08dd2f04fbdd81eff2fd1d700a0e320008de5cf00a0e31c008de5c700a0e318008de5bf00a0e314008de5e000a0e310008de50200a0e334008de50500a0e330008de50700a0e338008de5070da0e30c808de560808de55c808de558808de554808de550808de54c808de548808de544808de540808de50160a0e304b0a0e30640a0e324008de50350a0e33c808de52c808de528808de5080189e0010980e2b80690e5000050e33a0300ca080d9fe5887189e0002087e0010989e2001092e5000790e5000051e15e0100daec0c9fe5081089e0000081e008008de50000d0e5010050e32b03000a0900a0e1001090e50ca09de5901091e531ff2fe1000050e33100000ab81c9fe50720a0e1017082e0080189e0001097e5010980e2a40690e5600051e3040000ca600051e3110000aa200051e30800000a4f0000eaa00051e3020000caa00051e31100000a4a0000eae00051e31500000a470000ea011989e2141791e5000051e1050a891206a0a0019863c015400000ea011989e2181791e5000051e1050a891206a0a0019963c015390000ea011989e21c1791e5000051e1050a891206a0a0019a63c015320000ea011989e2201791e5000051e1050a891206a0a0019b63c0152b0000eaf00b9fe50000b7e7600050e3040000ca600050e3110000aa200050e30800000a220000eaa00050e3020000caa00050e31100000a1d0000eae00050e31500000a1a0000ea010989e2140790e5010050e3050a891206a0a0019863c015130000ea010989e2180790e5010050e3050a891206a0a0019963c0150c0000ea010989e21c0790e5010050e3050a891206a0a0019a63c015050000ea010989e2200790e5010050e3050a891206a0a0019b63c01501005ae3b300001a0900a0e1001090e5901091e531ff2fe1000050e35300000a010989e2d506d0e5000050e32100001a001097e510009de50116a0e10afffceb080189e0010980e2a40690e5030050e300f18f901b0000ea020000ea060000ea0a0000ea0e0000ea001097e514009de50116a0e1fcfefceb120000ea001097e518009de50116a0e1f7fefceb0d0000ea001097e51c009de50116a0e1f2fefceb080000ea001097e520009de50116a0e1edfefceb030000ea001097e5880a9fe50116a0e1e8fefceb08009de50060c0e5780a9fe5002089e0001092e5010989e2011081e2001082e5cc2690e5c81690e5010052e1880200bad506d0e5000050e31400001a480a9fe5481a9fe5003089e0000093e5012089e0010080e2000083e5001092e5050a89e2011081e2001082e5e82390e5201a9fe564d08de2010052e1e81380c5050a89e27810a0e3e01380e5f04fbde81eff2fe1050a89e21e10a0e3e01380e564d08de2f04fbde81eff2fe1d0099fe5881189e0007081e0001097e510009de50116a0e1b7fefceb001097e5c8099fe50116a0e1b3fefceb08009de50060c0e5a4099fe5002089e0001092e5010989e2011081e2001082e5cc1690e5c80690e5000051e1530200ba80099fe580199fe5003089e0000093e5012089e0010080e2000083e5001092e5050a89e2011081e2001082e5e82390e558199fe5010052e1e81380c5050a89e2d42390e51c10a0e3920103e044199fe5031091e7000051e31200000a010051e30600000a020051e32c099f0500108900000091050500800200008105090000ea740390e5a01fa0e1800f61e0e00f91e00400001a00099fe5001089e0000091e5050080e2000081e5050a89e2681390e5640051e36410a0c3681380c5050a89e2741390e5050051e3090000ba3c10a0e3c01380e5010989e20210a0e3d01680e50110a0e3d416c0e564d08de2f04fbde81eff2fe1010989e20010a0e3d01680e564d08de2f04fbde81eff2fe10900a0e1001090e5901091e531ff2fe1000050e32500000a0500a0e30500fdeb010989e2d506d0e5000050e30600001a880189e0010980e2601690e550089fe50116a0e152fefceb050000ea880189e0010980e2601690e514089fe50116a0e14bfefceb08009de50120a0e30020c0e5010989e2fc179fe5d526c0e5012089e0001092e564d08de2011081e2001082e5cc1690e5c80690e5000051e1050a89a23c10a0a3e01380a5f04fbde81eff2fe1880189e0010980e2601690e5e100a0e30116a0e132fefceb050a89e23c10a0e3c01380e5010989e20210a0e3d01680e50110a0e3d516c0e564d08de2f04fbde81eff2fe1bf30e0e3030051e1010000ba980051e3030000ba000092e5010080e2000082e5ca0100ea78379fe5087089e003a087e00030dae5010053e30c00008a010081e2000082e50900a0e10810a0e10520a0e1cbfdffeb000050e3bc01001a0900a0e10810a0e10b20a0e1c5fdffebb70100ead42081e2d41080e27d0fa0e3920000e0399ffceb04008de518079fe5081189e0007081e0000097e5070050e300f18f90aa0100ea060000ea410000ea5f0000ea9a0000ead40000ea0e0100ea490100ea670100ea880189e0010980e2600690e5210050e30500000a610050e30300000aa10050e30100000ae10050e31000001a84069fe5881189e00000b1e7010040e2000081e5004087e50060cae5000091e50006a0e1d5fdfceb00008de504309de524009de528209de50410a0e1c0fdfceb860100ea2c209de50900a0e10810a0e18ffdffeb000050e38001001a0900a0e10810a0e10620a0e189fdffeb000050e37a01001a0900a0e10810a0e10520a0e183fdffeb000050e37401001a30209de50900a0e10810a0e17dfdffeb000050e36e01001a34209de50900a0e10810a0e177fdffeb000050e338009d0500008705660100ea0900a0e10810a0e10620a0e16ffdffeb000050e36001001a3c209de50900a0e10810a0e169fdffeb000050e35a01001a34209de50900a0e10810a0e163fdffeb000050e35401001a0900a0e10810a0e10520a0e15dfdffeb000050e34e01001a0900a0e10810a0e10b20a0e157fdffeb000050e300408705470100ea880189e0010980e2600690e51f0050e30500000a5f0050e30300000a9f0050e30100000adf0050e31000001a18059fe5881189e00000b1e7010080e2000081e5004087e50060cae5000091e50006a0e17afdfceb00008de504309de524009de540209de50410a0e165fdfceb2b0100ea34209de50900a0e10810a0e134fdffeb000050e32501001a0900a0e10810a0e10620a0e12efdffeb000050e31f01001a0900a0e10810a0e10b20a0e128fdffeb000050e31901001a44209de50900a0e10810a0e122fdffeb000050e31301001a38209de50900a0e10810a0e11cfdffeb000050e330009d05000087050b0100ea880189e0010980e2600690e5210050e30500000a610050e30300000aa10050e30100000ae10050e31000001a28049fe5881189e00000b1e7010040e2000081e5004087e50060cae5000091e50006a0e13efdfceb00008de504309de524009de548209de50410a0e129fdfcebef0000ea0900a0e10810a0e10520a0e1f8fcffeb000050e3e900001a4c209de50900a0e10810a0e1f2fcffeb000050e3e300001a30209de50900a0e10810a0e1ecfcffeb000050e3dd00001a0900a0e10810a0e10620a0e1e6fcffeb000050e3d700001a0900a0e10810a0e10420a0e1e0fcffeb000050e300b08705d00000ea880189e0010980e2600690e51f0050e30500000a5f0050e30300000a9f0050e30100000adf0050e31000001a3c039fe5881189e00000b1e7010080e2000081e5004087e50060cae5000091e50006a0e103fdfceb00008de504309de524009de550209de50410a0e1eefcfcebb40000ea0900a0e10810a0e10b20a0e1bdfcffeb000050e3ae00001a34209de50900a0e10810a0e1b7fcffeb000050e3a800001a38209de50900a0e10810a0e1b1fcffeb000050e3a200001a0900a0e10810a0e10620a0e1abfcffeb000050e39c00001a0900a0e10810a0e10420a0e1a5fcffeb000050e300508705950000ea880189e0010980e2600690e5210050e30500000a610050e30300000aa10050e30100000ae10050e31000001a50029fe5881189e00000b1e7010040e2000081e5004087e50060cae5000091e50006a0e1c8fcfceb00008de504309de524009de554209de50410a0e1b3fcfceb790000ea30209de50900a0e10810a0e182fcffeb000050e37300001a0900a0e10810a0e10420a0e17cfcffeb000050e36d00001a0900a0e10810a0e10520a0e176fcffeb000050e36700001a58209de50900a0e10810a0e170fcffeb000050e36100001a38209de50900a0e10810a0e16afcffeb000050e334009d0500008705590000ea0900a0e10810a0e10420a0e162fcffeb000050e35300001a30209de50900a0e10810a0e15cfcffeb000050e34d00001a38209de50900a0e10810a0e156fcffeb000050e34700001a0900a0e10810a0e10520a0e150fcffeb000050e34100001a0900a0e10810a0e10b20a0e14afcffeb000050e3006087053a0000ea880189e0010980e2600690e51f0050e30500000a5f0050e30300000a9f0050e30100000adf0050e31000001ae4009fe5881189e00000b1e7010080e2000081e5004087e50060cae5000091e50006a0e16dfcfceb00008de504309de524009de55c209de50410a0e158fcfceb1e0000ea38209de50900a0e10810a0e127fcffeb000050e31800001a0900a0e10810a0e10420a0e121fcffeb000050e31200001a0900a0e10810a0e10b20a0e11bfcffeb000050e30c00001a30209de50900a0e10810a0e115fcffeb000050e30600001a34209de50900a0e10810a0e10ffcffeb000050e360009d0500008705018088e2010989e2c80690e5000058e1bafcffba64d08de2f04fbde81eff2fe1b846000064460000b446000060460000c3010000cc46000074530000e85300000f270000c1010000c0e1120268530000c20100008046000084460000", "lang": "cpp", "divergences": 184, "c_source": "//cpp\n#pragma opt_strength_reduction off\n#pragma opt_common_subs off\n\ntypedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned int u32;\ntypedef int s32;\n\nextern \"C\" {\nextern void func_02012718(int a, int b);\nextern void func_02012dbc(int a);\nextern int func_ov006_020d25fc(void *thiz, int idx, u32 val);\nextern int func_020126e8(int a);\nextern void func_020126ac(int a0, int a1, int a2, int a3, int a4);\nextern int data_ov006_0212e1c0[];\n}\n\nstruct Obj {\n virtual void m00(); virtual void m04(); virtual void m08(); virtual void m0c();\n virtual void m10(); virtual void m14(); virtual void m18(); virtual void m1c();\n virtual void m20(); virtual void m24(); virtual void m28(); virtual void m2c();\n virtual void m30(); virtual void m34(); virtual void m38(); virtual void m3c();\n virtual void m40(); virtual void m44(); virtual void m48(); virtual void m4c();\n virtual void m50(); virtual void m54(); virtual void m58(); virtual void m5c();\n virtual void m60(); virtual void m64(); virtual void m68(); virtual void m6c();\n virtual void m70(); virtual void m74(); virtual void m78(); virtual void m7c();\n virtual void m80(); virtual void m84(); virtual void m88(); virtual void m8c();\n virtual int m90();\n};\n\nextern \"C\" void func_ov006_020d27dc(void *arg0)\n{\n char *p = (char *)arg0;\n s32 var_r4;\n s32 idx;\n s32 count;\n\n for (var_r4 = 0; var_r4 < (count = *(s32 *)(p + 0x46c8)); ) {\n s32 *slot = (s32 *)(((long long)(int)(p + var_r4 * 4 + 0x46b8)) & 0xFFFFFFFFFFFFFFFFLL);\n s32 v = *slot;\n var_r4++;\n if (v > 0) {\n *slot = v - 1;\n }\n }\n\n idx = 0;\n if (count <= 0) {\n return;\n }\n\n {\n s32 v20 = 0xd7;\n s32 v1c = 0xcf;\n s32 v18 = 0xc7;\n s32 v14 = 0xbf;\n s32 v10 = 0xe0;\n s32 v34 = 2;\n s32 v30 = 5;\n s32 v38 = 7;\n s32 vC = 0;\n s32 v60 = 0;\n s32 v5c = 0;\n s32 v58 = 0;\n s32 v54 = 0;\n s32 v50 = 0;\n s32 v4c = 0;\n s32 v48 = 0;\n s32 v44 = 0;\n s32 v40 = 0;\n s32 c1 = 1;\n s32 c4 = 4;\n s32 c6 = 6;\n s32 v24 = 0x1c0;\n s32 c3 = 3;\n s32 v3c = 0;\n s32 v2c = 0;\n s32 v28 = 0;\n\n for (idx = 0; idx < *(s32 *)(p + 0x46c8); idx++) {\n if (*(s32 *)(p + idx * 4 + 0x46b8) > 0) {\n continue;\n }\n\n {\n s32 dist = *(s32 *)(p + idx * 8 + 0x4664);\n s32 lim = *(s32 *)(p + 0x4700);\n\n if (dist > lim) {\n u8 *flag = (u8 *)(p + idx + 0x46b4);\n if (*flag != 1) {\n s32 sl = vC;\n s32 *dirSlot;\n s32 dirVal;\n\n if (((struct Obj *)p)->m90() != 0) {\n dirSlot = (s32 *)(p + idx * 8 + 0x4660);\n dirVal = *dirSlot;\n u32 want = *(u32 *)(p + idx * 4 + 0x46a4);\n switch (dirVal) {\n case 0x20:\n if (*(s32 *)(p + 0x4714) == (s32)want) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x5398) = c1;\n }\n break;\n case 0x60:\n if (*(s32 *)(p + 0x4718) == (s32)want) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x5399) = c1;\n }\n break;\n case 0xa0:\n if (*(s32 *)(p + 0x471c) == (s32)want) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x539a) = c1;\n }\n break;\n case 0xe0:\n if (*(s32 *)(p + 0x4720) == (s32)want) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x539b) = c1;\n }\n break;\n }\n } else {\n dirSlot = (s32 *)(p + idx * 8 + 0x4660);\n dirVal = *dirSlot;\n switch (dirVal) {\n case 0x20:\n if (*(s32 *)(p + 0x4714) == 1) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x5398) = c1;\n }\n break;\n case 0x60:\n if (*(s32 *)(p + 0x4718) == 1) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x5399) = c1;\n }\n break;\n case 0xa0:\n if (*(s32 *)(p + 0x471c) == 1) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x539a) = c1;\n }\n break;\n case 0xe0:\n if (*(s32 *)(p + 0x4720) == 1) {\n sl = c1;\n } else {\n *(u8 *)(p + 0x539b) = c1;\n }\n break;\n }\n }\n\n if (sl == 1) {\n if (((struct Obj *)p)->m90() != 0) {\n if (*(u8 *)(p + 0x46d5) == 0) {\n func_02012718(v10, *dirSlot << 0xc);\n u32 w2 = *(u32 *)(p + idx * 4 + 0x46a4);\n switch (w2) {\n default:\n break;\n case 0:\n func_02012718(v14, *dirSlot << 0xc);\n break;\n case 1:\n func_02012718(v18, *dirSlot << 0xc);\n break;\n case 2:\n func_02012718(v1c, *dirSlot << 0xc);\n break;\n case 3:\n func_02012718(v20, *dirSlot << 0xc);\n break;\n }\n } else {\n func_02012718(0x1c3, *dirSlot << 0xc);\n }\n *flag = c1;\n *(s32 *)(p + 0x46cc) += 1;\n if (*(s32 *)(p + 0x46cc) >= *(s32 *)(p + 0x46c8)) {\n if (*(u8 *)(p + 0x46d5) == 0) {\n *(s32 *)(((int)p + 0x5374) & 0xFFFFFFFFFFFFFFFFLL) += 1;\n *(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) += 1;\n if (*(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) > 0x270f) {\n *(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) = 0x270f;\n }\n *(s32 *)(p + 0x53e0) = 0x78;\n return;\n }\n *(s32 *)(p + 0x53e0) = 0x1e;\n return;\n }\n continue;\n }\n\n {\n s32 *d2 = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n func_02012718(v10, *d2 << 0xc);\n func_02012718(0x1c1, *d2 << 0xc);\n }\n *flag = c1;\n *(s32 *)(p + 0x46cc) += 1;\n if (*(s32 *)(p + 0x46cc) >= *(s32 *)(p + 0x46c8)) {\n s32 t;\n *(s32 *)(((int)p + 0x5374) & 0xFFFFFFFFFFFFFFFFLL) += 1;\n *(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) += 1;\n if (*(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) > 0x270f) {\n *(s32 *)(((int)p + 0x53e8) & 0xFFFFFFFFFFFFFFFFLL) = 0x270f;\n }\n t = *(s32 *)((char *)data_ov006_0212e1c0 + *(s32 *)(p + 0x53d4) * 0x1c);\n switch (t) {\n case 0:\n break;\n case 2:\n *(s32 *)(p + 0x5368) += 5;\n break;\n case 1:\n if ((*(s32 *)(p + 0x5374) % 2) == 0) {\n *(s32 *)(p + 0x5368) += 5;\n }\n break;\n }\n if (*(s32 *)(p + 0x5368) > 0x64) {\n *(s32 *)(p + 0x5368) = 0x64;\n }\n if (*(s32 *)(p + 0x5374) >= 5) {\n *(s32 *)(p + 0x53c0) = 0x3c;\n *(s32 *)(p + 0x46d0) = 2;\n *(u8 *)(p + 0x46d4) = 1;\n return;\n }\n *(s32 *)(p + 0x46d0) = 0;\n return;\n }\n continue;\n }\n\n if (((struct Obj *)p)->m90() != 0) {\n func_02012dbc(5);\n if (*(u8 *)(p + 0x46d5) == 0) {\n func_02012718(0x1c2, *(s32 *)(p + idx * 8 + 0x4660) << 0xc);\n } else {\n func_02012718(0x1c3, *(s32 *)(p + idx * 8 + 0x4660) << 0xc);\n }\n *flag = 1;\n *(u8 *)(p + 0x46d5) = 1;\n *(s32 *)(p + 0x46cc) += 1;\n if (*(s32 *)(p + 0x46cc) >= *(s32 *)(p + 0x46c8)) {\n *(s32 *)(p + 0x53e0) = 0x3c;\n }\n return;\n }\n func_02012718(0xe1, *(s32 *)(p + idx * 8 + 0x4660) << 0xc);\n *(s32 *)(p + 0x53c0) = 0x3c;\n *(s32 *)(p + 0x46d0) = 2;\n *(u8 *)(p + 0x46d5) = 1;\n return;\n }\n continue;\n }\n\n if (dist < -0xc0 || dist >= 0x98) {\n *(s32 *)(((int)(p + idx * 8) + 0x4664) & 0xFFFFFFFFFFFFFFFFLL) += 1;\n } else {\n u8 *flag2 = (u8 *)(p + idx + 0x4680);\n if ((u32)*flag2 <= 1) {\n *(s32 *)(p + idx * 8 + 0x4664) = dist + 1;\n if (func_ov006_020d25fc(p, idx, c3) == 0) {\n func_ov006_020d25fc(p, idx, c4);\n }\n } else {\n s32 tmp = ((dist + 0xd4) * 0x1f4) / (lim + 0xd4);\n s32 *statePtr = (s32 *)(p + idx * 4 + 0x4684);\n u32 state = *statePtr;\n switch (state) {\n default:\n break;\n case 0:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x21 || *(s32 *)(p + idx * 8 + 0x4660) == 0x61 ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0xa1 || *(s32 *)(p + idx * 8 + 0x4660) == 0xe1) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp -= 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v28, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, v2c) == 0 && func_ov006_020d25fc(p, idx, c1) == 0 &&\n func_ov006_020d25fc(p, idx, c3) == 0 && func_ov006_020d25fc(p, idx, v30) == 0) {\n if (func_ov006_020d25fc(p, idx, v34) == 0) {\n *statePtr = v38;\n }\n }\n break;\n case 1:\n if (func_ov006_020d25fc(p, idx, c1) == 0 && func_ov006_020d25fc(p, idx, v3c) == 0 &&\n func_ov006_020d25fc(p, idx, v34) == 0 && func_ov006_020d25fc(p, idx, c3) == 0) {\n if (func_ov006_020d25fc(p, idx, c4) == 0) {\n *statePtr = c6;\n }\n }\n break;\n case 2:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x1f || *(s32 *)(p + idx * 8 + 0x4660) == 0x5f ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0x9f || *(s32 *)(p + idx * 8 + 0x4660) == 0xdf) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp += 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v40, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, v34) == 0 && func_ov006_020d25fc(p, idx, c1) == 0 &&\n func_ov006_020d25fc(p, idx, c4) == 0 && func_ov006_020d25fc(p, idx, v44) == 0) {\n if (func_ov006_020d25fc(p, idx, v38) == 0) {\n *statePtr = v30;\n }\n }\n break;\n case 3:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x21 || *(s32 *)(p + idx * 8 + 0x4660) == 0x61 ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0xa1 || *(s32 *)(p + idx * 8 + 0x4660) == 0xe1) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp -= 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v48, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, c3) == 0 && func_ov006_020d25fc(p, idx, v4c) == 0 &&\n func_ov006_020d25fc(p, idx, v30) == 0 && func_ov006_020d25fc(p, idx, c1) == 0) {\n if (func_ov006_020d25fc(p, idx, c6) == 0) {\n *statePtr = c4;\n }\n }\n break;\n case 4:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x1f || *(s32 *)(p + idx * 8 + 0x4660) == 0x5f ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0x9f || *(s32 *)(p + idx * 8 + 0x4660) == 0xdf) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp += 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v50, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, c4) == 0 && func_ov006_020d25fc(p, idx, v34) == 0 &&\n func_ov006_020d25fc(p, idx, v38) == 0 && func_ov006_020d25fc(p, idx, c1) == 0) {\n if (func_ov006_020d25fc(p, idx, c6) == 0) {\n *statePtr = c3;\n }\n }\n break;\n case 5:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x21 || *(s32 *)(p + idx * 8 + 0x4660) == 0x61 ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0xa1 || *(s32 *)(p + idx * 8 + 0x4660) == 0xe1) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp -= 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v54, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, v30) == 0 && func_ov006_020d25fc(p, idx, c6) == 0 &&\n func_ov006_020d25fc(p, idx, c3) == 0 && func_ov006_020d25fc(p, idx, v58) == 0) {\n if (func_ov006_020d25fc(p, idx, v38) == 0) {\n *statePtr = v34;\n }\n }\n break;\n case 6:\n if (func_ov006_020d25fc(p, idx, c6) == 0 && func_ov006_020d25fc(p, idx, v30) == 0 &&\n func_ov006_020d25fc(p, idx, v38) == 0 && func_ov006_020d25fc(p, idx, c3) == 0) {\n if (func_ov006_020d25fc(p, idx, c4) == 0) {\n *statePtr = c1;\n }\n }\n break;\n case 7:\n if (*(s32 *)(p + idx * 8 + 0x4660) == 0x1f || *(s32 *)(p + idx * 8 + 0x4660) == 0x5f ||\n *(s32 *)(p + idx * 8 + 0x4660) == 0x9f || *(s32 *)(p + idx * 8 + 0x4660) == 0xdf) {\n {\n s32 *dirp = (s32 *)(((int)(p + idx * 8) + 0x4660) & 0xFFFFFFFFFFFFFFFFLL);\n *dirp += 1;\n *statePtr = c6;\n *flag2 = c1;\n func_020126ac(v24, c6, v5c, tmp, func_020126e8(*dirp << 0xc));\n }\n } else if (func_ov006_020d25fc(p, idx, v38) == 0 && func_ov006_020d25fc(p, idx, c6) == 0 &&\n func_ov006_020d25fc(p, idx, c4) == 0 && func_ov006_020d25fc(p, idx, v30) == 0 &&\n func_ov006_020d25fc(p, idx, v34) == 0) {\n *statePtr = v60;\n }\n break;\n }\n }\n }\n }\n }\n }\n}\n", "source": "lunavyqo-batch2-grind"} {"module": "arm9", "addr": "0x02009e70", "name": "func_02009e70", "size": 4252, "target_hex": "f04f2de967df4de20080a0e1100198e5000050e30500001a800088e28c1088e245c600eb011c88e2bc07c1e1f20300ea540198e5982088e2010c10e2dc0f9f153c0198051c008de5101198e534008de25c1081e20ccd00eb101198e534008de25c2081e2001092e5981088e5041092e59c1088e5081092e5a01088e521cc00eb0020a0e320208de524208de5181198e50070a0e1000051e30c00000a0100a0e324008de5142188e5181198e5700f9fe55c2081e2001092e5201188e5041092e5241188e5081092e5281188e52c0188e524108de200108de520208de21c308de20800a0e1981088e2c30900eb24109de50060a0e1000051e30040a0e30400000a120e88e20020a0e1981088e2014aa0e3322601eb1000a0e30410a0e100008de5130e88e2012ca0e38030a0e36ac400eb1c009de5b622d0e11c4090e5205090e5010012e21500001a540198e5020010e21200000a063ba0e300a0a0e3941380e095c38be0029ba0e3940a20e0091091e095ba2be0c44fa0e1940320e00000a0e209909ce02146a0e1004a84e1c50fa0e190b32be00000abe22956a0e1005a85e1800e9fe50000d0e5010050e30100a0030000a013000050e31800000a020012e21600000a0800a0e1cdfcffeb000050e31200000a501e9fe50030a0e394c18be095a189e0022ba0e394b32be0c40fa0e190b12be002409ce00000abe202a09ae02446a0e1959329e0c52fa0e1929129e00010a9e22a56a0e1004a84e1015a85e1540198e5800010e21200000a061ba0e30030a0e394c18be095a189e0022ba0e394b32be0c40fa0e190b12be002409ce00000abe202a09ae02446a0e1959329e0c52fa0e1929129e00010a9e22a56a0e1004a84e1015a85e12c1198e5300198e5041041e09130c2e0020ba0e3001093e00000a2e22116a0e1001a81e10800a0e1011084e0b6fcffeb24109de500b0a0e1000051e30ba0a0110500001a000055e3005065b20800a0e10510a0e1acfcffeb00a0a0e100708de51c309de50800a0e10620a0e1981088e2590700eb3c2d9fe51810a0e30040d2e5182198e5303d9fe5940101e0b11093e104008de5000052e3435c01e20500000a800088e28c1088e285c500eb011c88e2bc07c1e11c0300ea1c109de5fc0c9fe5000051e10400001a20109de50800a0e15a0600eb0050a0e3130300eae00c9fe5000051e10400001a20109de50800a0e10620a0e16d0500eb0b0300ea540198e5010b10e20803001ab80c9fe5000051e10400001a20109de50800a0e10620a0e1e00400eb000300ea9c0c9fe5000051e10400001a20109de50800a0e10620a0e1b30300ebf80200ea552f88e2001092e50800a0e1011a81e3001082e51c109de5001091e568fcffeb1c109de508008de5041091e50800a0e163fcffeb20109de50c008de5000051e31a00000a0000d1e5020050e31700001a0100d1e5000050e30900001af200d1e1f620d1e1f410d1e10006a0e10226a0e18c0088e50106a0e1900088e5942088e5110000eafa00d1e1011c88e2f628d1e1020980e20008a0e14008a0e1000052e1b608c1110100a013a601c815060000eaa601d8e5000050e3c80b9f0500108800f000d10102098002b000c10140008de28c1088e2802088e2fbcb00eb40008de2f32401eb28008de50201a0e39c1098e510008de5a02098e5980098e5fa1981e24c008de550108de554208de59c2098e5741b9fe5d0008de20241e0e3019082e016b500eb0800a0e1d0108de286f9ffebd0008de2981088e24c208de20030a0e3beb400ebd0008de2aeb800eb000050e30600000a94008de2d0108de28fb400eb98009de5024740e2090054e10940a0b1540198e5010c10e26100001a1c009de5b602d0e1080010e25d00000aa01098e5980098e5040059e158008de55c908de560108de5560000cad0008de258108de28c2088e20030a0e3a0b400ebd0008de290b800eb000050e34d00000ae4008de264108de270b600eba0008de2d0108de26eb400eba0009de5e00088e5a4009de5e40088e5a8009de5e80088e564009de5ec0088e568009de5f00088e56c009de5f40088e568009de5000050e3000060b2b50e50e3050000da552f88e2001092e5580a9fe5000081e1000082e5300000ea70008de2d0108de254b400eb64009de56c109de514c400eb020980e20008a0e14098a0e1010c88e2fc07d0e1a611d8e5000049e00008a0e14008b0e10109a0430109a05300006052000089e00008a0e1000051e34098a0e10600000a010c88e2f618d0e10900a0e102c300eb010950e3010c88a2f698d0a1010c88e2b698c0e10110a0e3a611c8e5fc27d0e1f618d0e1020c15e2010042e00008a0e14008a0e1000060120008a0114008a011000050e3551f88e2000091e50050a0c3010780e3000081e5000055e30600000a010915e20100000a1a00a0e3902000eb0000a0e3a601c8e5090000eaa601d8e5000050e30600001a34199fe51800a0e30020d1e54c199fe5920000e0b00091e1435c00e2540198e5010c10e20800000a00199fe50800a0e196fbffeb28109de5000051e1551f88c2000091c5010cc0c3000081c5000055e30f00001a010c88e2b00ad0e1000050e30b00001aa601d8e5000050e30800001a08009de5000057e1050000da28909de50b0059e1020000ba0c009de5000059e11c0100ca010c88e2fc97d0e1800088e28c1088e267c400eb011c88e2bc07c1e1000055e30200001ab00ad1e1000050e33400000a010915e20300001a010c88e2b00ad0e1000050e31900000a000055e310119815010c8812fe18d1110420a0e3023ba0e302198112be19c011010ba0e300008de5010c88e2fe19d0e15f0f88e263c200eb000050e30110a0130010a003010c88e2b01ac0e1b00ad0e1000050e3551f8812000091156000801300008115120000ea020c15e20800000a5f2f88e2f000d2e1551f88e2010b40e2b000c2e1000091e5200080e3000081e5070000ea5f2f88e2f000d2e1551f88e2010b80e2b000c2e1000091e5400080e3000081e50050a0e3450000eaa601d8e5000050e30a00000a010ca0e300008de5f618d1e15f0f88e21020a0e3023ca0e338c200eb000050e30000a003a601c805370000ea1c009de588179fe5010050e10200000a80179fe5010050e10400001a20109de50800a0e10720a0e18b0400eb2b0000ea24109de5000051e32800001a58179fe558279fe5010050e110119805f419d10110119815fe18d111020050e1010c8802021981e20118a0e1f428d0014118a0e102108100bc17c0011800000a28309de50c209de5020053e1060000ca2830a0e35f0f88e21420a0e300308de5063ca0e30bc200eb0d0000eab602d0e1010c10e2010c8812bc97c0110800001a08009de5000057e1050000ca2830a0e35f0f88e21420a0e300308de56430a0e3fcc100eb28009de514008de50a0050e1570000da000057e34700000a1c109de5a0069fe5000051e14300001a34008de2ccc900eb0010a0e138009de522c300ebfe1da0e30090a0e1000061e2000059e10090a0b1010000bafe0d59e30190a0c140008de2bfc900eb00b0a0e144009de50b10a0e1000060e213c300ebb801cde10000a0e300008de50910a0e118008de22020a0e3023ba0e3d6c100ebb801dde10b10a0e120369fe54002a0e18090a0e18900a0e1f02093e1010089e28000a0e128b09de5f00093e1002062e29b92c3e09b20c0e002bba0e30b9099e000c0a3e20b3092e02926a0e10c2a82e144208de50020a0e22306a0e1020a80e1512201eb40209de50b10a0e19290c3e0019099e00020a3e22936a0e1023a83e148209de540308de59230c0e0011093e00000a0e22116a0e1001a81e148108de5012ca0e300208de528008de20a10a0e1023887e2012ba0e3f8c100eb28009de514109de5382201eb0010a0e140008de228ca00eb2b0000ea0b0050e1290000aa012ca0e300208de528008de20b10a0e1023887e2012ba0e3e8c100eb28009de544209de59070c3e09202c1e0000057e00110c3e05fcb00eb0070a0e140008de269c900eb0010a0e10700a0e11e2201eb40209de5021ba0e39270c3e0017097e00020a3e22736a0e1023a83e140308de548309de5622f88e29370c0e0011097e00000a0e22116a0e1001a81e148108de5010c88e2fc07d0e1f010d2e1090040e0000041e0b000c2e140008de24ec900eb010a50e3010aa0b30010a0e348008de540108de5010c88e2fc27d0e140308de28c0088e2801088e20ec300eb180000ea0a0059e1160000da012ca0e300208de528008de20a10a0e1023887e2012ba0e3aec100eb28009de50910a0e1ee2101eb0010a0e140008de2dec900ebac008de2801088e240208de221ca00ebac009de58c0088e5b0009de5900088e5b4009de5940088e50800a0e176f8ffeb000050e30600000a540198e5600010e2551f8812000091150150a0136000c01300008115900098e594a098e58c7098e5019680e2d0008de24c208de28c1088e20030a0e34c708de550908de554a08de5d0b200ebd0008de2c0b600eb000050e30700000ab8008de2d0108de2a1b200ebbc109de5020741e2000054e150108de50040a0c17c008de28c1088e2802088e2f4c900eb7c008de20110a0e363c900eb7c109de580009de588108de584109de5010680e28c008de590108de5d0008de27c108de288208de20030a0e3b1b200ebd0008de2a1b600eb000050e30700000ac4008de2d0108de282b200ebc8009de5020740e2000054e18c008de50040a0c1520f8de29c9098e562b200ebf4229fe5521f8de20800a0e194218de560f7ffeb520f8de24c108de20020a0e320b200eb1c109de5c4029fe5000051e10100009a520f8de21eaa00eb520f8de2c6b800eb000050e31c109de5ac029fe58c919d15000051e10500001aa0029fe5000090e5000059e10090a0b1197989e24e0000ea540198e50970a0e1060059e10670a0b1020010e204009de57a29a013001046e04e29a0030800a0e1021081e0d2f9ffeb1c109de5007087e0b602d1e1800010e20200000a900098e5070050e10070a0c11c309de52c108de2080093e530208de22c008de50c3093e50800a0e130308de5440700eb842098e51c109de510029fe5022047e044208de5000051e10300001a38009de5000050e3f8019fb5000000ba2c009de528a09de530109de59a20c3e0020ba0e3006092e09a21c1e00030a3e2002092e02666a0e144009de5036a86e10010a1e2060050e1840098b52226a0e1012a82e1067080b0020000ba020050e1840098c5027080c09c019fe5d000d0e1260050e30400001a90019fe5901098e5000089e0000051e1900088b57c019fe5000089e0000054e170019fe550409db5000089e0020150e310008dc51c109de55c019fe5000051e10b00000a54019fe5000051e10800000a4c019fe5000051e10500000a10009de5000057e10070a0b1010000ba040057e10470a0c1014ca0e30710a0e1900088e2032ca0e30539a0e300408de5d6c000eb800088e28c1088e26bc200eb011c88e2bc07c1e1520f8de2c9b100ebd0008de253b200eb000055e30800000ae4009fe5000090e5000050e30100001a0e00a0e3561e00ebcc009fe5005080e50a0000eac0009fe50030a0e3003080e5540198e5600010e20400000a580198e50210a0e34320a0e3961d00eb580188e5800088e28c1088e23dc200eb011c88e2be07c1e10100a0e367df8de2f04fbde81eff2fe17c74080260fe0d00d8f20902cc140000400e0a029ef409023c730802dc730802047408022c7408028601000000250800000208009cf40902ac710802d47108024c720802cc740802cc6f08021422080200c05d00f46f08022cf309026c700802490a0000f8f20902c85b020094700802e47008020c71080200b00902", "lang": "c", "divergences": 1613, "c_source": "typedef unsigned char u8;\ntypedef unsigned short u16;\ntypedef unsigned short ushort;\ntypedef signed short s16;\ntypedef unsigned int u32;\ntypedef signed int s32;\ntypedef unsigned int uint;\ntypedef unsigned long long u64;\n\n/* Loose int-typed pointer params so Ghidra-shaped arithmetic compiles under mwccarm C. */\ns16 Vec3_HorzAngle(int a, int b);\ns16 Vec3_VertAngle(int a, int b);\nvoid Vec3_Sub(int out, int a, int b);\nvoid Vec3_Add(int out, int a, int b);\nint Vec3_HorzLen(int v);\nint LenVec3(int v);\nvoid SubVec3(int a, int b, int c);\nvoid Vec3_MulScalarInPlace(int v, int s);\nvoid Vec3_AsrInPlace(int v, int s);\nvoid Vec3_RotateYAndTranslate(int o, int a, int ang, int b);\nint func_0200c66c(int self, int a, int b, int c, int d);\nint func_0200bec4(int self, int v, int r2, int r3, int sp0);\nvoid func_0200bb28(int self, int a);\nvoid func_0200b798(int self, int a, int r2);\nvoid func_0200b590(int self, int a, int r2);\nvoid func_0200b0fc(int self, int a, int r2);\nvoid func_0200b990(int self, int a, int r2);\nint func_02009374(int self);\nunsigned int func_020093f4(int p, unsigned int x);\nunsigned int func_020093d4(int p, int a);\nvoid func_0200897c(int self, int arg);\nint func_02008cb4(int c);\nvoid func_0200c9e0(int c, int r1, int r2);\nvoid func_02012790(int a);\nint func_020124c4(int a, int b, int c);\nint Math_Function_0203b14c(int out, int a, int b, int c, int sp0);\nint ApproachAngle(int out, int cur, int r2, int r3, int sp0);\nint AngleDiff(int a, int b);\n\nvoid _ZN11RaycastLineC1Ev(int self);\nvoid _ZN11RaycastLineD1Ev(int self);\nvoid _ZN11RaycastLine13SetObjAndLineERK7Vector3S2_P5Actor(int self, int a, int b, int act);\nint _ZN11RaycastLine10DetectClsnEv(int self);\nvoid _ZN11RaycastLine10GetClsnPosEv(int out, int self);\nvoid _ZN13RaycastGroundC1Ev(int self);\nvoid _ZN13RaycastGroundD1Ev(int self);\nvoid _ZN13RaycastGround12SetObjAndPosERK7Vector3P5Actor(int self, int pos, int act);\nint _ZN13RaycastGround10DetectClsnEv(int self);\nvoid _ZN4BgCh19StartDetectingWaterEv(int self);\nvoid _ZNK11SurfaceInfo12CopyNormalToER7Vector3(int self, int out);\nint _ZN4cstd5atan2E5Fix12IiES1_(int a, int b);\nint _ZN4cstd4fdivEii(int a, int b);\nunsigned int _ZN4cstd4sqrtEy(unsigned int lo, int hi);\n\nextern u8 data_0208747c[];\nextern u8 data_0209f2d8;\nextern u8 data_020a0e40;\nextern s16 data_0209f49e[];\nextern s16 data_0209f49c[];\nextern u8 data_0208733c[];\nextern u8 data_020873dc[];\nextern u8 data_02087404[];\nextern u8 data_0208742c[];\nextern u8 data_020871ac[];\nextern u8 data_020871d4[];\nextern u8 data_0208724c[];\nextern u8 data_020874cc[];\nextern u8 data_02086fcc[];\nextern s16 data_02082214[];\nextern u8 data_02086ff4[];\nextern int data_0209f32c;\nextern u8 data_0208706c[];\nextern signed char data_0209f2f8;\nextern u8 data_02087094[];\nextern u8 data_020870e4[];\nextern u8 data_0208710c[];\nextern int data_0209b000;\n\nu32 func_02009e70(int param_1)\n{\n ushort uVar1;\n short sVar2;\n short sVar3;\n long long lVar4;\n long long lVar5;\n u16 uVar6;\n int iVar7;\n int iVar8;\n int iVar9;\n int iVar10;\n int iVar11;\n int iVar12;\n u32 *puVar13;\n u32 uVar14;\n int iVar15;\n int iVar16;\n uint uVar17;\n u32 *puVar18;\n u32 uVar19;\n uint uVar20;\n int iVar21;\n uint uVar22;\n int iVar23;\n uint uVar24;\n int bVar25;\n int local_1b0;\n ushort local_1a8 [2];\n int local_1a4;\n int local_1a0;\n uint local_19c;\n int local_198;\n int local_194;\n int local_190;\n u8 auStack_18c[4];\n int local_188;\n uint local_180;\n uint local_17c;\n uint local_178;\n u32 local_174;\n int local_170;\n u32 local_16c;\n u32 local_168;\n int local_164;\n u32 local_160;\n u32 local_15c;\n int local_158;\n u32 local_154;\n u8 auStack_150[12];\n u32 local_144;\n int local_140;\n u32 local_13c;\n u32 local_138;\n int local_134;\n u32 local_130;\n u8 auStack_12c[4];\n int local_128;\n u32 local_120;\n u32 local_11c;\n u32 local_118;\n u32 local_114;\n u32 local_110;\n u32 local_10c;\n u8 auStack_108[4];\n int local_104;\n u8 auStack_fc[4];\n int local_f8;\n u8 auStack_f0[20];\n u8 auStack_dc[100];\n u8 auStack_78[68];\n int local_34;\n u32 local_2c;\n \n if (*(int *)(param_1 + 0x110) == 0) {\n uVar6 = Vec3_HorzAngle(param_1 + 0x80,param_1 + 0x8c);\n *(u16 *)(param_1 + 0x17c) = uVar6;\n }\n else {\n local_1a4 = ((int)&data_0208747c);\n if ((*(uint *)(param_1 + 0x154) & 0x100) == 0) {\n local_1a4 = *(int *)(param_1 + 0x13c);\n }\n Vec3_Sub(((int)auStack_18c),*(int *)(param_1 + 0x110) + 0x5c,param_1 + 0x98);\n iVar15 = *(int *)(param_1 + 0x110);\n *(u32 *)(param_1 + 0x98) = *(u32 *)(iVar15 + 0x5c);\n *(u32 *)(param_1 + 0x9c) = *(u32 *)(iVar15 + 0x60);\n *(u32 *)(param_1 + 0xa0) = *(u32 *)(iVar15 + 100);\n iVar15 = Vec3_HorzLen(((int)auStack_18c));\n local_1a0 = 0;\n bVar25 = *(int *)(param_1 + 0x118) != 0;\n if (bVar25) {\n *(u32 *)(param_1 + 0x114) = 0;\n uVar19 = 0xdfe60;\n iVar16 = *(int *)(param_1 + 0x118);\n *(u32 *)(param_1 + 0x120) = *(u32 *)(iVar16 + 0x5c);\n *(u32 *)(param_1 + 0x124) = *(u32 *)(iVar16 + 0x60);\n *(u32 *)(param_1 + 0x128) = *(u32 *)(iVar16 + 100);\n *(u32 *)(param_1 + 300) = uVar19;\n }\n local_19c = (uint)bVar25;\n iVar16 = func_0200c66c(param_1,param_1 + 0x98,((int)&local_1a0),((int)&local_1a4),((int)&local_19c));\n uVar19 = 0;\n if (local_19c != 0) {\n uVar19 = 0x1000;\n SubVec3(param_1 + 0x120,param_1 + 0x98,param_1 + 0x120);\n }\n Math_Function_0203b14c(param_1 + 0x130,uVar19,0x100,0x80,0x10);\n uVar20 = ((u32 *)local_1a4)[7];\n uVar22 = ((u32 *)local_1a4)[8];\n if (((*(ushort *)(local_1a4 + 0x26) & 1) == 0) && ((*(uint *)(param_1 + 0x154) & 2) != 0))\n {\n uVar17 = (uint)((unsigned long long)uVar20 * 0x1800);\n uVar24 = (uint)((unsigned long long)uVar22 * 0x1800);\n uVar20 = uVar17 + 0x800 >> 0xc |\n (((int)uVar20 >> 0x1f) * 0x1800 + (int)((unsigned long long)uVar20 * 0x1800 >> 0x20) +\n (uint)(0xfffff7ff < uVar17)) * 0x100000;\n uVar22 = uVar24 + 0x800 >> 0xc |\n (((int)uVar22 >> 0x1f) * 0x1800 + (int)((unsigned long long)uVar22 * 0x1800 >> 0x20) +\n (uint)(0xfffff7ff < uVar24)) * 0x100000;\n }\n if (((data_0209f2d8 == '\\x01') && ((*(ushort *)(local_1a4 + 0x26) & 2) != 0)) &&\n (iVar7 = func_02009374(param_1), iVar7 != 0)) {\n uVar24 = (uint)((unsigned long long)0x14cc * (unsigned long long)uVar20);\n uVar17 = (uint)((unsigned long long)0x14cc * (unsigned long long)uVar22);\n uVar20 = uVar24 + 0x800 >> 0xc |\n (((int)uVar20 >> 0x1f) * 0x14cc +\n (int)((unsigned long long)0x14cc * (unsigned long long)uVar20 >> 0x20) +\n (uint)(0xfffff7ff < uVar24)) * 0x100000;\n uVar22 = uVar17 + 0x800 >> 0xc |\n (((int)uVar22 >> 0x1f) * 0x14cc +\n (int)((unsigned long long)0x14cc * (unsigned long long)uVar22 >> 0x20) +\n (uint)(0xfffff7ff < uVar17)) * 0x100000;\n }\n if ((*(uint *)(param_1 + 0x154) & 0x80) != 0) {\n uVar24 = (uint)((unsigned long long)uVar20 * 0x1800);\n uVar17 = (uint)((unsigned long long)uVar22 * 0x1800);\n uVar20 = uVar24 + 0x800 >> 0xc |\n (((int)uVar20 >> 0x1f) * 0x1800 + (int)((unsigned long long)uVar20 * 0x1800 >> 0x20) +\n (uint)(0xfffff7ff < uVar24)) * 0x100000;\n uVar22 = uVar17 + 0x800 >> 0xc |\n (((int)uVar22 >> 0x1f) * 0x1800 + (int)((unsigned long long)uVar22 * 0x1800 >> 0x20) +\n (uint)(0xfffff7ff < uVar17)) * 0x100000;\n }\n lVar4 = (long long)(int)(*(int *)(param_1 + 300) - uVar20) * (long long)*(int *)(param_1 + 0x130)\n + 0x800;\n iVar8 = func_020093f4(param_1,uVar20 + ((uint)lVar4 >> 0xc |\n (int)((unsigned long long)lVar4 >> 0x20) * 0x100000));\n iVar7 = iVar8;\n if (local_19c == 0) {\n if ((int)uVar22 < 0) {\n uVar22 = -uVar22;\n }\n iVar7 = func_020093f4(param_1,uVar22);\n }\n iVar9 = func_0200bec4(param_1,param_1 + 0x98,iVar16,local_1a4,iVar15);\n uVar1 = *(ushort *)(data_0209f49e + (uint)data_020a0e40 * 0x18);\n uVar22 = uVar1 & 0x4300;\n if (*(int *)(param_1 + 0x118) == 0) {\n if (local_1a4 == ((int)&data_0208733c)) {\n func_0200bb28(param_1,local_1a0);\n uVar22 = 0;\n }\n else if (local_1a4 == ((int)&data_020873dc)) {\n func_0200b798(param_1,local_1a0,iVar16);\n }\n else if ((*(uint *)(param_1 + 0x154) & 0x400) == 0) {\n if (local_1a4 == ((int)&data_02087404)) {\n func_0200b590(param_1,local_1a0,iVar16);\n }\n else if (local_1a4 == ((int)&data_0208742c)) {\n func_0200b0fc(param_1,local_1a0,iVar16);\n }\n else {\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x1000;\n iVar10 = func_020093f4(param_1,*(u32 *)local_1a4);\n iVar11 = func_020093f4(param_1,((u32 *)local_1a4)[1]);\n if ((local_1a0 == 0) || (*(char *)local_1a0 != '\\x02')) {\n if (*(char *)(param_1 + 0x1a6) == '\\0') {\n *(short *)(param_1 + 0x186) = *(short *)(param_1 + 0x186) + -0x8000;\n }\n }\n else if (((char *)local_1a0)[1] == '\\0') {\n sVar2 = *(short *)(local_1a0 + 6);\n sVar3 = *(short *)(local_1a0 + 4);\n *(int *)(param_1 + 0x8c) = (int)*(short *)(local_1a0 + 2) << 0xc;\n *(int *)(param_1 + 0x90) = (int)sVar3 << 0xc;\n *(int *)(param_1 + 0x94) = (int)sVar2 << 0xc;\n }\n else {\n iVar21 = (*(short *)(local_1a0 + 10) + 0x8000) * 0x10000;\n if ((int)*(short *)(param_1 + 0x186) != iVar21 >> 0x10) {\n *(short *)(param_1 + 0x186) = (short)((uint)iVar21 >> 0x10);\n *(u8 *)(param_1 + 0x1a6) = 1;\n }\n }\n Vec3_Sub(((int)&local_180),param_1 + 0x8c,param_1 + 0x80);\n local_198 = LenVec3(((int)&local_180));\n local_1b0 = -0x80000000;\n local_16c = *(u32 *)(param_1 + 0xa0);\n local_174 = *(u32 *)(param_1 + 0x98);\n local_170 = *(int *)(param_1 + 0x9c) + 0x3e8000;\n iVar23 = *(int *)(param_1 + 0x9c) + 0x82500;\n _ZN11RaycastLineC1Ev(((int)auStack_f0));\n func_0200897c(param_1,((int)auStack_f0));\n _ZN11RaycastLine13SetObjAndLineERK7Vector3S2_P5Actor\n (((int)auStack_f0),param_1 + 0x98,((int)&local_174),0);\n iVar12 = _ZN11RaycastLine10DetectClsnEv(((int)auStack_f0));\n iVar21 = 0x7fffffff;\n if (iVar12 != 0) {\n _ZN11RaycastLine10GetClsnPosEv(((int)auStack_12c),((int)auStack_f0));\n iVar21 = local_128 + -0x80000;\n if (local_128 + -0x80000 < iVar23) {\n iVar21 = iVar23;\n }\n }\n if (((*(uint *)(param_1 + 0x154) & 0x100) == 0) &&\n ((*(ushort *)(local_1a4 + 0x26) & 8) != 0)) {\n local_160 = *(u32 *)(param_1 + 0xa0);\n local_168 = *(u32 *)(param_1 + 0x98);\n local_164 = iVar23;\n if (iVar23 <= iVar21) {\n _ZN11RaycastLine13SetObjAndLineERK7Vector3S2_P5Actor\n (((int)auStack_f0),((int)&local_168),param_1 + 0x8c,0);\n iVar12 = _ZN11RaycastLine10DetectClsnEv(((int)auStack_f0));\n if (iVar12 != 0) {\n _ZNK11SurfaceInfo12CopyNormalToER7Vector3(((int)auStack_dc),((int)&local_15c));\n _ZN11RaycastLine10GetClsnPosEv(((int)&local_120),((int)auStack_f0));\n *(u32 *)(param_1 + 0xe0) = local_120;\n *(u32 *)(param_1 + 0xe4) = local_11c;\n *(u32 *)(param_1 + 0xe8) = local_118;\n *(u32 *)(param_1 + 0xec) = local_15c;\n *(int *)(param_1 + 0xf0) = local_158;\n *(u32 *)(param_1 + 0xf4) = local_154;\n if (local_158 < 0) {\n local_158 = -local_158;\n }\n if (local_158 < 0xb51) {\n _ZN11RaycastLine10GetClsnPosEv(((int)auStack_150),((int)auStack_f0));\n iVar12 = _ZN4cstd5atan2E5Fix12IiES1_(local_15c,local_154);\n iVar12 = (iVar12 + 0x8000) * 0x10000 >> 0x10;\n if ((iVar12 - *(short *)(param_1 + 0x17c)) * 0x10000 >> 0x10 < 0) {\n iVar23 = 0x4000;\n }\n else {\n iVar23 = -0x4000;\n }\n iVar12 = (iVar12 + iVar23) * 0x10000 >> 0x10;\n if ((*(char *)(param_1 + 0x1a6) != '\\0') &&\n (iVar23 = AngleDiff(iVar12,(int)*(short *)(param_1 + 0x186)), 0x3fff < iVar23))\n {\n iVar12 = (int)*(short *)(param_1 + 0x186);\n }\n *(short *)(param_1 + 0x186) = (short)iVar12;\n *(u8 *)(param_1 + 0x1a6) = 1;\n iVar12 = ((int)*(short *)(param_1 + 0x17c) - (int)*(short *)(param_1 + 0x186)) *\n 0x10000 >> 0x10;\n if ((uVar1 & 0x200) != 0) {\n iVar12 = iVar12 * -0x10000 >> 0x10;\n }\n if (0 < iVar12) {\n uVar22 = 0;\n }\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x40000;\n }\n else {\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x80200;\n }\n }\n }\n }\n if (uVar22 == 0) {\n if (*(char *)(param_1 + 0x1a6) == '\\0') {\n uVar22 = *(ushort *)(data_0209f49c + (uint)data_020a0e40 * 0x18) & 0x4300;\n }\n }\n else {\n if ((uVar22 & 0x4000) != 0) {\n func_02012790(0x1a);\n }\n *(u8 *)(param_1 + 0x1a6) = 0;\n }\n if (((*(uint *)(param_1 + 0x154) & 0x100) != 0) &&\n (iVar12 = func_020093f4(param_1,0xdfe60), iVar12 < local_198)) {\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) & 0xfffffeff;\n }\n iVar12 = local_198;\n if (((((uVar22 == 0) && (*(short *)(param_1 + 0x1a0) == 0)) &&\n (*(char *)(param_1 + 0x1a6) == '\\0')) && ((iVar10 < iVar15 && (iVar8 <= local_198))))\n && (iVar11 < local_198)) {\n if (iVar7 < local_198) {\n Math_Function_0203b14c(((int)&local_198),iVar7,0x400,iVar15 + 0x20000,0x100);\n uVar19 = _ZN4cstd4fdivEii(local_198,iVar12);\n Vec3_MulScalarInPlace(((int)&local_180),uVar19);\n Vec3_Add(((int)&local_114),param_1 + 0x80,((int)&local_180));\n *(u32 *)(param_1 + 0x8c) = local_114;\n *(u32 *)(param_1 + 0x90) = local_110;\n *(u32 *)(param_1 + 0x94) = local_10c;\n }\n }\n else {\n sVar2 = *(short *)(param_1 + 0x17c);\n uVar6 = Vec3_HorzAngle(param_1 + 0x80,param_1 + 0x8c);\n *(u16 *)(param_1 + 0x17c) = uVar6;\n if ((uVar22 == 0) && (*(short *)(param_1 + 0x1a0) == 0)) {\n if (*(char *)(param_1 + 0x1a6) == '\\0') {\n if ((local_1a4 == ((int)&data_020871ac)) || (local_1a4 == ((int)&data_020871d4))) {\n func_0200b990(param_1,local_1a0,iVar15);\n }\n else if (local_19c == 0) {\n if (local_1a4 == ((int)&data_0208724c)) {\n sVar3 = *(short *)(*(int *)(param_1 + 0x110) + 0x94);\n }\n else {\n sVar3 = *(short *)(*(int *)(param_1 + 0x110) + 0x8e);\n }\n bVar25 = local_1a4 == ((int)&data_020874cc);\n puVar13 = (u32 *)local_1a4;\n if (bVar25) {\n puVar13 = (u32 *)(param_1 + 0x100);\n }\n iVar12 = (sVar3 + 0x8000) * 0x10000;\n puVar18 = (u32 *)((int)&data_020874cc);\n if (bVar25) {\n puVar18 = (u32 *)(int)*(short *)(puVar13 + 0x21);\n }\n iVar23 = iVar12 >> 0x10;\n if (bVar25) {\n *(short *)(puVar13 + 0x1f) = (short)((uint)iVar12 >> 0x10) + (short)puVar18;\n }\n else if (iVar11 < local_198) {\n if ((*(ushort *)((int)puVar13 + 0x26) & 0x100) == 0) {\n if (iVar15 <= iVar10) {\n ApproachAngle(param_1 + 0x17c,iVar23,0x14,100,0x28);\n }\n }\n else {\n *(short *)(param_1 + 0x17c) = sVar2;\n }\n }\n else {\n ApproachAngle(param_1 + 0x17c,iVar23,0x14,0x600,0x28);\n }\n }\n }\n else {\n iVar10 = ApproachAngle(param_1 + 0x17c,(int)*(short *)(param_1 + 0x186),0x10,0x200,\n 0x100);\n if (iVar10 == 0) {\n *(u8 *)(param_1 + 0x1a6) = 0;\n }\n }\n }\n else {\n if (((uVar22 & 0x4000) == 0) && (*(short *)(param_1 + 0x1a0) == 0)) {\n if ((uVar22 & 0x200) == 0) {\n *(short *)(param_1 + 0x17c) = *(short *)(param_1 + 0x17c) + 0x400;\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x40;\n }\n else {\n *(short *)(param_1 + 0x17c) = *(short *)(param_1 + 0x17c) + -0x400;\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x20;\n }\n }\n else {\n if (uVar22 != 0) {\n *(short *)(param_1 + 0x19e) =\n *(short *)(*(int *)(param_1 + 0x110) + 0x8e) + -0x8000;\n }\n iVar10 = ApproachAngle(param_1 + 0x17c,(int)*(short *)(param_1 + 0x19e),4,0x800,\n 0x400);\n *(ushort *)(param_1 + 0x1a0) = (ushort)(iVar10 != 0);\n if (*(short *)(param_1 + 0x1a0) != 0) {\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) | 0x60;\n }\n }\n uVar22 = 0;\n }\n iVar10 = local_198;\n if (iVar7 < local_198) {\n if ((iVar15 != 0) && (local_1a4 == ((int)&data_02086fcc))) {\n uVar19 = Vec3_HorzLen(((int)auStack_18c));\n iVar8 = _ZN4cstd5atan2E5Fix12IiES1_(local_188,uVar19);\n if (iVar8 < -0x3f80) {\n iVar8 = -0x3f80;\n }\n else if (0x3f80 < iVar8) {\n iVar8 = 0x3f80;\n }\n uVar19 = Vec3_HorzLen(((int)&local_180));\n local_1a8[0] = _ZN4cstd5atan2E5Fix12IiES1_(-local_17c,uVar19);\n ApproachAngle((int)local_1a8,iVar8,0x20,0x800,0);\n lVar4 = (long long)local_198 *\n (long long)\n -(int)*(short *)(data_02082214 + ((int)(uint)local_1a8[0] >> 4) * 4) + 0x800;\n lVar5 = (long long)local_198 *\n (long long)\n (int)*(short *)(data_02082214 + (((int)(uint)local_1a8[0] >> 4) * 2 + 1) * 2)\n + 0x800;\n local_17c = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n iVar8 = _ZN4cstd4fdivEii((uint)lVar5 >> 0xc |\n (int)((unsigned long long)lVar5 >> 0x20) * 0x100000,uVar19);\n lVar4 = (long long)(int)local_180 * (long long)iVar8 + 0x800;\n local_180 = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n lVar4 = (long long)(int)local_178 * (long long)iVar8 + 0x800;\n local_178 = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n }\n Math_Function_0203b14c(((int)&local_198),iVar7,0x400,iVar15 + 0x20000,0x100);\n uVar19 = _ZN4cstd4fdivEii(local_198,iVar10);\n Vec3_MulScalarInPlace(((int)&local_180),uVar19);\n }\n else if (local_198 < iVar8) {\n Math_Function_0203b14c(((int)&local_198),iVar8,0x400,iVar15 + 0x20000,0x100);\n uVar17 = (uint)((long long)local_198 * (long long)local_198);\n uVar20 = (uint)((long long)(int)local_17c * (long long)(int)local_17c);\n uVar19 = _ZN4cstd4sqrtEy(uVar17 - uVar20,\n (int)((unsigned long long)((long long)local_198 * (long long)local_198)\n >> 0x20) -\n ((int)((unsigned long long)\n ((long long)(int)local_17c * (long long)(int)local_17c)\n >> 0x20) + (uint)(uVar17 < uVar20)));\n uVar14 = Vec3_HorzLen(((int)&local_180));\n iVar15 = _ZN4cstd4fdivEii(uVar19,uVar14);\n lVar4 = (long long)(int)local_180 * (long long)iVar15 + 0x800;\n local_180 = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n lVar4 = (long long)(int)local_178 * (long long)iVar15 + 0x800;\n local_178 = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n *(short *)(param_1 + 0x188) =\n *(short *)(param_1 + 0x188) - (*(short *)(param_1 + 0x17c) - sVar2);\n }\n local_178 = Vec3_HorzLen(((int)&local_180));\n if ((int)local_178 < 0x1000) {\n local_178 = 0x1000;\n }\n local_180 = 0;\n Vec3_RotateYAndTranslate\n (param_1 + 0x8c,param_1 + 0x80,(int)*(short *)(param_1 + 0x17c),((int)&local_180));\n }\n iVar15 = func_02008cb4(param_1);\n if ((iVar15 != 0) && ((*(uint *)(param_1 + 0x154) & 0x60) != 0)) {\n uVar22 = 1;\n *(uint *)(param_1 + 0x154) = *(uint *)(param_1 + 0x154) & 0xffffff9f;\n }\n local_16c = *(u32 *)(param_1 + 0x94);\n local_174 = *(u32 *)(param_1 + 0x8c);\n local_170 = *(int *)(param_1 + 0x90) + 0x100000;\n _ZN11RaycastLine13SetObjAndLineERK7Vector3S2_P5Actor\n (((int)auStack_f0),param_1 + 0x8c,((int)&local_174),0);\n iVar15 = _ZN11RaycastLine10DetectClsnEv(((int)auStack_f0));\n if (iVar15 != 0) {\n _ZN11RaycastLine10GetClsnPosEv(((int)auStack_108),((int)auStack_f0));\n local_170 = local_104;\n if (local_104 + -0x80000 < iVar21) {\n iVar21 = local_104 + -0x80000;\n }\n }\n Vec3_Add(((int)&local_144),param_1 + 0x8c,param_1 + 0x80);\n Vec3_AsrInPlace(((int)&local_144),1);\n local_138 = local_144;\n local_134 = local_140 + 0x100000;\n local_130 = local_13c;\n _ZN11RaycastLine13SetObjAndLineERK7Vector3S2_P5Actor(((int)auStack_f0),((int)&local_144),((int)&local_138),0);\n iVar15 = _ZN11RaycastLine10DetectClsnEv(((int)auStack_f0));\n if (iVar15 != 0) {\n _ZN11RaycastLine10GetClsnPosEv(((int)auStack_fc),((int)auStack_f0));\n local_134 = local_f8 + -0x80000;\n if (local_134 < iVar21) {\n iVar21 = local_134;\n }\n }\n iVar15 = *(int *)(param_1 + 0x9c);\n _ZN13RaycastGroundC1Ev(((int)auStack_78));\n local_2c = 0x5dc000;\n func_0200897c(param_1,((int)auStack_78));\n iVar7 = 0;\n _ZN13RaycastGround12SetObjAndPosERK7Vector3P5Actor(((int)auStack_78),((int)&local_174),0);\n if (((int)&data_02086fcc) < local_1a4) {\n _ZN4BgCh19StartDetectingWaterEv(((int)auStack_78));\n }\n iVar8 = _ZN13RaycastGround10DetectClsnEv(((int)auStack_78));\n if (iVar8 != 0) {\n iVar15 = local_34;\n }\n if (local_1a4 == ((int)&data_02086ff4)) {\n if (iVar15 < data_0209f32c) {\n iVar15 = data_0209f32c;\n }\n iVar8 = iVar15 + 0x64000;\n }\n else {\n iVar8 = iVar15;\n if (iVar15 < iVar16) {\n iVar8 = iVar16;\n }\n bVar25 = (*(uint *)(param_1 + 0x154) & 2) != 0;\n if (bVar25) {\n iVar7 = 0x1e8000;\n }\n if (!bVar25) {\n iVar7 = 0x138000;\n }\n iVar16 = func_020093d4(param_1,(iVar16 - iVar9) + iVar7);\n iVar8 = iVar8 + iVar16;\n if (((*(ushort *)(local_1a4 + 0x26) & 0x80) != 0) &&\n (iVar8 < *(int *)(param_1 + 0x90))) {\n iVar8 = *(int *)(param_1 + 0x90);\n }\n local_194 = ((u32 *)local_1a4)[2];\n local_190 = ((u32 *)local_1a4)[3];\n func_0200c9e0(param_1,((int)&local_194),((int)&local_190));\n local_17c = iVar8 - *(int *)(param_1 + 0x84);\n iVar16 = local_194;\n if ((local_1a4 == ((int)&data_0208706c)) && (local_188 < 0)) {\n iVar16 = 0xa49;\n }\n lVar4 = (long long)local_198 * (long long)iVar16 + 0x800;\n lVar5 = (long long)local_198 * (long long)local_190 + 0x800;\n uVar17 = (uint)lVar4 >> 0xc | (int)((unsigned long long)lVar4 >> 0x20) * 0x100000;\n uVar20 = local_17c;\n if ((int)local_17c < (int)uVar17) {\n uVar20 = *(uint *)(param_1 + 0x84);\n }\n uVar24 = (uint)lVar5 >> 0xc | (int)((unsigned long long)lVar5 >> 0x20) * 0x100000;\n if ((int)local_17c < (int)uVar17) {\n iVar8 = uVar20 + uVar17;\n }\n else if ((int)uVar24 < (int)uVar20) {\n iVar8 = *(int *)(param_1 + 0x84) + uVar24;\n }\n if ((data_0209f2f8 == '&') && (*(int *)(param_1 + 0x90) < iVar15 + 0x25bc8)) {\n *(int *)(param_1 + 0x90) = iVar15 + 0x25bc8;\n }\n if (iVar21 < iVar15 + 0x25bc8) {\n iVar21 = local_170;\n }\n if (iVar15 + 0x25bc8 != -0x80000000) {\n local_1b0 = iVar15 + 0x25bc8;\n }\n }\n iVar15 = iVar8;\n if ((((local_1a4 != ((int)&data_02087094)) && (local_1a4 != ((int)&data_020870e4))) &&\n (local_1a4 != ((int)&data_0208710c))) &&\n ((iVar15 = local_1b0, local_1b0 <= iVar8 && (iVar15 = iVar8, iVar21 < iVar8)))) {\n iVar15 = iVar21;\n }\n Math_Function_0203b14c(param_1 + 0x90,iVar15,0x300,0x14000,0x100);\n uVar6 = Vec3_HorzAngle(param_1 + 0x80,param_1 + 0x8c);\n *(u16 *)(param_1 + 0x17c) = uVar6;\n _ZN13RaycastGroundD1Ev(((int)auStack_78));\n _ZN11RaycastLineD1Ev(((int)auStack_f0));\n }\n }\n }\n else {\n uVar6 = Vec3_HorzAngle(param_1 + 0x80,param_1 + 0x8c);\n *(u16 *)(param_1 + 0x17c) = uVar6;\n }\n if (uVar22 == 0) {\n data_0209b000 = 0;\n if ((*(uint *)(param_1 + 0x154) & 0x60) != 0) {\n uVar19 = func_020124c4(*(u32 *)(param_1 + 0x158),2,0x43);\n *(u32 *)(param_1 + 0x158) = uVar19;\n }\n }\n else {\n if (data_0209b000 == 0) {\n func_02012790(0xe);\n }\n data_0209b000 = uVar22;\n }\n }\n uVar6 = Vec3_VertAngle(param_1 + 0x80,param_1 + 0x8c);\n *(u16 *)(param_1 + 0x17e) = uVar6;\n return 1;\n}\n", "source": "ghidra-full-20260723"} -{"module": "ov007", "addr": "0x020c6550", "name": "func_ov007_020c6550", "size": 108, "target_hex": "70402de90060a0e1204096e50150a0e3b810d4e1000051e30300000a081096e50c2096e5020051e1010000ba0050a0e30a0000eae50100eb081086e2000091e5010080e2000081e5081096e50c0096e5000051e10400a0e10250a0a3bef0ffeb0500a0e17040bde81eff2fe1", "lang": "c", "divergences": 2, "c_source": "extern void func_ov007_020c6d20(void *c);\nextern void func_ov007_020c28ac(void *p);\n\n/* BEST_DIV=2 (regperm load-order floor)\n * All of function matches except the two ldrs for the first (c+8)/(c+0xc) compare:\n * ROM: ldr r1,[c+#8]; ldr r2,[c+#0xc]; cmp r1,r2; blt\n * this: ldr r2,[c+#0xc]; ldr r1,[c+#8]; cmp r1,r2; blt\n * Volatile on the right-hand load selects r1/r2 correctly (statement-level pair\n * selector) but schedules that load ASAP, swapping order. Non-vol restores order\n * but flips the pair back (div=3). ~80 pure-C variants; documented wall in\n * notes/mwccarm-codegen.md \u00a76v for this symbol.\n */\nint func_ov007_020c6550(char *c)\n{\n int status = 1;\n void *obj = *(void **)(c + 0x20);\n int right;\n if (*(unsigned short *)((char *)obj + 8) == 0 ||\n *(int *)(c + 8) >= (right = *(volatile int *)(c + 0xc))) {\n status = 0;\n } else {\n func_ov007_020c6d20(c);\n {\n int *p = (int *)(((unsigned int)c + 8) & 0xFFFFFFFFFFFFFFFFULL);\n *p = *p + 1;\n }\n if (*(int *)(c + 8) >= *(int *)(c + 0xc))\n status = 2;\n func_ov007_020c28ac(obj);\n }\n return status;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "floor": {"class": "regperm", "evidence": "6v: vol-right pair selector vs load-order weld; div=2; 200+ pure-C variants; colors correct when order wrong", "date": "2026-07-23"}, "floor_note": "6v vol-pair selector vs load order weld; div=2"} -{"module": "ov009", "addr": "0x0211145c", "name": "func_ov009_0211145c", "size": 380, "target_hex": "f04f2de924d04de200a0a0e18011dae5000051e33800000a97fdfbeb0020b0e124d08d02f04fbd081eff2f0114008de25c108ae25c2082e298affceb14309de518209de51c109de508008de208308de50c208de510108de5afaefceb7d0850e324d08dc2f04fbdc81eff2fc108009ae50f0000e2010050e3170000da018040e2000058e30090a0e3130000dad0b09fe50940a0e15c508ae20070e0e31060a0e3dc2cdae10b00a0e10610a0e100208de50520a0e10430a0e104708de543fefbeb000050e30100000a04109ae53dffffeb019089e2080059e1f0ffffba0509a0e3001060e260118ae578009fe574108ae268018ae56a00a0e34804fceb68009fe50ba9fceb64109fe564309fe5901182e02224a0e1931282e0012040e054109fe544009fe5021041e0b219cae100a9fceb2008a0e1b409cae10a09a0e374018ae50300a0e37c018ae5b0108ae2000091e50108c0e3000081e524d08de2f04fbde81eff2fe15701000000a006ff50e60902d34d6210a00f000088130000", "lang": "c", "divergences": 3, "c_source": "/* BEST_DIV=3 (pure-C floor; historical HAND-ASM was this exact residual)\n * Progress: u64-mask launder on the two store addresses forces ROM's\n * mov r0,#0x14000; rsb r1,r0,#0; str r1,[sl,#0x160]\n * (plain -0x14000 / named temps coalesce to rsb r0,r0,#0 when the sound call\n * is present; sibling func_ov009_021116ec matches the same stores without the\n * call using plain C \u2014 and colors s into r0 because nothing else wants r0).\n *\n * Residual (3 words, size-exact 0x17c): pool const 0xff06a000 is colored r3\n * instead of r0, so mwccarm schedules\n * ldr r3,s; add r1,sl,#0x74; mov r0,#0x6a; str r3,[sl,#0x168]; bl\n * vs ROM\n * ldr r0,s; add r1,sl,#0x74; str r0,[sl,#0x168]; mov r0,#0x6a; bl\n * Call arg 0x6a reserves r0 early; s is rematerializable leftover. Once s is\n * not in r0, mov/str freely reorder (no anti-dep). Coupled reg+schedule.\n *\n * Exhausted (still div=3, often byte-identical residual): nested scopes kill t,\n * s->0x6a reuse, t becomes s, equal-arm delay of 0x6a, comma store-in-arg0/1,\n * both-live fake deps, value launders (+0/|0/^0/u64), half-launder, ptr-first,\n * //cpp refs, goto/do-once/for-once EBB splits, vol stores, pressure dummies,\n * inline store-then-return-0x6a, all pragmas, all mwccarm versions, permuter\n * (score 205 floor, 650+ iters, never improved). Do not promote to src/.\n */\nstruct V3 { int x, y, z; };\nextern char *_ZN5Actor13ClosestPlayerEv(void *self);\nextern int Vec3_Sub(struct V3 *dst, void *a, void *b);\nextern int Vec3_HorzLen(struct V3 *v);\nextern char *_ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(unsigned int id, unsigned int p1, void *pos, void *rot, int a, int b);\nextern void func_ov009_02111224(char *c, int r1);\nextern int func_0201267c(unsigned int a, void *b);\nextern int RandomIntInternal(void *rng);\nextern int data_0209e650;\n\nvoid func_ov009_0211145c(char *c)\n{\n if (*(unsigned char *)(c + 0x180) != 0) {\n char *p;\n struct V3 copy;\n struct V3 diff;\n int n;\n p = _ZN5Actor13ClosestPlayerEv(c);\n if (p == 0)\n return;\n Vec3_Sub(&diff, c + 0x5c, p + 0x5c);\n copy.x = diff.x;\n copy.y = diff.y;\n copy.z = diff.z;\n if (Vec3_HorzLen(©) > 0x7d0000)\n return;\n n = *(int *)(c + 8) & 0xf;\n if (n > 1) {\n int i = 0;\n int lim = n - 1;\n if (lim > 0) {\n do {\n char *a = _ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(0x157, 0x10, c + 0x5c, 0, *(signed char *)(c + 0xcc), -1);\n if (a != 0)\n func_ov009_02111224(a, *(int *)(c + 4));\n i++;\n } while (i < lim);\n }\n }\n {\n int t = 0x14000;\n int nvel = 0 - t;\n int s = (int)0xff06a000;\n *(int *)(((long long)(int)(c + 0x160)) & 0xFFFFFFFFFFFFFFFFLL) = nvel;\n *(int *)(((long long)(int)(c + 0x168)) & 0xFFFFFFFFFFFFFFFFLL) = s;\n func_0201267c(0x6a, c + 0x74);\n }\n }\n *(short *)(c + 0x92) = 5000 - (unsigned int)RandomIntInternal(&data_0209e650) % 4000;\n *(unsigned short *)(c + 0x94) = (unsigned int)RandomIntInternal(&data_0209e650) >> 16;\n *(int *)(c + 0x174) = 0x28000;\n *(int *)(c + 0x17c) = 3;\n *(int *)(((int)c + 0xb0) & 0xFFFFFFFFFFFFFFFF) &= ~0x10000;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "floor": {"class": "ordering", "evidence": "call-after-stores: rsb r1 via u64 launder OK; pool s rematerializes to r3 and mov#0x6a before str; sibling without call matches; 100+ pure-C variants", "date": "2026-07-23"}, "floor_note": "call-after-stores s in r3 vs r0; div=3"} -{"module": "arm9", "addr": "0x0204322c", "name": "func_0204322c", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e8850200eb0cd08de20040bde81eff2fe19c9e0902749e0902cc9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3: mwccarm always emits push{fp,lr}+mov sp,ip dynamic frame\n * (cand size 0x68 vs ROM 0x5c). Documented wall: notes/mwccarm-codegen.md PTMF wrappers.\n * 2.0/sp2p3 -proc arm7tdmi: 1-word near-miss (ldr r3,[ip] vs ROM ldm ip,{r3}).\n * Tried: C struct-by-value, six-int, local copies, stack arrays, u64, union, nested,\n * //cpp real PTMF, pragma size \u2014 all fp-frame under pin 1.2/sp2p3.\n */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e9c;\nextern PMF data_02099e74;\nextern PMF data_02099ecc;\n\nint func_0204322c(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ecc, data_02099e74, data_02099e9c);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} -{"module": "arm9", "addr": "0x02043288", "name": "func_02043288", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e86e0200eb0cd08de20040bde81eff2fe1b49e0902ac9e0902a49e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 \u2014 same PTMF below-sp staging wall as func_0204322c (size 0x68 vs 0x5c). */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099eb4;\nextern PMF data_02099eac;\nextern PMF data_02099ea4;\n\nint func_02043288(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ea4, data_02099eac, data_02099eb4);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} -{"module": "arm9", "addr": "0x0204335c", "name": "func_0204335c", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e8390200eb0cd08de20040bde81eff2fe1949e0902c49e0902bc9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 \u2014 same PTMF below-sp staging wall as func_0204322c (size 0x68 vs 0x5c). */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e94;\nextern PMF data_02099ec4;\nextern PMF data_02099ebc;\n\nint func_0204335c(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ebc, data_02099ec4, data_02099e94);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} -{"module": "arm9", "addr": "0x020432e4", "name": "func_020432e4", "size": 120, "target_hex": "30402de90cd04de25c109fe5bc40d0e1003091e5042091e550109fe504308de508208de5002091e5041091e504304de2002083e5041083e534109fe5080093e8060091e8560200eb0050a0e1010055e30100001a0400a0e13affffeb0500a0e10cd08de23040bde81eff2fe1849e09027c9e09028c9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 \u2014 PTMF staging wall + conditional func_0204302c (size 0x84 vs 0x78).\n * ROM: push {r4,r5,lr}; sub sp,#0xc; ldrh r4,[r0,#0xc]; stage PMFs; bl Process;\n * if (r==1) func_0204302c(r4); return r;\n */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e84;\nextern PMF data_02099e7c;\nextern PMF data_02099e8c;\nextern void func_0204302c(int id);\n\nint func_020432e4(void *self)\n{\n unsigned short id = *(unsigned short *)((char *)self + 0xc);\n int r = _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099e8c, data_02099e7c, data_02099e84);\n if (r == 1)\n func_0204302c(id);\n return r;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x78 vs 0x6c"} +{"module": "ov007", "addr": "0x020c6550", "name": "func_ov007_020c6550", "size": 108, "target_hex": "70402de90060a0e1204096e50150a0e3b810d4e1000051e30300000a081096e50c2096e5020051e1010000ba0050a0e30a0000eae50100eb081086e2000091e5010080e2000081e5081096e50c0096e5000051e10400a0e10250a0a3bef0ffeb0500a0e17040bde81eff2fe1", "lang": "c", "divergences": 2, "c_source": "extern void func_ov007_020c6d20(void *c);\nextern void func_ov007_020c28ac(void *p);\n\n/* BEST_DIV=2 (regperm load-order floor)\n * All of function matches except the two ldrs for the first (c+8)/(c+0xc) compare:\n * ROM: ldr r1,[c+#8]; ldr r2,[c+#0xc]; cmp r1,r2; blt\n * this: ldr r2,[c+#0xc]; ldr r1,[c+#8]; cmp r1,r2; blt\n * Volatile on the right-hand load selects r1/r2 correctly (statement-level pair\n * selector) but schedules that load ASAP, swapping order. Non-vol restores order\n * but flips the pair back (div=3). ~80 pure-C variants; documented wall in\n * notes/mwccarm-codegen.md §6v for this symbol.\n */\nint func_ov007_020c6550(char *c)\n{\n int status = 1;\n void *obj = *(void **)(c + 0x20);\n int right;\n if (*(unsigned short *)((char *)obj + 8) == 0 ||\n *(int *)(c + 8) >= (right = *(volatile int *)(c + 0xc))) {\n status = 0;\n } else {\n func_ov007_020c6d20(c);\n {\n int *p = (int *)(((unsigned int)c + 8) & 0xFFFFFFFFFFFFFFFFULL);\n *p = *p + 1;\n }\n if (*(int *)(c + 8) >= *(int *)(c + 0xc))\n status = 2;\n func_ov007_020c28ac(obj);\n }\n return status;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "floor": {"class": "regperm", "evidence": "6v: vol-right pair selector vs load-order weld; div=2; 200+ pure-C variants; colors correct when order wrong", "date": "2026-07-23"}, "floor_note": "6v vol-pair selector vs load order weld; div=2"} +{"module": "ov009", "addr": "0x0211145c", "name": "func_ov009_0211145c", "size": 380, "target_hex": "f04f2de924d04de200a0a0e18011dae5000051e33800000a97fdfbeb0020b0e124d08d02f04fbd081eff2f0114008de25c108ae25c2082e298affceb14309de518209de51c109de508008de208308de50c208de510108de5afaefceb7d0850e324d08dc2f04fbdc81eff2fc108009ae50f0000e2010050e3170000da018040e2000058e30090a0e3130000dad0b09fe50940a0e15c508ae20070e0e31060a0e3dc2cdae10b00a0e10610a0e100208de50520a0e10430a0e104708de543fefbeb000050e30100000a04109ae53dffffeb019089e2080059e1f0ffffba0509a0e3001060e260118ae578009fe574108ae268018ae56a00a0e34804fceb68009fe50ba9fceb64109fe564309fe5901182e02224a0e1931282e0012040e054109fe544009fe5021041e0b219cae100a9fceb2008a0e1b409cae10a09a0e374018ae50300a0e37c018ae5b0108ae2000091e50108c0e3000081e524d08de2f04fbde81eff2fe15701000000a006ff50e60902d34d6210a00f000088130000", "lang": "c", "divergences": 3, "c_source": "/* BEST_DIV=3 (pure-C floor; historical HAND-ASM was this exact residual)\n * Progress: u64-mask launder on the two store addresses forces ROM's\n * mov r0,#0x14000; rsb r1,r0,#0; str r1,[sl,#0x160]\n * (plain -0x14000 / named temps coalesce to rsb r0,r0,#0 when the sound call\n * is present; sibling func_ov009_021116ec matches the same stores without the\n * call using plain C — and colors s into r0 because nothing else wants r0).\n *\n * Residual (3 words, size-exact 0x17c): pool const 0xff06a000 is colored r3\n * instead of r0, so mwccarm schedules\n * ldr r3,s; add r1,sl,#0x74; mov r0,#0x6a; str r3,[sl,#0x168]; bl\n * vs ROM\n * ldr r0,s; add r1,sl,#0x74; str r0,[sl,#0x168]; mov r0,#0x6a; bl\n * Call arg 0x6a reserves r0 early; s is rematerializable leftover. Once s is\n * not in r0, mov/str freely reorder (no anti-dep). Coupled reg+schedule.\n *\n * Exhausted (still div=3, often byte-identical residual): nested scopes kill t,\n * s->0x6a reuse, t becomes s, equal-arm delay of 0x6a, comma store-in-arg0/1,\n * both-live fake deps, value launders (+0/|0/^0/u64), half-launder, ptr-first,\n * //cpp refs, goto/do-once/for-once EBB splits, vol stores, pressure dummies,\n * inline store-then-return-0x6a, all pragmas, all mwccarm versions, permuter\n * (score 205 floor, 650+ iters, never improved). Do not promote to src/.\n */\nstruct V3 { int x, y, z; };\nextern char *_ZN5Actor13ClosestPlayerEv(void *self);\nextern int Vec3_Sub(struct V3 *dst, void *a, void *b);\nextern int Vec3_HorzLen(struct V3 *v);\nextern char *_ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(unsigned int id, unsigned int p1, void *pos, void *rot, int a, int b);\nextern void func_ov009_02111224(char *c, int r1);\nextern int func_0201267c(unsigned int a, void *b);\nextern int RandomIntInternal(void *rng);\nextern int data_0209e650;\n\nvoid func_ov009_0211145c(char *c)\n{\n if (*(unsigned char *)(c + 0x180) != 0) {\n char *p;\n struct V3 copy;\n struct V3 diff;\n int n;\n p = _ZN5Actor13ClosestPlayerEv(c);\n if (p == 0)\n return;\n Vec3_Sub(&diff, c + 0x5c, p + 0x5c);\n copy.x = diff.x;\n copy.y = diff.y;\n copy.z = diff.z;\n if (Vec3_HorzLen(©) > 0x7d0000)\n return;\n n = *(int *)(c + 8) & 0xf;\n if (n > 1) {\n int i = 0;\n int lim = n - 1;\n if (lim > 0) {\n do {\n char *a = _ZN5Actor5SpawnEjjRK7Vector3PK10Vector3_16ii(0x157, 0x10, c + 0x5c, 0, *(signed char *)(c + 0xcc), -1);\n if (a != 0)\n func_ov009_02111224(a, *(int *)(c + 4));\n i++;\n } while (i < lim);\n }\n }\n {\n int t = 0x14000;\n int nvel = 0 - t;\n int s = (int)0xff06a000;\n *(int *)(((long long)(int)(c + 0x160)) & 0xFFFFFFFFFFFFFFFFLL) = nvel;\n *(int *)(((long long)(int)(c + 0x168)) & 0xFFFFFFFFFFFFFFFFLL) = s;\n func_0201267c(0x6a, c + 0x74);\n }\n }\n *(short *)(c + 0x92) = 5000 - (unsigned int)RandomIntInternal(&data_0209e650) % 4000;\n *(unsigned short *)(c + 0x94) = (unsigned int)RandomIntInternal(&data_0209e650) >> 16;\n *(int *)(c + 0x174) = 0x28000;\n *(int *)(c + 0x17c) = 3;\n *(int *)(((int)c + 0xb0) & 0xFFFFFFFFFFFFFFFF) &= ~0x10000;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "floor": {"class": "ordering", "evidence": "call-after-stores: rsb r1 via u64 launder OK; pool s rematerializes to r3 and mov#0x6a before str; sibling without call matches; 100+ pure-C variants", "date": "2026-07-23"}, "floor_note": "call-after-stores s in r3 vs r0; div=3"} +{"module": "arm9", "addr": "0x0204322c", "name": "func_0204322c", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e8850200eb0cd08de20040bde81eff2fe19c9e0902749e0902cc9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3: mwccarm always emits push{fp,lr}+mov sp,ip dynamic frame\n * (cand size 0x68 vs ROM 0x5c). Documented wall: notes/mwccarm-codegen.md PTMF wrappers.\n * 2.0/sp2p3 -proc arm7tdmi: 1-word near-miss (ldr r3,[ip] vs ROM ldm ip,{r3}).\n * Tried: C struct-by-value, six-int, local copies, stack arrays, u64, union, nested,\n * //cpp real PTMF, pragma size — all fp-frame under pin 1.2/sp2p3.\n */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e9c;\nextern PMF data_02099e74;\nextern PMF data_02099ecc;\n\nint func_0204322c(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ecc, data_02099e74, data_02099e9c);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} +{"module": "arm9", "addr": "0x02043288", "name": "func_02043288", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e86e0200eb0cd08de20040bde81eff2fe1b49e0902ac9e0902a49e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 — same PTMF below-sp staging wall as func_0204322c (size 0x68 vs 0x5c). */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099eb4;\nextern PMF data_02099eac;\nextern PMF data_02099ea4;\n\nint func_02043288(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ea4, data_02099eac, data_02099eb4);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} +{"module": "arm9", "addr": "0x0204335c", "name": "func_0204335c", "size": 92, "target_hex": "00402de90cd04de240209fe540109fe5003092e5042092e504c04de204308de508208de5003091e5042091e524109fe500308ce504208ce508009ce8060091e8390200eb0cd08de20040bde81eff2fe1949e0902c49e0902bc9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 — same PTMF below-sp staging wall as func_0204322c (size 0x68 vs 0x5c). */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e94;\nextern PMF data_02099ec4;\nextern PMF data_02099ebc;\n\nint func_0204335c(void *self)\n{\n return _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099ebc, data_02099ec4, data_02099e94);\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x5c vs 0x54"} +{"module": "arm9", "addr": "0x020432e4", "name": "func_020432e4", "size": 120, "target_hex": "30402de90cd04de25c109fe5bc40d0e1003091e5042091e550109fe504308de508208de5002091e5041091e504304de2002083e5041083e534109fe5080093e8060091e8560200eb0050a0e1010055e30100001a0400a0e13affffeb0500a0e10cd08de23040bde81eff2fe1849e09027c9e09028c9e0902", "lang": "c", "divergences": 999, "c_source": "/* FLOOR under 1.2/sp2p3 — PTMF staging wall + conditional func_0204302c (size 0x84 vs 0x78).\n * ROM: push {r4,r5,lr}; sub sp,#0xc; ldrh r4,[r0,#0xc]; stage PMFs; bl Process;\n * if (r==1) func_0204302c(r4); return r;\n */\ntypedef struct { int a; int b; } PMF;\nextern int _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(void *self, PMF a, PMF b, PMF c);\nextern PMF data_02099e84;\nextern PMF data_02099e7c;\nextern PMF data_02099e8c;\nextern void func_0204302c(int id);\n\nint func_020432e4(void *self)\n{\n unsigned short id = *(unsigned short *)((char *)self + 0xc);\n int r = _ZN9ActorBase7ProcessEMS_FivEMS_FbvEMS_FvjE(\n self, data_02099e8c, data_02099e7c, data_02099e84);\n if (r == 1)\n func_0204302c(id);\n return r;\n}\n", "source": "lunavyqo-groupb-pure-c-best", "note": "size-mismatch size 0x78 vs 0x6c"} diff --git a/src/func_ov063_021162c8.c b/src/func_ov063_021162c8.cpp similarity index 80% rename from src/func_ov063_021162c8.c rename to src/func_ov063_021162c8.cpp index 91f77678e..31066220b 100644 --- a/src/func_ov063_021162c8.c +++ b/src/func_ov063_021162c8.cpp @@ -1,7 +1,4 @@ //cpp -// NONMATCHING: different op / idiom (div=12). Logic verified correct vs ROM; not -// byte-matchable from C at mwccarm 1.2/sp2p3 (see notes/matching-style.md). -// Counts as decompiled, not matched. struct Vector3; struct Vector3_16; struct CapEnemy { void ReleaseCap(const Vector3 &v); }; struct Actor { @@ -9,9 +6,7 @@ struct Actor { const Vector3_16 *p, int e, int f); }; extern "C" void func_0201267c(int a, void *b); - struct V3 { int x, y, z; }; - extern "C" void func_ov063_021162c8(char *self) { if ((unsigned int)(*(unsigned short*)(self + 0x5d4) << 0x19) >> 0x1f) { @@ -32,9 +27,10 @@ extern "C" void func_ov063_021162c8(char *self) if (a != 0) { *(unsigned char*)((char*)a + 0x3aa) = 0xa; if (*(unsigned short*)(self + 0x4a0) == 0x121) - *(unsigned short*)((char*)a + 0x300 + 0xa8) = 0; + *(unsigned short*)((char*)a + 0x3a8) = 0; } - *(unsigned short*)(self + 0x5d4) &= ~2; + unsigned short *ip = (unsigned short *)(((long long)(int)(self + 0x5d4)) & 0xFFFFFFFFFFFFFFFFLL); + *ip = (unsigned short)(*ip & ~2); } } func_0201267c(0x14a, self + 0x74);