Newer
Older
AMI-Aptio-BIOS-Reversed / EarlyVideoPei / VgaCrtcProgramVert.c
@Ajax Dong Ajax Dong 2 days ago 4 KB Init
int __thiscall VgaCrtcProgramVert(int *this)
{
  int v1; // esi
  int v2; // edx
  int v3; // ecx
  int v4; // ecx
  unsigned int i; // eax
  _DWORD *v6; // eax
  int n32; // ecx
  int v8; // ebx
  _BYTE *v9; // ebp
  unsigned int n2; // edi
  unsigned int j; // esi
  int v12; // ecx
  int v13; // ecx
  unsigned int v14; // eax
  unsigned int v15; // eax
  unsigned int *v16; // ebx
  unsigned int n0x14_2; // esi
  unsigned int n8; // ebp
  unsigned int n2_3; // ecx
  unsigned int n0x14_1; // eax
  unsigned int n2_1; // edi
  unsigned int n0x4C_1; // edx
  unsigned int n0x4C; // ebx
  unsigned int v24; // esi
  unsigned int n8_2; // eax
  unsigned int n8_1; // edi
  unsigned int n2_2; // [esp+14h] [ebp-2C4h]
  unsigned int n0x14; // [esp+18h] [ebp-2C0h]
  unsigned int n0x14_3; // [esp+1Ch] [ebp-2BCh]
  int *v32; // [esp+20h] [ebp-2B8h]
  unsigned int v33; // [esp+24h] [ebp-2B4h]
  _BYTE *v34; // [esp+28h] [ebp-2B0h]
  int v35; // [esp+2Ch] [ebp-2ACh]
  int v36; // [esp+30h] [ebp-2A8h]
  unsigned int *v37; // [esp+30h] [ebp-2A8h]
  unsigned int v38; // [esp+34h] [ebp-2A4h]
  int v39; // [esp+38h] [ebp-2A0h]
  int v40; // [esp+3Ch] [ebp-29Ch]
  _BYTE v41[156]; // [esp+40h] [ebp-298h] BYREF
  _DWORD v42[127]; // [esp+DCh] [ebp-1FCh] BYREF

  v1 = *this;
  v35 = *this;
  v40 = (unsigned __int16)PciRegRead(*this, 510525464);
  PciRegWrite(v3, v2, v40);
  v36 = (unsigned __int16)PciRegRead(v4, 510525544);
  for ( i = 0; i < 0x4C; ++i )
  {
    v41[i] = 0;
    v41[i + 76] = 0;
  }
  v6 = v42;
  n32 = 32;
  do
  {
    *(v6 - 1) = 255;
    *v6 = 0;
    v6 += 4;
    *(v6 - 3) = 255;
    *(v6 - 2) = 0;
    --n32;
  }
  while ( n32 );
  v8 = 0;
  while ( 1 )
  {
    v39 = 0;
    v9 = v41;
    v38 = 0;
    n2 = 0;
    while ( 1 )
    {
      PciRegWrite(v1, 510525464, v40 | ((v8 | (n2 << 7)) << 16));
      MicroSecondDelay(10);
      for ( j = 0; j < 0x4C; ++j )
      {
        PciRegWrite(v35, 510525544, v36 | ((j | (j << 8)) << 16));
        PciRegWrite(v12, 510525552, 0);
        PciRegWrite(v13, 510525556, 1023);
        if ( PciRegVerifyWrite(this) )
        {
          if ( !j )
            break;
          ++*(&v38 + n2);
          v14 = n2 + 2 * v8;
          v9[j] = 80;
          if ( j < *(_DWORD *)&v41[8 * v14 + 152] )
            *(_DWORD *)&v41[8 * v14 + 152] = j;
          if ( j > v42[2 * v14] )
            v42[2 * v14] = j;
        }
        else
        {
          if ( *(&v38 + n2) >= 5 )
            break;
          v15 = n2 + 2 * v8;
          v42[2 * v15] = 0;
          *(_DWORD *)&v41[8 * v15 + 152] = 255;
        }
      }
      ++n2;
      v9 += 76;
      if ( n2 >= 2 )
        break;
      v1 = v35;
    }
    if ( !v38 && !v39 )
      ++v8;
    if ( (unsigned int)++v8 >= 0x20 )
      break;
    v1 = v35;
  }
  v33 = 0;
  v16 = v42;
  n0x14_2 = 0;
  v32 = 0;
  n8 = 0;
  n0x14_3 = 0;
  n2_3 = 0;
  n0x14_1 = 0;
  n0x14 = 0;
  do
  {
    n2_2 = 0;
    n2_1 = 0;
    v34 = v41;
    v37 = v16;
    do
    {
      n0x4C_1 = *(v16 - 1);
      n0x4C = *v16;
      if ( n0x4C_1 > n0x4C )
        goto LABEL_52;
      v24 = n0x4C - n0x4C_1;
      v38 = n0x4C - n0x4C_1;
      if ( n0x4C - n0x4C_1 + 2 >= v33 )
      {
        n8_2 = 0;
        n8_1 = 0;
        if ( n0x4C_1 )
        {
          do
          {
            if ( !v34[n0x4C_1] )
              break;
            ++n8_1;
            --n0x4C_1;
          }
          while ( n0x4C_1 );
          v24 = v38;
        }
        for ( ; n0x4C < 0x4C; ++n0x4C )
        {
          if ( !v34[n0x4C] )
            break;
          ++n8_2;
        }
        if ( n8_1 > n8_2 )
          n8_1 = n8_2;
        if ( v24 > (unsigned int)v32 && n8_1 >= n8 )
        {
          n0x14_1 = n0x14;
          if ( n0x14 <= 0x14 )
            goto LABEL_43;
        }
        if ( v24 <= (unsigned int)v32 + 1 )
        {
          if ( n8_1 > n8 && n8 < 8 )
          {
            if ( v24 > v33 )
              v33 = v24;
            n0x14_1 = n0x14;
            goto LABEL_44;
          }
        }
        else if ( n8_1 >= n8 )
        {
          n0x14_1 = n0x14;
LABEL_43:
          v33 = v24;
LABEL_44:
          n2_3 = n2_2;
          n8 = n8_1;
          v32 = (int *)v24;
          n2_1 = n2_2;
          n0x14_2 = n0x14_1;
          n0x14_3 = n0x14_1;
          goto LABEL_52;
        }
        n2_1 = n2_2;
      }
      n0x14_1 = n0x14;
      n0x14_2 = n0x14_3;
LABEL_52:
      ++n2_1;
      v34 += 76;
      v16 = v37 + 2;
      n2_2 = n2_1;
      v37 += 2;
    }
    while ( n2_1 < 2 );
    n0x14 = ++n0x14_1;
  }
  while ( n0x14_1 < 0x20 );
  PciRegWrite(v35, 510525464, v40 | ((n0x14_2 | (n2_3 << 7)) << 16));
  MicroSecondDelay(10);
  return PciRegWrite(v35, 510525452, 23553);
}