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;
}