Newer
Older
AMI-Aptio-BIOS-Reversed / EarlyVideoPei / VgaModeProgramFifo.c
@Ajax Dong Ajax Dong 2 days ago 2 KB Init
int __fastcall VgaModeProgramFifo(int a1)
{
  unsigned int v1; // esi
  int Width; // eax
  int v3; // eax
  int dst_1; // ebx
  int v6; // esi
  unsigned int n0x300_1; // edi
  int v8; // ebp
  char *src; // ebx
  unsigned int v10; // esi
  unsigned int n0x400_1; // ebp
  char *dst; // esi
  bool i; // zf
  int v14; // [esp-4h] [ebp-1050h]
  unsigned int n0x400; // [esp+10h] [ebp-103Ch] BYREF
  int v16; // [esp+14h] [ebp-1038h] BYREF
  int v17; // [esp+18h] [ebp-1034h] BYREF
  unsigned int n0x300; // [esp+1Ch] [ebp-1030h] BYREF
  unsigned int n3145728; // [esp+20h] [ebp-102Ch] BYREF
  _DWORD v20[4]; // [esp+24h] [ebp-1028h] BYREF
  _DWORD v21[4]; // [esp+34h] [ebp-1018h] BYREF
  int v22; // [esp+44h] [ebp-1008h]
  char buf[4100]; // [esp+48h] [ebp-1004h] BYREF

  v16 = 0;
  v20[0] = -447900028;
  v1 = -15663104;
  v20[1] = 1139746613;
  v20[2] = -231704157;
  v20[3] = 280662773;
  v21[0] = 2075298713;
  v21[1] = 299196859;
  v21[2] = -1879024230;
  v21[3] = 1304510247;
  while ( 1 )
  {
    v14 = a1;
    Width = ImageDecodeGetWidth((_BYTE *)v1, v20);
    a1 = v14;
    if ( !Width )
    {
      v3 = ImageDecodeGetWidth((_BYTE *)(v1 + 24), v21);
      a1 = v14;
      if ( !v3 )
        break;
    }
    v1 += 8;
    if ( v1 >= 0xFFBAF000 )
      return -2147483634;
  }
  if ( (*(_DWORD *)(v1 + 48) & 0xFFFFFF) == 4 )
    return -2147483634;
  n3145728 = 3145728;
  dst_1 = -1879048192;
  v17 = -1879048192;
  v6 = VgaAttrProgramPalette(&v17, &n3145728, &n0x300, &v16, &n0x400);
  v22 = v6;
  if ( v6 >= 0 && n0x400 < 0x400 )
  {
    n0x300_1 = n0x300;
    if ( n0x300 < 0x300 )
    {
      v17 = (int)(1024 - n0x400) / 2;
      v8 = (int)(768 - n0x300) / 2;
      v16 = v8;
      n0x400 *= 4;
      SetMem(buf, 0x1000u, 0);
      if ( n0x300_1 )
      {
        src = (char *)(n3145728 - n0x400 - 1879048192);
        v10 = v8 + n0x300_1 - 458753;
        n0x400_1 = n0x400;
        dst = (char *)(v10 << 12);
        do
        {
          if ( n0x400_1 )
            CopyMem(&buf[4 * v17], src, n0x400_1);
          CopyMem(dst, buf, 0x1000u);
          dst -= 4096;
          src -= n0x400_1;
          --n0x300_1;
        }
        while ( n0x300_1 );
        v8 = v16;
        dst_1 = -1879048192;
        v6 = v22;
      }
      SetMem(buf, 0x1000u, 0);
      for ( i = v8 == 0; !i; i = v8 == 0 )
      {
        CopyMem((char *)dst_1, buf, 0x1000u);
        dst_1 += 4096;
        --v8;
      }
    }
  }
  return v6;
}