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