// // _handle_exc from 0x180133160 to 0x1801333c7 (615 bytes) // // 2 xrefs: // > _except2 @ 0x18013309d // > @ 0x180203128 // // 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 handle_exc(unsigned int a1, double *a2, __int16 a3) { unsigned int v3; // r14d int v5; // ebx char v7; // r15 __int64 v8; // rax double v9; // xmm0_8 double v10; // xmm0_8 int v11; // edi int v12; // ecx double v13; // xmm0_8 int v14; // r8d unsigned int v15; // eax __int64 v16; // rdx unsigned int v17; // ecx int v19; // [rsp+70h] [rbp+8h] BYREF double v20; // [rsp+88h] [rbp+20h] v3 = 0; v5 = a1 & 0x1F; v7 = a1; if ( (a1 & 8) != 0 && (a3 & 0x80u) != 0 ) { set_statfp(1); v5 &= ~8u; goto LABEL_46; } if ( (a1 & 4) != 0 && (a3 & 0x200) != 0 ) { set_statfp(4); v5 &= ~4u; goto LABEL_46; } if ( (a1 & 1) != 0 && (a3 & 0x400) != 0 ) { set_statfp(8); v8 = a3 & 0x6000; if ( (a3 & 0x6000) != 0 ) { if ( v8 != 0x2000 ) { if ( v8 != 0x4000 ) { if ( v8 != 24576 ) { LABEL_24: v5 &= ~1u; goto LABEL_46; } v9 = 1.797693134862316e308; if ( *a2 <= 0.0 ) goto LABEL_22; LABEL_23: *a2 = v9; goto LABEL_24; } if ( *a2 <= 0.0 ) { v9 = 1.797693134862316e308; LABEL_22: v9 = -v9; goto LABEL_23; } LABEL_20: v9 = INFINITY; goto LABEL_23; } if ( *a2 > 0.0 ) { v9 = 1.797693134862316e308; goto LABEL_23; } } else if ( *a2 > 0.0 ) { goto LABEL_20; } v9 = INFINITY; goto LABEL_22; } if ( (a1 & 2) != 0 && (a3 & 0x800) != 0 ) { v10 = *a2; v11 = (a1 >> 4) & 1; if ( *a2 == 0.0 ) { v11 = 1; } else { decomp(v10, &v19); v12 = v19 - 1536; v20 = v10; if ( v19 - 1536 >= -1074 ) { v14 = 0; LOBYTE(v14) = v10 < 0.0; HIWORD(v20) = BYTE6(v20) & 0xF | 0x10; if ( v12 < -1021 ) { v15 = LODWORD(v20); v16 = (unsigned int)(-1021 - v12); v17 = HIDWORD(v20); do { if ( (v15 & 1) != 0 && !v11 ) v11 = 1; v15 >>= 1; LODWORD(v20) = v15; if ( (v17 & 1) != 0 ) { v15 |= 0x80000000; LODWORD(v20) = v15; } v17 >>= 1; --v16; } while ( v16 ); HIDWORD(v20) = v17; } v13 = v20; if ( v14 ) v13 = -v20; } else { v13 = v10 * 0.0; v11 = 1; } *a2 = v13; } if ( v11 ) set_statfp(16); v5 &= ~2u; } LABEL_46: if ( (v7 & 0x10) != 0 && (a3 & 0x1000) != 0 ) { set_statfp(32); v5 &= ~0x10u; } LOBYTE(v3) = v5 == 0; return v3; }