int __cdecl VgaAttrProgramPalette(
int *a1,
unsigned int *p_n3145728,
unsigned int *p_n0x300,
int *a4,
unsigned int *p_n0x400)
{
_BYTE *v5; // ecx
int v6; // edi
int v7; // ecx
int v8; // esi
int v9; // edx
unsigned int n0x300_1; // ebx
unsigned __int64 n0x40000000; // rax
unsigned int v12; // kr00_4
unsigned int v13; // eax
unsigned int *p_n3145728_1; // esi
char v15; // cl
int Pool; // eax
int v17; // ecx
int v18; // edi
unsigned __int64 n0x40000000_1; // [esp+18h] [ebp-9C8h]
int v21; // [esp+18h] [ebp-9C8h]
int v22; // [esp+24h] [ebp-9BCh]
int n0x300; // [esp+24h] [ebp-9BCh]
int v24; // [esp+28h] [ebp-9B8h]
int v25; // [esp+28h] [ebp-9B8h]
int v26; // [esp+2Ch] [ebp-9B4h]
void *v27; // [esp+2Ch] [ebp-9B4h]
unsigned int v28; // [esp+30h] [ebp-9B0h] BYREF
int v29; // [esp+34h] [ebp-9ACh]
_BYTE v30[6]; // [esp+40h] [ebp-9A0h] BYREF
int v31; // [esp+46h] [ebp-99Ah]
char *v32; // [esp+4Ah] [ebp-996h]
char *v33; // [esp+4Eh] [ebp-992h]
char *v34; // [esp+52h] [ebp-98Eh]
char *v35; // [esp+56h] [ebp-98Ah]
unsigned int *v36; // [esp+7Ah] [ebp-966h]
char *v37; // [esp+7Eh] [ebp-962h]
char *v38; // [esp+82h] [ebp-95Eh]
char *v39; // [esp+86h] [ebp-95Ah]
__int16 v40; // [esp+90h] [ebp-950h]
char v41; // [esp+A0h] [ebp-940h] BYREF
char v42; // [esp+C0h] [ebp-920h] BYREF
char v43; // [esp+100h] [ebp-8E0h] BYREF
char v44; // [esp+140h] [ebp-8A0h] BYREF
char v45; // [esp+190h] [ebp-850h] BYREF
char v46; // [esp+1E0h] [ebp-800h] BYREF
char v47; // [esp+5E0h] [ebp-400h] BYREF
v26 = (int)v5;
v40 = 0;
v32 = &v44;
v33 = &v46;
v34 = &v45;
v35 = &v47;
v36 = &v28;
v37 = &v41;
v38 = &v42;
v39 = &v43;
v6 = -2147483645;
if ( !VgaDisplayProgramLarge(v5, (int)v30) )
return v6;
v7 = v31;
v8 = *(unsigned __int8 *)(v31 + 6) | (unsigned __int16)(*(_WORD *)(v31 + 5) << 8);
*a4 = v8;
v9 = *(unsigned __int8 *)(v7 + 4) | (unsigned __int16)(*(_WORD *)(v7 + 3) << 8);
*p_n0x300 = v9;
v22 = (v8 & 0xF) != 0 ? 16 - (v8 & 0xF) : 0;
v24 = (v9 & 0xF) != 0 ? 16 - (v9 & 0xF) : 0;
v28 = v22 + v8;
*p_n0x400 = v22 + v8;
n0x300_1 = 0;
v29 = 0;
v12 = v9 + v24;
n0x40000000 = v28 * (unsigned __int64)(unsigned int)(v9 + v24);
n0x40000000_1 = n0x40000000;
if ( !is_mul_ok(v28, v12) || (unsigned int)n0x40000000 >= 0x40000000 )
return v6;
v13 = 4 * n0x40000000;
p_n3145728_1 = p_n3145728;
v29 = n0x40000000_1 >> 30;
if ( *a1 )
{
if ( *p_n3145728 >= v13 )
{
v15 = 1;
}
else
{
v15 = 0;
v6 = -2147483643;
}
*p_n3145728 = v13;
LABEL_11:
if ( v15 != 1 )
return v6;
goto LABEL_12;
}
*p_n3145728 = v13;
Pool = PeiAllocatePool((void *)(4 * n0x40000000_1));
*a1 = Pool;
if ( !Pool )
{
v6 = -2147483639;
v15 = 0;
goto LABEL_11;
}
LABEL_12:
if ( VgaCrtcProgram(v26, *a1, *p_n0x400, v24 + *p_n0x300) )
{
v6 = 0;
v25 = 0;
if ( v22 )
{
v29 = 0;
n0x300 = *p_n0x300;
v28 = *a4;
v27 = (void *)(4 * v28 * n0x300);
v17 = PeiAllocatePool(v27);
v21 = v17;
if ( !v17 )
{
v6 = -2147483639;
v25 = -2147483639;
}
if ( *p_n0x300 )
{
v18 = v17;
do
{
if ( 4 * *a4 )
CopyMem((char *)(v18 + 4 * n0x300_1 * *a4), (char *)(*a1 + 4 * n0x300_1 * *p_n0x400), 4 * *a4);
++n0x300_1;
}
while ( n0x300_1 < *p_n0x300 );
v6 = v25;
p_n3145728_1 = p_n3145728;
v17 = v21;
}
*a1 = v17;
*p_n0x400 = *a4;
*p_n3145728_1 = (unsigned int)v27;
}
}
return v6;
}