void FUN_004021c8(undefined4 param_1,undefined4 param_2,ushort *param_3,undefined4 *param_4,
                 undefined4 *param_5)

{
  byte bVar1;
  short sVar2;
  ushort uVar3;
  undefined4 uVar4;
  undefined4 uVar5;
  int iVar6;
  short *psVar7;
  byte *pbVar8;
  undefined4 uVar9;
  undefined2 *puVar10;
  uint uVar11;
  uint uVar12;
  uint uVar13;
  uint uVar14;
  uint uVar15;
  
  uVar4 = *param_5;
  uVar5 = param_5[0xf0];
  FUN_00401d70(param_1,param_2,&DAT_0041847c);
  pbVar8 = &DAT_00415088;
  puVar10 = &DAT_0041847c;
  do {
    bVar1 = *pbVar8;
    pbVar8 = pbVar8 + 1;
    (&DAT_004184fc)[bVar1] = *puVar10;
    puVar10 = puVar10 + 1;
  } while (pbVar8 != &DAT_004150c8);
  iVar6 = (int)(short)DAT_004184fc;
  uVar3 = *param_3;
  *param_3 = DAT_004184fc;
  iVar6 = (int)((iVar6 - (uint)uVar3) * 0x10000) >> 0x10;
  if (iVar6 == 0) {
    uVar9 = *param_4;
  }
  else {
    FUN_0040207c(param_4[*(byte *)(DAT_00415da8 + iVar6)]);
    uVar9 = *(undefined4 *)(DAT_00415db0 + iVar6 * 4);
  }
  uVar15 = 0x3f;
  FUN_0040207c(uVar9);
  psVar7 = &DAT_0041857a;
  while( true ) {
    sVar2 = *psVar7;
    psVar7 = psVar7 + -1;
    if (sVar2 != 0) break;
    uVar15 = uVar15 - 1 & 0xff;
    if (uVar15 == 0) goto LAB_00402418;
  }
  uVar12 = 1;
  while (uVar14 = uVar12, uVar12 <= uVar15) {
    while( true ) {
      if (((&DAT_004184fc)[uVar14] != 0) || (uVar15 < uVar14)) break;
      uVar14 = uVar14 + 1 & 0xff;
    }
    uVar13 = uVar14 - uVar12 & 0xff;
    if (0xf < uVar13) {
      uVar11 = 1;
      do {
        FUN_0040207c(uVar5);
        uVar11 = uVar11 + 1 & 0xff;
      } while (uVar11 <= uVar13 >> 4);
      uVar13 = uVar14 - uVar12 & 0xf;
    }
    FUN_0040207c(param_5[uVar13 * 0x10 +
                         (uint)*(byte *)(DAT_00415da8 + (short)(&DAT_004184fc)[uVar14])]);
    FUN_0040207c(*(undefined4 *)(DAT_00415db0 + (short)(&DAT_004184fc)[uVar14] * 4));
    uVar12 = uVar14 + 1 & 0xff;
  }
  if (uVar15 == 0x3f) {
    return;
  }
LAB_00402418:
  FUN_0040207c(uVar4);
  return;
}