// // sub_180006ED0 from 0x180006ed0 to 0x180007119 (585 bytes) // // 2 xrefs: // > sub_180006640 @ 0x18000697f // > @ 0x1801f6348 // // 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_180006ED0(unsigned __int16 *a1, __int64 a2, __int64 a3) { unsigned __int16 v3; // si unsigned __int16 *v4; // rdi unsigned __int64 v5; // rax void *v6; // rsp int v7; // ecx __int64 result; // rax unsigned __int16 *v9; // rbx unsigned int v10; // r10d int v11; // r11d int v12; // ecx int v13; // esi unsigned int v14; // ecx __int64 v15; // r12 unsigned int v16; // r9d __int64 v17; // r15 __int64 v18; // r14 __int64 v19; // r13 char v20; // r11 unsigned int v21; // esi __int64 v22; // rcx bool v23; // cf __int64 v24; // rcx __int64 i; // r8 char v26; // cl __int64 v27; // rdx __int64 j; // r8 char v29; // cl __int64 v30; // rdx _BYTE *v31; // rdx __int64 v32; // r8 unsigned __int16 *v33; // rax signed __int64 v34; // rdi unsigned __int16 v35; // [rsp+20h] [rbp+0h] BYREF unsigned int v36; // [rsp+24h] [rbp+4h] int v37; // [rsp+28h] [rbp+8h] int v38; // [rsp+2Ch] [rbp+Ch] unsigned int v39; // [rsp+30h] [rbp+10h] int v40; // [rsp+34h] [rbp+14h] __int64 v41; // [rsp+38h] [rbp+18h] unsigned __int16 *v42; // [rsp+48h] [rbp+28h] v3 = a3; v4 = a1; v35 = a3; a3 = (unsigned __int16)a3; v41 = a2; v42 = a1; v5 = (unsigned __int16)a3 + 15LL; if ( v5 <= (unsigned __int16)a3 ) v5 = 0xFFFFFFFFFFFFFF0LL; v6 = alloca(v5 & 0xFFFFFFFFFFFFFFF0uLL); LOWORD(v7) = 1; result = 0; v37 = 1; v9 = &v35; if ( (unsigned __int16)a3 > 1u ) { v10 = (unsigned __int16)a3; v39 = (unsigned __int16)a3; do { v11 = (unsigned __int16)v7; v40 = (unsigned __int16)v7; if ( (unsigned __int16)v7 >= v10 ) goto LABEL_27; v12 = 2 * (unsigned __int16)v7; while ( 1 ) { v13 = (unsigned __int16)result; v14 = (unsigned __int16)result + v12; v15 = (unsigned __int16)result; v16 = (unsigned __int16)result + v11; if ( v14 >= v10 ) v14 = v10; v17 = v16; v36 = (unsigned __int16)result + v11; v18 = v14; if ( (unsigned __int16)result < (unsigned __int64)v16 ) { v19 = v16; do { v38 = v13; if ( v19 >= v18 ) break; v20 = *((_BYTE *)v4 + v15); v21 = v36; v22 = v15; v23 = *(_WORD *)(a2 + 2LL * v20) < *(_WORD *)(a2 + 2LL * *((char *)v4 + v19)); a2 = v41; if ( !v23 ) v20 = *((_BYTE *)v4 + v19); ++v15; if ( !v23 ) { v15 = v22; ++v19; v21 = v36 + 1; } v36 = v21; v13 = v38 + 1; if ( !v23 ) v13 = v38; v24 = (unsigned __int16)result; LOWORD(result) = result + 1; *((_BYTE *)v9 + v24) = v20; } while ( v15 < v16 ); v16 = v36; v10 = v39; v11 = v40; } for ( i = v13; i < v17; *((_BYTE *)v9 + v27) = v26 ) { v26 = *((_BYTE *)v4 + i++); v27 = (unsigned __int16)result; LOWORD(result) = result + 1; } for ( j = (int)v16; j < v18; *((_BYTE *)v9 + v30) = v29 ) { v29 = *((_BYTE *)v4 + j++); v30 = (unsigned __int16)result; LOWORD(result) = result + 1; } v12 = 2 * v11; if ( v11 + (unsigned int)(unsigned __int16)result >= v10 ) break; a2 = v41; } v3 = v35; if ( (unsigned __int16)result < v35 ) { LABEL_27: v31 = (char *)v9 + (unsigned __int16)result; v32 = (unsigned __int16)(v3 - result); do { *v31 = v31[(char *)v4 - (char *)v9]; ++v31; --v32; } while ( v32 ); } HIWORD(v7) = HIWORD(v37); v33 = v4; a2 = v41; LOWORD(v7) = 2 * v37; v37 = v7; v4 = v9; v9 = v33; result = 0; } while ( (unsigned __int16)v7 < v3 ); a3 = v3; } if ( v9 == v42 && v3 ) { v34 = (char *)v4 - (char *)v9; do { result = *((unsigned __int8 *)v9 + v34); *(_BYTE *)v9 = result; v9 = (unsigned __int16 *)((char *)v9 + 1); --a3; } while ( a3 ); } return result; }