signed int __fastcall gmThread::PushStackFrame(int a1, int a2, int a3, int a4)
{
int v4; // r6@1
int v5; // r8@1
int v6; // r12@1
int v7; // r4@5
int v8; // r1@6
int v9; // r5@7
int v10; // r11@8
int v11; // r10@8
int v12; // r0@8
int v13; // r7@8
int v14; // r9@8
int v15; // r5@9
int v16; // r4@10
int v17; // r3@12
int v18; // r2@12
signed int v19; // r3@12
int v20; // r1@13
signed int result; // r0@19
int v22; // r9@21
int v23; // r3@22
int v24; // r3@24
int v25; // r0@24
int v26; // r2@25
int v27; // r3@26
int v28; // r3@26
int v29; // r3@30
int v30; // r3@33
int v31; // r2@33
int v32; // r1@33
int v33; // r3@33
int v34; // r3@34
int v35; // r4@36
int v36; // r2@49
int v37; // r1@49
int v38; // r0@51
int v39; // r0@53
int v40; // [sp+8h] [bp-30h]@1
int v41; // [sp+Ch] [bp-2Ch]@1
v4 = a1;
v5 = a2;
v6 = *(_DWORD *)(a1 + 40);
v40 = a3;
v41 = a4;
while ( 1 )
{
v7 = v6 - v5;
if ( v6 - v5 == 2 )
{
*(_DWORD *)(v4 + 44) = 2;
gmMachine::Sys_SignalCreateThread(*(_DWORD *)(v4 + 28), v4);
}
v8 = *(_DWORD *)(v4 + 32) + 8 * (v7 + 536870911);
if ( *(_DWORD *)v8 != 5 )
{
gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "attempt to call non function type");
return 7;
}
v9 = *(_DWORD *)(v8 + 4);
if ( !*(_DWORD *)(v9 + 16) )
{
v22 = *(_DWORD *)(v9 + 48) - v5;
if ( gmThread::Touch(v4, v22 + *(_DWORD *)(v9 + 36)) )
{
v23 = *(_DWORD *)(v9 + 44);
if ( v23 < v5 )
memset((void *)(*(_DWORD *)(v4 + 32) + 8 * (v7 + v23)), 0, 8 * *(_DWORD *)(v9 + 40));
else
memset((void *)(*(_DWORD *)(v4 + 32) + 8 * *(_DWORD *)(v4 + 40)), 0, 8 * v22);
v24 = *(_DWORD *)(v4 + 28);
v25 = *(_DWORD *)(v24 + 220);
if ( v25 )
{
v26 = *(_DWORD *)v25;
*(_DWORD *)(v24 + 220) = *(_DWORD *)v25;
}
else
{
v25 = gmMemChain::Alloc(v24 + 224);
}
*(_DWORD *)v25 = *(_DWORD *)(v4 + 48);
v27 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 48) = v25;
*(_DWORD *)(v25 + 8) = v27;
result = 0;
v28 = *(_DWORD *)(v4 + 48);
if ( v40 )
v26 = *(_DWORD *)v40;
else
*(_DWORD *)(v28 + 4) = 0;
if ( v40 )
{
*(_DWORD *)(v28 + 4) = v26;
v29 = *(_DWORD *)(v9 + 28);
*(_DWORD *)v40 = v29;
*(_DWORD *)v41 = v29;
}
*(_DWORD *)(v4 + 44) = v7;
*(_DWORD *)(v4 + 40) = v7 + *(_DWORD *)(v9 + 48);
}
else
{
gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "stack overflow");
result = 7;
}
return result;
}
*(_WORD *)(v4 + 84) = v5;
v10 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 44) = v7;
v11 = *(_DWORD *)(v4 + 40);
v12 = (*(int (__fastcall **)(int))(v9 + 16))(v4);
v13 = *(_DWORD *)(*(_DWORD *)(v4 + 28) + 24);
v14 = v12;
if ( *(_BYTE *)(v13 + 112) )
{
v6 = *(_DWORD *)(v4 + 40);
}
else
{
v15 = *(_DWORD *)(v4 + 44);
v6 = *(_DWORD *)(v4 + 40);
if ( v15 < v6 )
{
v16 = 8 * v15;
do
{
v17 = *(_DWORD *)(v4 + 32);
++v15;
v18 = v17 + v16;
v19 = *(_DWORD *)(v17 + v16);
v16 += 8;
if ( v19 > 2 )
{
v20 = *(_DWORD *)(v18 + 4);
if ( !*(_BYTE *)(v13 + 112) )
{
if ( v20 && !*(_BYTE *)(v20 + 13) && *(_DWORD *)(v13 + 96) != *(_BYTE *)(v20 + 12) )
{
gmGCColorSet::GrayThisObject(v13 + 4);
v6 = *(_DWORD *)(v4 + 40);
}
}
}
}
while ( v15 < v6 );
}
}
if ( v14 != -6 )
break;
--v5;
}
if ( v6 == v11 )
{
v36 = *(_DWORD *)(v4 + 32);
v37 = *(_DWORD *)(v4 + 44) + 536870910;
*(_DWORD *)(v36 + 8 * v37) = 0;
*(_DWORD *)(v36 + 8 * v37 + 4) = 0;
}
else
{
v30 = *(_DWORD *)(v4 + 32);
v31 = v30 + 8 * (v6 + 536870911);
v32 = *(_DWORD *)(v31 + 4);
v33 = v30 + 8 * (*(_DWORD *)(v4 + 44) + 536870910);
*(_DWORD *)v33 = *(_DWORD *)v31;
*(_DWORD *)(v33 + 4) = v32;
}
v34 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 44) = v10;
*(_DWORD *)(v4 + 40) = v34 - 1;
if ( v14 )
{
if ( v40 )
v35 = *(_DWORD *)v40;
else
v35 = 0;
if ( v14 == -2 )
{
gmMachine::Sys_RemoveSignals(*(_DWORD *)(v4 + 28), v4);
*(_DWORD *)(v4 + 68) = v35;
result = 6;
}
else if ( v14 == -3 )
{
v38 = *(_DWORD *)(v4 + 28);
*(_DWORD *)(v4 + 68) = v35;
gmMachine::Sys_SwitchState(v38, v4, 2);
result = 2;
}
else
{
if ( v14 != -4 )
{
if ( v14 != -5 )
return 7;
return 3;
}
v39 = *(_DWORD *)(v4 + 28);
*(_DWORD *)(v4 + 68) = v35;
gmMachine::Sys_SwitchState(v39, v4, 1);
result = 1;
}
}
else
{
if ( !*(_DWORD *)(v4 + 48) )
return 3;
result = 0;
}
return result;
}
{
int v4; // r6@1
int v5; // r8@1
int v6; // r12@1
int v7; // r4@5
int v8; // r1@6
int v9; // r5@7
int v10; // r11@8
int v11; // r10@8
int v12; // r0@8
int v13; // r7@8
int v14; // r9@8
int v15; // r5@9
int v16; // r4@10
int v17; // r3@12
int v18; // r2@12
signed int v19; // r3@12
int v20; // r1@13
signed int result; // r0@19
int v22; // r9@21
int v23; // r3@22
int v24; // r3@24
int v25; // r0@24
int v26; // r2@25
int v27; // r3@26
int v28; // r3@26
int v29; // r3@30
int v30; // r3@33
int v31; // r2@33
int v32; // r1@33
int v33; // r3@33
int v34; // r3@34
int v35; // r4@36
int v36; // r2@49
int v37; // r1@49
int v38; // r0@51
int v39; // r0@53
int v40; // [sp+8h] [bp-30h]@1
int v41; // [sp+Ch] [bp-2Ch]@1
v4 = a1;
v5 = a2;
v6 = *(_DWORD *)(a1 + 40);
v40 = a3;
v41 = a4;
while ( 1 )
{
v7 = v6 - v5;
if ( v6 - v5 == 2 )
{
*(_DWORD *)(v4 + 44) = 2;
gmMachine::Sys_SignalCreateThread(*(_DWORD *)(v4 + 28), v4);
}
v8 = *(_DWORD *)(v4 + 32) + 8 * (v7 + 536870911);
if ( *(_DWORD *)v8 != 5 )
{
gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "attempt to call non function type");
return 7;
}
v9 = *(_DWORD *)(v8 + 4);
if ( !*(_DWORD *)(v9 + 16) )
{
v22 = *(_DWORD *)(v9 + 48) - v5;
if ( gmThread::Touch(v4, v22 + *(_DWORD *)(v9 + 36)) )
{
v23 = *(_DWORD *)(v9 + 44);
if ( v23 < v5 )
memset((void *)(*(_DWORD *)(v4 + 32) + 8 * (v7 + v23)), 0, 8 * *(_DWORD *)(v9 + 40));
else
memset((void *)(*(_DWORD *)(v4 + 32) + 8 * *(_DWORD *)(v4 + 40)), 0, 8 * v22);
v24 = *(_DWORD *)(v4 + 28);
v25 = *(_DWORD *)(v24 + 220);
if ( v25 )
{
v26 = *(_DWORD *)v25;
*(_DWORD *)(v24 + 220) = *(_DWORD *)v25;
}
else
{
v25 = gmMemChain::Alloc(v24 + 224);
}
*(_DWORD *)v25 = *(_DWORD *)(v4 + 48);
v27 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 48) = v25;
*(_DWORD *)(v25 + 8) = v27;
result = 0;
v28 = *(_DWORD *)(v4 + 48);
if ( v40 )
v26 = *(_DWORD *)v40;
else
*(_DWORD *)(v28 + 4) = 0;
if ( v40 )
{
*(_DWORD *)(v28 + 4) = v26;
v29 = *(_DWORD *)(v9 + 28);
*(_DWORD *)v40 = v29;
*(_DWORD *)v41 = v29;
}
*(_DWORD *)(v4 + 44) = v7;
*(_DWORD *)(v4 + 40) = v7 + *(_DWORD *)(v9 + 48);
}
else
{
gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "stack overflow");
result = 7;
}
return result;
}
*(_WORD *)(v4 + 84) = v5;
v10 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 44) = v7;
v11 = *(_DWORD *)(v4 + 40);
v12 = (*(int (__fastcall **)(int))(v9 + 16))(v4);
v13 = *(_DWORD *)(*(_DWORD *)(v4 + 28) + 24);
v14 = v12;
if ( *(_BYTE *)(v13 + 112) )
{
v6 = *(_DWORD *)(v4 + 40);
}
else
{
v15 = *(_DWORD *)(v4 + 44);
v6 = *(_DWORD *)(v4 + 40);
if ( v15 < v6 )
{
v16 = 8 * v15;
do
{
v17 = *(_DWORD *)(v4 + 32);
++v15;
v18 = v17 + v16;
v19 = *(_DWORD *)(v17 + v16);
v16 += 8;
if ( v19 > 2 )
{
v20 = *(_DWORD *)(v18 + 4);
if ( !*(_BYTE *)(v13 + 112) )
{
if ( v20 && !*(_BYTE *)(v20 + 13) && *(_DWORD *)(v13 + 96) != *(_BYTE *)(v20 + 12) )
{
gmGCColorSet::GrayThisObject(v13 + 4);
v6 = *(_DWORD *)(v4 + 40);
}
}
}
}
while ( v15 < v6 );
}
}
if ( v14 != -6 )
break;
--v5;
}
if ( v6 == v11 )
{
v36 = *(_DWORD *)(v4 + 32);
v37 = *(_DWORD *)(v4 + 44) + 536870910;
*(_DWORD *)(v36 + 8 * v37) = 0;
*(_DWORD *)(v36 + 8 * v37 + 4) = 0;
}
else
{
v30 = *(_DWORD *)(v4 + 32);
v31 = v30 + 8 * (v6 + 536870911);
v32 = *(_DWORD *)(v31 + 4);
v33 = v30 + 8 * (*(_DWORD *)(v4 + 44) + 536870910);
*(_DWORD *)v33 = *(_DWORD *)v31;
*(_DWORD *)(v33 + 4) = v32;
}
v34 = *(_DWORD *)(v4 + 44);
*(_DWORD *)(v4 + 44) = v10;
*(_DWORD *)(v4 + 40) = v34 - 1;
if ( v14 )
{
if ( v40 )
v35 = *(_DWORD *)v40;
else
v35 = 0;
if ( v14 == -2 )
{
gmMachine::Sys_RemoveSignals(*(_DWORD *)(v4 + 28), v4);
*(_DWORD *)(v4 + 68) = v35;
result = 6;
}
else if ( v14 == -3 )
{
v38 = *(_DWORD *)(v4 + 28);
*(_DWORD *)(v4 + 68) = v35;
gmMachine::Sys_SwitchState(v38, v4, 2);
result = 2;
}
else
{
if ( v14 != -4 )
{
if ( v14 != -5 )
return 7;
return 3;
}
v39 = *(_DWORD *)(v4 + 28);
*(_DWORD *)(v4 + 68) = v35;
gmMachine::Sys_SwitchState(v39, v4, 1);
result = 1;
}
}
else
{
if ( !*(_DWORD *)(v4 + 48) )
return 3;
result = 0;
}
return result;
}