uint FUN_004011e0(int param_1,byte param_2,ushort *param_3,uint param_4)
{
ushort uVar1;
int iVar2;
uint uVar3;
ushort *puVar4;
int iVar5;
uint uVar6;
uint uVar7;
uint uVar8;
uVar6 = (param_4 & 0xff) << 8 | (param_4 & 0xffff) >> 8;
puVar4 = (ushort *)(param_1 + 8);
uVar8 = 0;
iVar2 = 0x20;
do {
iVar2 = iVar2 + -2;
uVar8 = uVar8 + *puVar4;
puVar4 = puVar4 + 1;
} while (iVar2 != 0);
while( true ) {
if ((int)uVar8 >> 0x10 == 0) break;
uVar8 = ((int)uVar8 >> 0x10) + (uVar8 & 0xffff);
}
uVar3 = (uint)param_2 << 8;
do {
uVar7 = uVar6 + uVar3;
uVar6 = (int)uVar7 >> 0x10;
uVar3 = uVar7 & 0xffff;
} while (uVar6 != 0);
uVar6 = 0;
iVar2 = 0;
while( true ) {
iVar5 = (param_4 & 0xffff) - iVar2;
iVar2 = iVar2 + 2;
if (iVar5 < 2) break;
uVar1 = *param_3;
param_3 = param_3 + 1;
uVar6 = uVar6 + uVar1;
}
if (iVar5 == 1) {
uVar6 = (byte)*param_3 + uVar6;
}
while( true ) {
if ((int)uVar6 >> 0x10 == 0) break;
uVar6 = ((int)uVar6 >> 0x10) + (uVar6 & 0xffff);
}
uVar6 = (uVar7 & 0xffff) + (uVar8 & 0xffff) + (uVar6 & 0xffff);
uVar6 = (uVar6 & 0xffff) + (uVar6 >> 0x10);
uVar6 = ~((uVar6 >> 0x10) + uVar6) & 0xffff;
if (uVar6 == 0) {
uVar6 = 0xffff;
}
return uVar6;
}