// // sub_180001A10 from 0x180001a10 to 0x180001e8a (1146 bytes) // // 2 xrefs: // > sub_180007790 @ 0x1800077ff // > @ 0x1801f60d8 // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // __int64 __fastcall sub_180001A10(_QWORD *a1, __int64 a2) { __int64 v3; // r15 __int16 v5; // ax int v6; // eax char v7; // al unsigned __int64 v8; // rdx char v9; // r14 __int64 v10; // rax void *v11; // rsp int v12; // ebx __int64 v13; // rsi int v14; // eax int v15; // edx unsigned int i; // eax int v17; // eax int j; // edx char v19; // cl int v20; // esi int v21; // ebx double v22; // xmm0_8 double v23; // xmm0_8 int v24; // ecx float v25; // xmm1_4 int v26; // edx __m128i v27; // xmm0 double v28; // xmm0_8 float v29; // xmm1_4 int v30; // eax unsigned __int64 v31; // rax __int64 v32; // rcx unsigned __int64 v33; // rcx void *v34; // rsp void *v35; // rsp int v36; // eax __int16 v37; // cx int v38; // esi unsigned int *v39; // rbx int v40; // eax char v41; // cl int v42; // ebx unsigned int *v43; // rsi int v44; // eax char v45; // cl __int64 v46; // rbx unsigned __int64 v47; // rcx __int64 v48; // rax void *v49; // rsp unsigned int *v50; // rsi __int64 v51; // rdx int v52; // eax __int64 result; // rax unsigned int v54; // [rsp+20h] [rbp+0h] BYREF int v55; // [rsp+24h] [rbp+4h] *(_OWORD *)a2 = 0; v3 = 0; *(_OWORD *)(a2 + 16) = 0; v54 = 0; *(_OWORD *)(a2 + 32) = 0; *(_OWORD *)(a2 + 48) = 0; *(_OWORD *)(a2 + 64) = 0; *(_OWORD *)(a2 + 80) = 0; *(_OWORD *)(a2 + 96) = 0; *(_QWORD *)(a2 + 112) = 0; if ( (unsigned int)sub_180001340((__int64)a1, 24) != 5653314 ) return 0xFFFFFFFFLL; *(_BYTE *)(a2 + 100) = sub_180001340((__int64)a1, 16); v5 = sub_180001340((__int64)a1, 24); *(_WORD *)(a2 + 96) = v5; if ( v5 == -1 ) return 0xFFFFFFFFLL; v6 = sub_180001340((__int64)a1, 1); if ( v6 ) { if ( v6 != 1 ) return 0xFFFFFFFFLL; v7 = sub_180001340((__int64)a1, 5); v8 = *(__int16 *)(a2 + 96); *(_WORD *)(a2 + 98) = v8; v9 = v7 + 1; v10 = v8 + 15; if ( v8 + 15 < v8 ) v10 = 0xFFFFFFFFFFFFFF0LL; v11 = alloca(v10 & 0xFFFFFFFFFFFFFFF0uLL); v12 = 0; if ( (__int16)v8 > 0 ) { v13 = 0; do { v14 = (__int16)v8; v15 = 0; for ( i = v14 - v12; i; i >>= 1 ) ++v15; v17 = sub_180001340((__int64)a1, v15); if ( v17 == -1 ) return 0xFFFFFFFFLL; for ( j = 0; j < v17; ++v12 ) { if ( v12 >= *(__int16 *)(a2 + 96) ) break; *((_BYTE *)&v54 + v13) = v9; ++j; ++v13; } v19 = v9; *(_BYTE *)(a2 + 103) = v9++; *(_DWORD *)(a2 + 104) = (1 << v19) - 1; LODWORD(v8) = *(__int16 *)(a2 + 96); } while ( v12 < (int)v8 ); } } else { v31 = *(__int16 *)(a2 + 96); v32 = v31 + 15; if ( v31 + 15 < v31 ) v32 = 0xFFFFFFFFFFFFFF0LL; v33 = v32 & 0xFFFFFFFFFFFFFFF0uLL; v34 = alloca(v33); v35 = alloca(v33); v36 = sub_180001340((__int64)a1, 1); v37 = *(_WORD *)(a2 + 96); if ( v36 ) { v38 = 0; if ( v37 > 0 ) { v39 = &v54; do { if ( (unsigned int)sub_180001340((__int64)a1, 1) ) { v40 = sub_180001340((__int64)a1, 5); if ( v40 == -1 ) return 0xFFFFFFFFLL; v41 = v40 + 1; *(_BYTE *)v39 = v40 + 1; ++*(_WORD *)(a2 + 98); if ( v40 + 1 > *(char *)(a2 + 103) ) { *(_BYTE *)(a2 + 103) = v41; *(_DWORD *)(a2 + 104) = (1 << v41) - 1; } } else { *(_BYTE *)v39 = 0; } ++v38; v39 = (unsigned int *)((char *)v39 + 1); } while ( v38 < *(__int16 *)(a2 + 96) ); } } else { *(_WORD *)(a2 + 98) = v37; v42 = 0; if ( v37 > 0 ) { v43 = &v54; do { v44 = sub_180001340((__int64)a1, 5); if ( v44 == -1 ) return 0xFFFFFFFFLL; v45 = v44 + 1; *(_BYTE *)v43 = v44 + 1; if ( v44 + 1 > *(char *)(a2 + 103) ) { *(_BYTE *)(a2 + 103) = v45; *(_DWORD *)(a2 + 104) = (1 << v45) - 1; } ++v42; v43 = (unsigned int *)((char *)v43 + 1); } while ( v42 < *(__int16 *)(a2 + 96) ); } } } v20 = sub_180001340((__int64)a1, 4); if ( v20 <= 0 ) goto LABEL_22; v21 = sub_180001340((__int64)a1, 32); v55 = sub_180001340((__int64)a1, 32); v22 = (double)(v21 & 0x1FFFFF); if ( v21 < 0 ) v22 = -v22; v23 = ldexp(v22, ((v21 >> 21) & 0x3FFu) - 788); v24 = v55; v25 = v23; v26 = (v55 >> 21) & 0x3FF; v27 = _mm_cvtsi32_si128(v55 & 0x1FFFFF); *(float *)(a2 + 88) = v25; v28 = _mm_cvtepi32_pd(v27).m128d_f64[0]; if ( v24 < 0 ) v28 = -v28; v29 = ldexp(v28, v26 - 788); *(float *)(a2 + 92) = v29; *(_BYTE *)(a2 + 102) = sub_180001340((__int64)a1, 4) + 1; if ( !(unsigned int)sub_180001340((__int64)a1, 1) ) { LABEL_22: *(_BYTE *)(a2 + 101) = v20; if ( !v20 ) { v54 = 0; v50 = nullptr; goto LABEL_52; } if ( v20 == 1 ) { v30 = sub_1800024C0((unsigned int)*(__int16 *)(a2 + 96), (unsigned int)*(char *)(a2 + 100)); v54 = v30; goto LABEL_46; } if ( v20 != 2 ) { v30 = 0; LABEL_46: v46 = v30; v47 = 2LL * v30; v48 = v47 + 15; if ( v47 + 15 < v47 ) v48 = 0xFFFFFFFFFFFFFF0LL; v49 = alloca(v48 & 0xFFFFFFFFFFFFFFF0uLL); v50 = &v54; if ( v46 > 0 ) { do *((_WORD *)&v54 + v3++) = sub_180001340((__int64)a1, *(char *)(a2 + 102)); while ( v3 < v46 ); } LABEL_52: v51 = v54; v52 = (1 << *(_BYTE *)(a2 + 102)) - 1; *(_DWORD *)a2 = v52; *(_DWORD *)(a2 + 4) = v52; *(_DWORD *)(a2 + 8) = v52; *(_DWORD *)(a2 + 12) = v52; *(__m128 *)(a2 + 16) = _mm_shuffle_ps((__m128)*(unsigned int *)(a2 + 88), (__m128)*(unsigned int *)(a2 + 88), 0); *(__m128 *)(a2 + 32) = _mm_shuffle_ps((__m128)*(unsigned int *)(a2 + 92), (__m128)*(unsigned int *)(a2 + 92), 0); sub_180001E90(&v54, v51, v50, a2); result = sub_180001310(a1); if ( !(_DWORD)result ) return result; } } return 0xFFFFFFFFLL; }