Newer
Older
AMI-Aptio-BIOS-Reversed / PurleyPlatPkg / Platform / Pei / EarlyVideoPei / VgaModeProgramDac.c
@Ajax Dong Ajax Dong 2 days ago 3 KB Full restructure
void __fastcall VgaModeProgramDac(unsigned __int8 *n981, char a2)
{
  char n12; // al
  int n1342177280; // esi
  int v4; // esi
  int v5; // ecx
  int n6213; // ebx
  int v7; // ecx
  unsigned __int8 *n981_1; // esi
  unsigned __int8 v10; // al
  int n129; // ecx
  unsigned __int8 v12; // dl
  unsigned __int8 n0x20_1; // al
  unsigned __int8 n0x20_2; // al
  unsigned __int8 v15; // [esp+18h] [ebp-14h]
  unsigned __int8 n0x20; // [esp+1Fh] [ebp-Dh]
  unsigned __int8 v17; // [esp+20h] [ebp-Ch]
  int n981_2; // [esp+28h] [ebp-4h] BYREF

  n981_1 = n981;
  if ( (a2 & 1) != 0 )
  {
    v10 = __inbyte(0x3C3u);
    if ( (v10 & 1) == 0 )
    {
      __outbyte(0x3C3u, 1u);
      __outbyte(0x3C2u, 0xE3u);
    }
    __outbyte(0x3D4u, 0x80u);
    __outbyte(0x3D5u, 0xA8u);
    n129 = 129;
    v17 = -127;
    n981_2 = 981;
    do
    {
      __outbyte(0x3D4u, v17);
      __outbyte(n981_2, 0);
      v17 = ++n129;
    }
    while ( (unsigned __int16)n129 < 0x9Eu );
    n981 = (unsigned __int8 *)&unk_FFE7752C;
    n0x20 = n981_1[28];
    if ( n0x20 >= 0x20u )
      n981 = (unsigned __int8 *)&unk_FFE77834;
    v12 = *n981;
    n981_2 = 980;
    do
    {
      v15 = n981[1];
      __outbyte(n981_2, v12);
      __outbyte(0x3D5u, v15);
      n981 += 2;
      v12 = *n981;
    }
    while ( *n981 != 0xFF );
    if ( n0x20 == 64 )
    {
      __outbyte(0x3D4u, 0xBCu);
      __outbyte(0x3D5u, 0x40u);
      __outbyte(0x3D4u, 0xBDu);
      __outbyte(0x3D5u, 0x38u);
      __outbyte(0x3D4u, 0xBEu);
      __outbyte(0x3D5u, 0x3Au);
      __outbyte(0x3D4u, 0xBFu);
      __outbyte(0x3D5u, 0x38u);
      __outbyte(0x3D4u, 0xCFu);
      __outbyte(0x3D5u, 0x70u);
      __outbyte(0x3D4u, 0xB5u);
      __outbyte(0x3D5u, 0xA8u);
      __outbyte(0x3D4u, 0xBBu);
      n981_2 = 981;
      __outbyte(0x3D5u, 0x43u);
    }
  }
  if ( (a2 & 2) != 0 )
  {
    n0x20_1 = n981_1[28];
    if ( n0x20_1 < 0x40u )
    {
      if ( n0x20_1 < 0x20u )
        PciRegClearBit((int)n981_1);
      else
        VgaModeColorConfig((int)n981_1);
    }
    else
    {
      VgaModeSetRefresh((int *)n981_1);
    }
  }
  if ( (a2 & 4) != 0 )
  {
    n0x20_2 = n981_1[28];
    if ( n0x20_2 < 0x30u )
    {
      if ( n0x20_2 < 0x20u )
        VgaModeSetPlane((int *)n981_1);
      else
        VgaModeSetPlanes((int *)n981_1);
    }
    else
    {
      VgaModeProgramCrtcExt((int *)n981_1);
    }
  }
  if ( (a2 & 8) != 0 )
  {
    n981_2 = (int)n981;
    n12 = VgaCrtcRegAnd(0xD1u, 0xEu);
    if ( n12 != 12 )
    {
      ImageDecodeBlock1(510533888, 3);
      do
        ImageDecodeBlock0(510533888, &n981_2);
      while ( n981_2 != 3 );
      ImageDecodeBlock0(510525444, &n981_2);
      if ( (n981_2 & 3) != 0 )
      {
        if ( (n981_2 & 3) == 2 )
        {
          n1342177280 = 1342177280;
        }
        else if ( (n981_2 & 3) == 3 )
        {
          n1342177280 = 1610612736;
        }
        else
        {
          n1342177280 = 1207959552;
        }
      }
      else
      {
        n1342177280 = 1140850688;
      }
      v4 = n1342177280 - 0x200000;
      v5 = v4;
      n6213 = 6213;
      do
      {
        ImageDecodeBlock1(v5, *(_DWORD *)((char *)&unk_FFE7BA9C + v5 - v4));
        v5 = v7 + 4;
        --n6213;
      }
      while ( n6213 );
      ImageDecodeBlock1(510533632, 378054824);
      ImageDecodeBlock1(510533892, v4 + 0x80000000);
      ImageDecodeBlock1(510533888, 1);
      ImageDecodeBlock0(510533696, &n981_2);
      ImageDecodeBlock1(510533696, n981_2 & 0xFFFFF1FF | 0x800);
      LOBYTE(n981_2) = VgaCrtcRegAnd(0x99u, 0xFCu) | 2;
      VgaSeqRegReadModifyWrite(0x3D4u, 0x99u, 0, n981_2);
    }
  }
}