/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401e9120 FUN_1401e9120 * Pseudocode, not original source. */ void FUN_1401e9120(longlong param_1,longlong param_2,longlong param_3) { byte bVar1; byte bVar2; int iVar3; int iVar4; byte bVar5; ulonglong uVar6; longlong lVar7; uint uVar8; uint uVar9; ushort uVar10; uint uVar11; ushort uVar12; longlong lVar13; uVar8 = 0; if (*(int *)(param_1 + 0x16f4) != 0) { lVar13 = 0; do { uVar6 = (ulonglong)uVar8; lVar13 = lVar13 + 2; uVar10 = *(ushort *)(*(longlong *)(param_1 + 0x16f8) + -2 + lVar13); uVar8 = uVar8 + 1; bVar1 = *(byte *)(uVar6 + *(longlong *)(param_1 + 0x16e8)); iVar3 = *(int *)(param_1 + 0x1714); bVar5 = (byte)iVar3; if (uVar10 == 0) { lVar7 = (longlong)(int)(uint)bVar1; uVar11 = (uint)*(ushort *)(param_2 + 2 + lVar7 * 4); if ((int)(0x10 - uVar11) < iVar3) { uVar10 = *(ushort *)(param_2 + lVar7 * 4); *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar10 << (bVar5 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar3 = *(int *)(param_1 + 0x1714) + -0x10 + uVar11; *(ushort *)(param_1 + 0x1710) = uVar10 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | *(short *)(param_2 + lVar7 * 4) << (bVar5 & 0x1f); iVar3 = iVar3 + uVar11; } LAB_1401e94a7: *(int *)(param_1 + 0x1714) = iVar3; } else { bVar2 = (&DAT_140292bc0)[bVar1]; uVar11 = bVar2 + 0x101; uVar9 = (uint)*(ushort *)(param_2 + 2 + (ulonglong)uVar11 * 4); if ((int)(0x10 - uVar9) < iVar3) { uVar12 = *(ushort *)(param_2 + (ulonglong)uVar11 * 4); *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar12 << (bVar5 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar3 = *(int *)(param_1 + 0x1714) + -0x10; *(ushort *)(param_1 + 0x1710) = uVar12 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | *(short *)(param_2 + (ulonglong)uVar11 * 4) << (bVar5 & 0x1f); } iVar3 = iVar3 + uVar9; *(int *)(param_1 + 0x1714) = iVar3; iVar4 = *(int *)(&DAT_140292350 + (ulonglong)bVar2 * 4); if (iVar4 != 0) { uVar12 = (ushort)bVar1 - (short)*(undefined4 *)(&DAT_140292cc0 + (ulonglong)bVar2 * 4); if (0x10 - iVar4 < iVar3) { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar12 << ((byte)iVar3 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar3 = *(int *)(param_1 + 0x1714) + -0x10; *(ushort *)(param_1 + 0x1710) = uVar12 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar12 << ((byte)iVar3 & 0x1f); } *(int *)(param_1 + 0x1714) = iVar3 + iVar4; } uVar11 = uVar10 - 1; if (uVar11 < 0x100) { bVar1 = (&DAT_1402929c0)[uVar11]; } else { bVar1 = (&DAT_1402929c0)[(uVar11 >> 7) + 0x100]; } uVar6 = (ulonglong)bVar1; uVar9 = (uint)*(ushort *)(param_3 + 2 + uVar6 * 4); iVar4 = *(int *)(param_1 + 0x1714); if ((int)(0x10 - uVar9) < iVar4) { uVar10 = *(ushort *)(param_3 + uVar6 * 4); *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar10 << ((byte)iVar4 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar4 = *(int *)(param_1 + 0x1714) + -0x10; *(ushort *)(param_1 + 0x1710) = uVar10 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | *(short *)(param_3 + uVar6 * 4) << ((byte)iVar4 & 0x1f); } iVar4 = iVar4 + uVar9; *(int *)(param_1 + 0x1714) = iVar4; iVar3 = *(int *)(&DAT_1402923d0 + uVar6 * 4); if (iVar3 != 0) { uVar10 = (short)uVar11 - (short)*(undefined4 *)(&DAT_140292d40 + uVar6 * 4); if (0x10 - iVar3 < iVar4) { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar10 << ((byte)iVar4 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar3 = *(int *)(param_1 + 0x1714) + -0x10 + iVar3; *(ushort *)(param_1 + 0x1710) = uVar10 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { iVar3 = iVar4 + iVar3; *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar10 << ((byte)iVar4 & 0x1f); } goto LAB_1401e94a7; } } } while (uVar8 < *(uint *)(param_1 + 0x16f4)); } uVar10 = *(ushort *)(param_2 + 0x402); iVar3 = *(int *)(param_1 + 0x1714); if ((int)(0x10 - (uint)uVar10) < iVar3) { uVar12 = *(ushort *)(param_2 + 0x400); *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | uVar12 << ((byte)iVar3 & 0x1f); *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1710); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; *(undefined1 *)((ulonglong)*(uint *)(param_1 + 0x28) + *(longlong *)(param_1 + 0x10)) = *(undefined1 *)(param_1 + 0x1711); *(int *)(param_1 + 0x28) = *(int *)(param_1 + 0x28) + 1; iVar3 = *(int *)(param_1 + 0x1714) + -0x10; *(ushort *)(param_1 + 0x1710) = uVar12 >> (0x10U - (char)*(int *)(param_1 + 0x1714) & 0x1f); } else { *(ushort *)(param_1 + 0x1710) = *(ushort *)(param_1 + 0x1710) | *(short *)(param_2 + 0x400) << ((byte)iVar3 & 0x1f); } *(uint *)(param_1 + 0x1714) = iVar3 + (uint)uVar10; *(uint *)(param_1 + 0x170c) = (uint)*(ushort *)(param_2 + 0x402); return; }