Newer
Older
AMI-Aptio-BIOS-Reversed / EarlyVideoPei / VgaDisplayProgramLarge.c
@Ajax Dong Ajax Dong 2 days ago 2 KB Init
char __fastcall VgaDisplayProgramLarge(_BYTE *a1, int a2)
{
  unsigned __int8 n2_1; // ch
  char v5; // dh
  _DWORD *v6; // ebx
  int v7; // ebp
  unsigned __int8 n0xC1; // cl
  char v10; // al
  _BYTE *v11; // esi
  int v12; // eax
  bool v13; // cf
  char n4; // dl
  int n3; // ebx
  unsigned __int8 v16; // dl
  int i; // eax
  unsigned __int8 n4_1; // [esp+11h] [ebp-7h]
  char n2; // [esp+12h] [ebp-6h]
  char v20; // [esp+13h] [ebp-5h]
  unsigned __int16 v21; // [esp+14h] [ebp-4h]

  n2_1 = 0;
  n2 = 0;
  v5 = 0;
  v20 = 0;
  v6 = *(_DWORD **)(a2 + 58);
  v7 = *(_DWORD *)(a2 + 62);
  n4_1 = 0;
  if ( *a1 != 0xFF || a1[1] != 0xD8 )
    return 0;
  while ( 1 )
  {
    n0xC1 = a1[1];
    if ( n0xC1 != 0xD8 )
      break;
    a1 += 2;
LABEL_26:
    if ( *a1 != 0xFF )
      return 0;
  }
  if ( n0xC1 == 0xD9 )
    goto LABEL_29;
  if ( !n0xC1 )
    return 0;
  if ( (n0xC1 & 0xF0) == 0xE0 )
  {
LABEL_25:
    v10 = a1[3];
    v11 = a1 + 2;
    LOBYTE(v21) = v10;
    HIBYTE(v21) = *v11;
    a1 = &v11[v21];
    goto LABEL_26;
  }
  if ( n0xC1 == 0xC0 )
  {
    v5 |= 2u;
    v20 = v5;
    *(_DWORD *)(a2 + 6) = a1 + 2;
    goto LABEL_25;
  }
  if ( n0xC1 == 0xC4 )
  {
    *(_QWORD *)(v7 + 8 * n4_1) = (int)(a1 + 4);
    n2_1 = n2;
    ++n4_1;
LABEL_19:
    v5 = v20;
    goto LABEL_25;
  }
  if ( (n0xC1 & 0xF0) == 0xC0 )
  {
    if ( n0xC1 >= 0xC1u && n0xC1 < 0xD0u )
      return 0;
    goto LABEL_25;
  }
  if ( n0xC1 != 0xDA )
  {
    if ( n0xC1 != 0xDB )
    {
      if ( n0xC1 == 0xDD )
      {
        *(_BYTE *)(a2 + 80) = a1[5];
        *(_BYTE *)(a2 + 81) = a1[4];
      }
      else if ( (n0xC1 & 0xF8) != 0xD0 && (n0xC1 < 0xF0u || n0xC1 == 0xFF) )
      {
        return 0;
      }
      goto LABEL_25;
    }
    *(_QWORD *)&v6[2 * n2_1] = (int)(a1 + 4);
    n2_1 = ++n2;
    goto LABEL_19;
  }
  *(_DWORD *)a2 = a1 + 14;
LABEL_29:
  if ( n2_1 == 1 )
  {
    v12 = v6[1];
    v13 = __CFADD__(*v6, 65);
    v6[2] = *v6 + 65;
    n2 = 2;
    v6[3] = v13 + v12;
  }
  n4 = n4_1;
  if ( n4_1 == 1 )
  {
    n3 = 3;
    do
    {
      v16 = 0;
      for ( i = 0; i < 16; ++i )
        v16 += *(_BYTE *)(*(_DWORD *)v7 + i + 1);
      *(_QWORD *)(v7 + 8) = *(_QWORD *)v7 + v16 + 17LL;
      v7 += 8;
      --n3;
    }
    while ( n3 );
    n4 = 4;
    v5 = v20;
  }
  if ( n4 != 4 || n2 != 2 || (v5 & 2) == 0 )
    return 0;
  VgaDisplaySetCursor(2u, 4u, a2);
  return 1;
}