#include <Uefi.h>
#include <PiPei.h>

void *SetMem(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffe3f199*/
 return buf; /*0xffe3f19f*/
}


char *CopyMem(char *dst, char *src, unsigned int count)
{
 unsigned int count_1; // edx
 char *dst_1; // edi
 char *src_1; // esi

 count_1 = count; /*0xffe3f1b6*/
 if ( src < dst && &src[count - 1] >= dst ) /*0xffe3f1c4*/
 {
 src_1 = &src[count - 1]; /*0xffe3f1d8*/
 dst_1 = &dst[count - 1]; /*0xffe3f1da*/
 }
 else
 {
 count_1 = count & 3; /*0xffe3f1c8*/
 qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe3f1d1*/
 src_1 = &src[4 * (count >> 2)]; /*0xffe3f1d1*/
 dst_1 = &dst[4 * (count >> 2)]; /*0xffe3f1d1*/
 }
 qmemcpy(dst_1, src_1, count_1); /*0xffe3f1e1*/
 return dst; /*0xffe3f1e8*/
}


int CopyMemDwords(int a1, int a2, int a3, int a4)
{
 do /*0xffe3f225*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe3f21d*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe3f221*/
 }
 while ( a2 ); /*0xffe3f225*/
 return a1; /*0xffe3f229*/
}


void *SetMem32(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffe3f239*/
 return buf; /*0xffe3f23f*/
}


EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 if ( (MmioRead32(1024068) & 0x80u) == 0 ) /*0xffe3f2d8*/
 {
 MmioWrite32(1024064, 1280); /*0xffe3f2e4*/
 IoOr32(); /*0xffe3f2e9*/
 }
 return StatusCodePeiEntry(ImageHandle, SystemTable);
}


int __thiscall StatusCodeAllocCallbackNode(void *Node)
{
 int PeiServices; // eax
 int NodeBase; // [esp+0h] [ebp-4h]

 PeiServices = GetPeiServices(); /*0xffe3f2ff*/
 if ( (*(int (__stdcall **)(int))(*(_DWORD *)PeiServices + 52))(PeiServices) < 0 ) /*0xffe3f317*/
 return 0; /*0xffe3f319*/
 ZeroMem((unsigned int)Node + 8, src, 0x10u); /*0xffe3f32b*/
 *(_DWORD *)(NodeBase + 24) = 0; /*0xffe3f339*/
 return NodeBase + 24; /*0xffe3f33e*/
}


int StatusCodeRemoveCallback(_WORD *Callback)
{
 _WORD *Callback_1; // esi
 _WORD *PpiList; // eax
 int GuidScanResult; // ecx
 int Index; // edx

 Callback_1 = Callback; /*0xffe3f344*/
 if ( !Callback ) /*0xffe3f349*/
 return -2147483646; /*0xffe3f34b*/
 PpiList = FindGuidInPpiList(src); /*0xffe3f357*/
LABEL_4:
 for ( Callback = PpiList; ; PpiList = Callback ) /*0xffe3f35c*/
 {
 if ( !PpiList ) /*0xffe3f389*/
 return -2147483634; /*0xffe3f392*/
 Index = 0; /*0xffe3f361*/
 if ( *((_DWORD *)PpiList + 6) ) /*0xffe3f363*/
 break; /*0xffe3f363*/
LABEL_8:
 if ( SPrintScanGuid(GuidScanResult, &Callback) < 0 ) /*0xffe3f37e*/
 {
 PpiList = 0; /*0xffe3f380*/
 goto LABEL_4; /*0xffe3f382*/
 }
 }
 while ( *(_WORD **)&PpiList[2 *Index + 14] != Callback_1 ) /*0xffe3f36c*/
 {
 if ( (unsigned int)++Index >= *((_DWORD *)PpiList + 6) ) /*0xffe3f372*/
 goto LABEL_8; /*0xffe3f372*/
 }
 *(_DWORD *)&PpiList[2 *Index + 14] = *(_DWORD *)&PpiList[2 * (*((_DWORD *)PpiList + 6))-- + 12]; /*0xffe3f39a*/
 return 0; /*0xffe3f390*/
}


int StatusCodeRegisterCallback(_WORD *Callback)
{
 _WORD *Callback_1; // edi
 _WORD *PpiList; // eax
 void *This; // ecx
 _DWORD *CallbackNode; // esi
 unsigned int CallbackCount; // edx
 unsigned int CallbackCount_1; // ecx
 _DWORD *CallbackPtr; // eax

 Callback_1 = Callback; /*0xffe3f3a9*/
 if ( !Callback ) /*0xffe3f3ae*/
 return -2147483646; /*0xffe3f3b0*/
 PpiList = FindGuidInPpiList(src); /*0xffe3f3bd*/
 CallbackNode = 0; /*0xffe3f3c2*/
 Callback = PpiList; /*0xffe3f3c4*/
 if ( PpiList ) /*0xffe3f3c9*/
 {
 do /*0xffe3f403*/
 {
 CallbackCount = *((_DWORD *)PpiList + 6); /*0xffe3f3cb*/
 if ( CallbackCount < 8 ) /*0xffe3f3d1*/
 CallbackNode = PpiList + 12; /*0xffe3f3d3*/
 CallbackCount_1 = 0; /*0xffe3f3d6*/
 if ( CallbackCount ) /*0xffe3f3da*/
 {
 CallbackPtr = PpiList + 14; /*0xffe3f3dc*/
 while ( (_WORD *)*CallbackPtr != Callback_1 ) /*0xffe3f3e1*/
 {
 ++CallbackCount_1; /*0xffe3f3e3*/
 ++CallbackPtr; /*0xffe3f3e4*/
 if ( CallbackCount_1 >= CallbackCount ) /*0xffe3f3e9*/
 goto LABEL_10; /*0xffe3f3e9*/
 }
 return -2147483628; /*0xffe3f420*/
 }
LABEL_10:
 if ( SPrintScanGuid(CallbackCount_1, &Callback) >= 0 ) /*0xffe3f3f5*/
 {
 PpiList = Callback; /*0xffe3f3fe*/
 }
 else
 {
 PpiList = 0; /*0xffe3f3f7*/
 Callback = 0; /*0xffe3f3f9*/
 }
 }
 while ( PpiList ); /*0xffe3f403*/
 if ( CallbackNode ) /*0xffe3f407*/
 goto LABEL_18; /*0xffe3f407*/
 }
 CallbackNode = (_DWORD *)StatusCodeAllocCallbackNode(This); /*0xffe3f40e*/
 if ( !CallbackNode ) /*0xffe3f412*/
 return -2147483639; /*0xffe3f414*/
LABEL_18:
 CallbackNode[++*CallbackNode] = Callback_1; /*0xffe3f422*/
 return 0; /*0xffe3f42d*/
}


int StatusCodeDispatchCallbacks(
 int PeiServices,
 int CodeType,
 int Value,
 int Instance,
 int CallerId,
 int StatusCodeData)
{
 int GuidScanResult; // ecx
 unsigned __int16 *GuidInPpiList; // esi
 unsigned int Index; // ebx
 void ( **Callback)(int, int, int, int, int, int); // edi
 unsigned __int16 *GuidInPpiList_1; // [esp+14h] [ebp-8h] BYREF
 int PeiServices_1; // [esp+18h] [ebp-4h]

 PeiServices_1 = PeiServices; /*0xffe3f436*/
 GuidInPpiList = FindGuidInPpiList(src); /*0xffe3f447*/
LABEL_2:
 GuidInPpiList_1 = GuidInPpiList; /*0xffe3f449*/
 while ( GuidInPpiList ) /*0xffe3f493*/
 {
 Index = 0; /*0xffe3f44f*/
 if ( *((_DWORD *)GuidInPpiList + 6) ) /*0xffe3f451*/
 {
 Callback = (void ( **)(int, int, int, int, int, int))(GuidInPpiList + 14); /*0xffe3f456*/
 do /*0xffe3f47a*/
 {
 (*Callback++)(PeiServices_1, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f46e*/
 ++Index; /*0xffe3f476*/
 }
 while ( Index < *((_DWORD *)GuidInPpiList + 6) ); /*0xffe3f47a*/
 }
 if ( SPrintScanGuid(GuidScanResult, &GuidInPpiList_1) < 0 ) /*0xffe3f487*/
 {
 GuidInPpiList = 0; /*0xffe3f489*/
 goto LABEL_2; /*0xffe3f48b*/
 }
 GuidInPpiList = GuidInPpiList_1; /*0xffe3f48d*/
 }
 return 0; /*0xffe3f495*/
}


int StatusCodeReport(int PeiServices, int CodeType, int Value, int Instance, int CallerId, int StatusCodeData)
{
 char Buffer[256]; // [esp+0h] [ebp-100h] BYREF

 StatusCodeDispatchCallbacks(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData); /*0xffe3f4ba*/
 return SerialPortWrite(PeiServices, CodeType, Value, Instance, CallerId, StatusCodeData, Buffer); /*0xffe3f4e0*/
}


int ( *StatusCodeSerialReport(int Value, unsigned __int8 *FormatString, int Args))(int a1, char *_r_n)
{
 int Index; // ebx
 int ( *PeiServices_1)(int, char *); // eax
 int ( *PeiServices)(int, char *); // esi
 void ( *Callback)(char *, int); // eax
 int StatusCodeData[5]; // [esp+10h] [ebp-178h] BYREF
 int Value_1; // [esp+24h] [ebp-164h]
 int StatusCodeData2; // [esp+28h] [ebp-160h]
 int StatusCodeData3; // [esp+2Ch] [ebp-15Ch]
 int StatusCodeData4; // [esp+30h] [ebp-158h]
 int StatusCodeData5; // [esp+34h] [ebp-154h]
 int StatusCodeData6; // [esp+38h] [ebp-150h]
 int StatusCodeData7; // [esp+3Ch] [ebp-14Ch]
 int StatusCodeData8; // [esp+40h] [ebp-148h]
 int StatusCodeData9; // [esp+44h] [ebp-144h]
 int StatusCodeData10; // [esp+48h] [ebp-140h]
 int StatusCodeData11; // [esp+4Ch] [ebp-13Ch]
 int StatusCodeData12; // [esp+50h] [ebp-138h]
 int StatusCodeData13; // [esp+54h] [ebp-134h]
 int StatusCodeData14; // [esp+58h] [ebp-130h]
 int StatusCodeData15; // [esp+5Ch] [ebp-12Ch]
 int StatusCodeData16; // [esp+60h] [ebp-128h]
 int StatusCodeData17; // [esp+64h] [ebp-124h]
 int StatusCodeData18; // [esp+68h] [ebp-120h]
 int StatusCodeData19; // [esp+6Ch] [ebp-11Ch]
 int StatusCodeData20; // [esp+70h] [ebp-118h]
 int StatusCodeData21; // [esp+74h] [ebp-114h]
 int StatusCodeData22; // [esp+78h] [ebp-110h]
 int StatusCodeData23; // [esp+7Ch] [ebp-10Ch]
 int StatusCodeData24; // [esp+80h] [ebp-108h]
 int StatusCodeData25; // [esp+84h] [ebp-104h]
 char OutputBuffer; // [esp+88h] [ebp-100h] BYREF
 _BYTE TempBuffer[255]; // [esp+89h] [ebp-FFh] BYREF

 Index = 0; /*0xffe3f4f1*/
 StatusCodeData[1] = -1706126778; /*0xffe3f4f3*/
 StatusCodeData[0] = 23330836; /*0xffe3f500*/
 StatusCodeData[2] = 299226451; /*0xffe3f51d*/
 StatusCodeData[3] = 100721287; /*0xffe3f525*/
 StatusCodeData[4] = -1178385111; /*0xffe3f52d*/
 Value_1 = 0; /*0xffe3f535*/
 StatusCodeData2 = 0; /*0xffe3f539*/
 StatusCodeData3 = 0; /*0xffe3f53d*/
 StatusCodeData4 = 0; /*0xffe3f541*/
 StatusCodeData5 = 0; /*0xffe3f545*/
 StatusCodeData6 = 0; /*0xffe3f549*/
 StatusCodeData7 = 0; /*0xffe3f54d*/
 StatusCodeData8 = 0; /*0xffe3f551*/
 StatusCodeData9 = 0; /*0xffe3f555*/
 StatusCodeData10 = 0; /*0xffe3f559*/
 StatusCodeData11 = 0; /*0xffe3f55d*/
 StatusCodeData12 = 0; /*0xffe3f561*/
 StatusCodeData13 = 0; /*0xffe3f565*/
 StatusCodeData14 = 0; /*0xffe3f569*/
 StatusCodeData15 = 0; /*0xffe3f56d*/
 StatusCodeData16 = 0; /*0xffe3f571*/
 StatusCodeData17 = 0; /*0xffe3f575*/
 StatusCodeData18 = 0; /*0xffe3f579*/
 StatusCodeData19 = 0; /*0xffe3f57d*/
 StatusCodeData20 = 0; /*0xffe3f581*/
 StatusCodeData21 = 0; /*0xffe3f585*/
 StatusCodeData22 = 0; /*0xffe3f58c*/
 StatusCodeData23 = 0; /*0xffe3f593*/
 StatusCodeData24 = 0; /*0xffe3f59a*/
 StatusCodeData25 = 0; /*0xffe3f5a1*/
 OutputBuffer = 0; /*0xffe3f5a8*/
 SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f5af*/
 PeiServices_1 = (int ( *)(int, char *))GetPeiServices(); /*0xffe3f5b7*/
 PeiServices = PeiServices_1; /*0xffe3f5bc*/
 if ( FormatString ) /*0xffe3f5c1*/
 {
 AsciiSPrintUnicodeFormat(&OutputBuffer, 0x100u, 0, FormatString, Args, 0); /*0xffe3f5d7*/
 Value_1 = Value; /*0xffe3f5f0*/
 StatusCodeDispatchCallbacks((int)PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f5f4*/
 for ( Callback = (void ( *)(char *, int))i[0]; /*0xffe3f5f9*/
 Callback;
 Callback = (void ( *)(char *, int))dword_FFE43E14[Index++] )
 {
 Callback(&OutputBuffer, Value); /*0xffe3f60c*/
 }
 return PeiServicesInstallPpi((int)PeiServices, &OutputBuffer); /*0xffe3f625*/
 }
 return PeiServices_1; /*0xffe3f62a*/
}


int ( *StatusCodeDebugAssert(double AssertString, int LineNumber))(int a1, char *_r_n)
{
 int Index; // ebx
 int PeiServices; // esi
 void ( *i)(char *, _DWORD, _DWORD); // eax
 double ExtraInfo; // [esp+0h] [ebp-180h]
 int StatusCodeData[30]; // [esp+8h] [ebp-178h] BYREF
 char AssertBuffer; // [esp+80h] [ebp-100h] BYREF
 _BYTE TempBuffer[255]; // [esp+81h] [ebp-FFh] BYREF

 Index = 0; /*0xffe3f63e*/
 StatusCodeData[1] = -1706126778; /*0xffe3f640*/
 StatusCodeData[0] = 23330836; /*0xffe3f64c*/
 StatusCodeData[2] = 299226451; /*0xffe3f669*/
 StatusCodeData[3] = 100721287; /*0xffe3f671*/
 StatusCodeData[4] = -1178385111; /*0xffe3f679*/
 memset(&StatusCodeData[6], 0, 96); /*0xffe3f685*/
 AssertBuffer = 0; /*0xffe3f6ee*/
 SetMemWrapper((int)TempBuffer, TempBuffer, 0, 0xFFu); /*0xffe3f6f5*/
 PeiServices = GetPeiServices(); /*0xffe3f705*/
 AsciiSPrint(
 &AssertBuffer,
 0x100u,
 "ASSERT %a(%d): %a\n Press any key to continue. \n",
 AssertString,
 LineNumber,
 ExtraInfo);
 StatusCodeData[5] = 0x80000000; /*0xffe3f728*/
 StatusCodeDispatchCallbacks(PeiServices, 3, 50659328, 0, 0, (int)StatusCodeData); /*0xffe3f73d*/
 for ( i = (void ( *)(char *, _DWORD, _DWORD))i_0; i; i = (void ( *)(char *, _DWORD, _DWORD))::i[Index++] ) /*0xffe3f742*/
 i(&AssertBuffer, LODWORD(AssertString), HIDWORD(AssertString)); /*0xffe3f75a*/
 return PeiServicesInstallPpi(PeiServices, &AssertBuffer); /*0xffe3f779*/
}


int StatusCodePeiEntry(int FileHandle, int __return_address)
{
 int v4; // eax
 int PeiServices; // eax
 int Status; // eax
 int Status_1; // esi
 int ReportStatusCodePpi; // eax
 int v10; // eax
 int Status_2; // eax
 int v12; // eax
 int StatusCodePpi; // esi
 int v14; // eax
 int Status_3; // eax
 int v16; // eax
 int Descriptor_1; // esi
 int v18; // eax
 int Status_4; // eax
 int v20; // eax
 int Index; // edi
 int (*i)(); // eax
 void *This; // ecx
 char StatusCodePpiBuffer[4]; // [esp+8h] [ebp-10h] BYREF
 char StatusCodePpiBuffer2[4]; // [esp+Ch] [ebp-Ch] BYREF
 int Descriptor; // [esp+10h] [ebp-8h] BYREF
 int Descriptor2; // [esp+14h] [ebp-4h] BYREF

 v4 = GetPeiServices(); /*0xffe3f78b*/
 if ( (*(int ( **)(int))(*(_DWORD *)v4 + 116))(FileHandle) == -2147483628 ) /*0xffe3f79c*/
 {
 PeiServices = GetPeiServices(); /*0xffe3f7a2*/
 Status = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)PeiServices + 32))( /*0xffe3f7b9*/
 PeiServices,
 &unk_FFE4356C,
 0,
 &Descriptor2,
 StatusCodePpiBuffer2);
 Status_1 = Status; /*0xffe3f7bc*/
 if ( Status >= 0 ) /*0xffe3f7c3*/
 {
 v10 = GetPeiServices(); /*0xffe3f7fd*/
 Status_2 = (*(int ( **)(int, void *, _DWORD, int *, char *))(*(_DWORD *)v10 + 32))( /*0xffe3f814*/
 v10,
 &unk_FFE4353C,
 0,
 &Descriptor,
 StatusCodePpiBuffer);
 Status_1 = Status_2; /*0xffe3f817*/
 if ( Status_2 >= 0 ) /*0xffe3f81e*/
 {
 StatusCodePpi = Descriptor2; /*0xffe3f848*/
 v14 = GetPeiServices(); /*0xffe3f84b*/
 Status_3 = (*(int ( **)(int, int, void *))(*(_DWORD *)v14 + 28))(v14, StatusCodePpi, &unk_FFE4367C); /*0xffe3f859*/
 Status_1 = Status_3; /*0xffe3f85c*/
 if ( Status_3 >= 0 ) /*0xffe3f863*/
 {
 Descriptor_1 = Descriptor; /*0xffe3f894*/
 v18 = GetPeiServices(); /*0xffe3f897*/
 Status_4 = (*(int ( **)(int, int, void *))(*(_DWORD *)v18 + 28))(v18, Descriptor_1, &unk_FFE435B8); /*0xffe3f8a5*/
 Status_1 = Status_4; /*0xffe3f8a8*/
 if ( Status_4 < 0 ) /*0xffe3f8af*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_4); /*0xffe3f8c0*/
 v20 = LocateReportStatusCodePpi(); /*0xffe3f8c8*/
 if ( v20 ) /*0xffe3f8cf*/
 (*(void ( **)(const char *, int, const char *))(v20 + 4))( /*0xffe3f8df*/
 "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c",
 513,
 "!EFI_ERROR (Status)");
 }
 }
 else
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_3); /*0xffe3f870*/
 v16 = LocateReportStatusCodePpi(); /*0xffe3f878*/
 if ( v16 ) /*0xffe3f87f*/
 (*(void ( **)(const char *, int, const char *))(v16 + 4))( /*0xffe3f88f*/
 "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c",
 506,
 "!EFI_ERROR (Status)");
 }
 }
 else
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status_2); /*0xffe3f82b*/
 v12 = LocateReportStatusCodePpi(); /*0xffe3f833*/
 if ( v12 ) /*0xffe3f83a*/
 (*(void ( **)(const char *, int, const char *))(v12 + 4))( /*0xffe3f846*/
 "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c",
 499,
 "!EFI_ERROR (Status)");
 }
 }
 else
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe3f7d0*/
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3f7d8*/
 if ( ReportStatusCodePpi ) /*0xffe3f7df*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3f7f0*/
 "e:\\hs\\AmiModulePkg\\AmiStatusCode\\StatusCodePei.c",
 486,
 "!EFI_ERROR (Status)");
 }
 return Status_1; /*0xffe3f7f6*/
 }
 else
 {
 Index = 0; /*0xffe3f8e5*/
 for ( i = PpiDescriptorPtr; i; i = (int (*)())dword_FFE427FC[Index++] ) /*0xffe3f8e7*/
 i(); /*0xffe3f8f0*/
 (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435AC); /*0xffe3f908*/
 StatusCodeAllocCallbackNode(This); /*0xffe3f90b*/
 (*(void ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE435B8); /*0xffe3f918*/
 return (*(int ( **)(int, void *))(*(_DWORD *)__return_address + 24))(__return_address, &unk_FFE4367C); /*0xffe3f923*/
 }
}


int DebugAssertMsgs(int StatusCodeData, int _r_n)
{
 int v2; // esi
 int v3; // eax

 v2 = StatusCodeData + 52; /*0xffe3f931*/
 v3 = 0; /*0xffe3f934*/
 if ( *(_BYTE *)(StatusCodeData + 52) ) /*0xffe3f936*/
 {
 do /*0xffe3f93b*/
 ++v3; /*0xffe3f93a*/
 while ( *(_BYTE *)(v3 + v2) ); /*0xffe3f93b*/
 }
 SPrintAsciiFormat(
 _r_n,
 256,
 (int)"ASSERT in %s on %i: %s\n",
 (const char *)(StatusCodeData + 52),
 *(_DWORD *)(StatusCodeData + 40),
 (const char *)(v2 + v3 + 1));
 return 0; /*0xffe3f95e*/
}


int StatusCodeToErrorStr(int n7, int _r_n)
{
 int n7_1; // esi
 int i; // eax
 double v5; // [esp-4h] [ebp-8h]

 n7_1 = ::n7; /*0xffe3f961*/
 for ( i = 0; ; ++i )
 {
 if ( !n7_1 )
 {
 SPrintAsciiFormat(
 _r_n,
 256,
 (int)"ERROR: Class:%X; Subclass:%X; Operation: %X\n",
 n7 & 0xFF000000,
 n7 & 0xFF0000,
 (unsigned __int16)n7);
 return 0; /*0xffe3f999*/
 }
 if ( n7_1 == n7 ) /*0xffe3f96d*/
 break; /*0xffe3f96d*/
 n7_1 = dword_FFE435E4[2 *i]; /*0xffe3f96f*/
 }
 LODWORD(v5) = (&off_FFE435E0)[2 *i]; // "Memory not installed" /*0xffe3f9a5*/
 SPrintAsciiFormat(_r_n, 256, (int)"ERROR: %a\n", v5);
 return 0; /*0xffe3f9a3*/
}


int StatusCodeFormatMsg(int CodeType, int Value, int StatusCodeData, _BYTE *Buffer)
{
 char *SrcPtr; // esi
 char *WideSrcPtr; // ebp
 unsigned __int16 Index; // dx
 int DataType; // eax
 char CharByte; // al
 __int16 CharSize; // ax
 char WideCharByte; // al
 int DataPtr; // ecx

 if ( !StatusCodeData ) /*0xffe3f9d6*/
 goto LABEL_24; /*0xffe3f9d6*/
 if ( StrnCmp((_BYTE *)(StatusCodeData + 4), src_3) ) /*0xffe3f9e7*/
 {
 if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_0) ) /*0xffe3fa69*/
 {
 AsciiSPrintUnicodeFormat( /*0xffe3fa8d*/
 Buffer,
 0x100u,
 0,
 (unsigned __int8 *)(StatusCodeData + 120),
 va,
 (unsigned __int16 *)(StatusCodeData + 24));
 return 0; /*0xffe3fa95*/
 }
 if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_1) ) /*0xffe3fa9f*/
 {
 if ( (_BYTE)CodeType != 2 ) /*0xffe3faac*/
 return 0; /*0xffe3faac*/
 if ( (CodeType & 0xFF000000) == 0x90000000 && (_WORD)Value == 7 ) /*0xffe3fac0*/
 {
 DataPtr = StatusCodeData; /*0xffe3fac2*/
LABEL_23:
 DebugAssertMsgs(DataPtr, (int)Buffer); /*0xffe3fadb*/
 return 0; /*0xffe3fae4*/
 }
LABEL_25:
 StatusCodeToErrorStr(Value, (int)Buffer); /*0xffe3faeb*/
 return 0; /*0xffe3faf1*/
 }
 if ( !StrnCmp((_BYTE *)(StatusCodeData + 4), src_2) ) /*0xffe3face*/
 {
 DataPtr = StatusCodeData + 20; /*0xffe3fad8*/
 goto LABEL_23; /*0xffe3fad8*/
 }
LABEL_24:
 if ( (_BYTE)CodeType != 2 ) /*0xffe3fae9*/
 return 0; /*0xffe3fae9*/
 goto LABEL_25; /*0xffe3fae9*/
 }
 SrcPtr = *(char **)(StatusCodeData + 24); /*0xffe3f9f1*/
 WideSrcPtr = SrcPtr; /*0xffe3f9f4*/
 for ( Index = 0; ; Index += CharSize ) /*0xffe3f9fa*/
 {
 DataType = *(_DWORD *)(StatusCodeData + 20); /*0xffe3f9fe*/
 if ( (DataType || !*SrcPtr) && (DataType != 1 || !*(_WORD *)WideSrcPtr) ) /*0xffe3fa10*/
 break; /*0xffe3fa10*/
 if ( Index >= 0xFFu ) /*0xffe3fa1e*/
 break; /*0xffe3fa1e*/
 if ( DataType ) /*0xffe3fa22*/
 {
 WideCharByte = *WideSrcPtr; /*0xffe3fa37*/
 WideSrcPtr += 2; /*0xffe3fa3a*/
 Buffer[Index] = WideCharByte; /*0xffe3fa42*/
 CharSize = 2; /*0xffe3fa45*/
 }
 else
 {
 CharByte = *SrcPtr++; /*0xffe3fa24*/
 Buffer[Index] = CharByte; /*0xffe3fa2a*/
 CharSize = 1; /*0xffe3fa2f*/
 }
 }
 Buffer[Index] = 0; /*0xffe3fa59*/
 return 0; /*0xffe3faf8*/
}


int SetMem16(int a1, char *_r_n)
{
 char *_r_n_1; // ecx
 int n2; // edx
 char *v4; // esi
 char n10; // al

 _r_n_1 = _r_n; /*0xffe3fafe*/
 n2 = 0; /*0xffe3fb02*/
 if ( _r_n && *_r_n ) /*0xffe3fb08*/
 {
 do /*0xffe3fb43*/
 {
 v4 = &_r_n_1[n2]; /*0xffe3fb0d*/
 n10 = _r_n_1[n2]; /*0xffe3fb10*/
 if ( n10 == 13 && v4[1] == 10 ) /*0xffe3fb1a*/
 {
 n2 += 2; /*0xffe3fb1c*/
 }
 else if ( n10 == 10 ) /*0xffe3fb23*/
 {
 if ( n2 ) /*0xffe3fb27*/
 ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb29*/
 ComPortPollLsrTx("\r\n", 2); /*0xffe3fb36*/
 _r_n_1 = v4 + 1; /*0xffe3fb3b*/
 n2 = 0; /*0xffe3fb3e*/
 }
 else
 {
 ++n2; /*0xffe3fb42*/
 }
 }
 while ( _r_n_1[n2] ); /*0xffe3fb43*/
 if ( n2 ) /*0xffe3fb4c*/
 ComPortPollLsrTx(_r_n_1, n2); /*0xffe3fb4e*/
 }
 return 0; /*0xffe3fb55*/
}


int PpiDescriptorPtr()
{
 ComPortInitialize(); /*0xffe3fb56*/
 return 0; /*0xffe3fb5d*/
}


int ( *PeiServicesInstallPpi(int PeiServices, char *_r_n))(int a1, char *_r_n)
{
 int v4; // esi
 int ( *SetMem16_1)(int, char *); // eax

 v4 = 0; /*0xffe3fb65*/
 for ( SetMem16_1 = SetMem16; SetMem16_1; SetMem16_1 = (int ( *)(int, char *))dword_FFE427F4[v4++] ) /*0xffe3fb67*/
 SetMem16_1(PeiServices, _r_n); /*0xffe3fb70*/
 return SetMem16_1; /*0xffe3fb80*/
}


int SerialPortWrite(
 int PeiServices,
 int CodeType,
 int Value,
 int Instance,
 int CallerId,
 int StatusCodeData,
 char *Buffer)
{
 int Index1; // edi
 void ( *Callback1)(int, unsigned __int8, int); // eax
 int Index2; // edi
 void ( *i)(int, int, __int16); // eax
 int *HandlerTable; // eax

 Index1 = 0; /*0xffe3fb90*/
 for ( Callback1 = (void ( *)(int, unsigned __int8, int))BasePrintFillBuffer; /*0xffe3fb92*/
 Callback1;
 Callback1 = (void ( *)(int, unsigned __int8, int))*(&funcs_FFE3FB9C + Index1++) )
 {
 Callback1(PeiServices, CodeType, Value); /*0xffe3fb9c*/
 }
 *Buffer = 0; /*0xffe3fbba*/
 StatusCodeFormatMsg(CodeType, Value, StatusCodeData, Buffer); /*0xffe3fbbc*/
 if ( *Buffer ) /*0xffe3fbc1*/
 PeiServicesInstallPpi(PeiServices, Buffer); /*0xffe3fbcc*/
 Index2 = 0; /*0xffe3fbd1*/
 for ( i = (void ( *)(int, int, __int16))BasePrintParseHexByte; /*0xffe3fbd3*/
 i;
 i = (void ( *)(int, int, __int16))dword_FFE427EC[Index2++] )
 {
 i(PeiServices, CodeType, Value); /*0xffe3fbe9*/
 }
 if ( (_BYTE)CodeType == 2 ) /*0xffe3fbfd*/
 {
 HandlerTable = ::HandlerTable; /*0xffe3fc06*/
 if ( byte_FFE43E1C ) /*0xffe3fc0b*/
 HandlerTable = (int *)&unk_FFE43E20; /*0xffe3fc0d*/
 while ( *HandlerTable ) /*0xffe3fc25*/
 {
 if ( *HandlerTable == Value && HandlerTable[1] ) /*0xffe3fc18*/
 {
 ((void ( *)(int, int))HandlerTable[1])(PeiServices, Value); /*0xffe3fc2b*/
 return 0; /*0xffe3fc2b*/
 }
 HandlerTable += 2; /*0xffe3fc1e*/
 }
 }
 return 0; /*0xffe3fc30*/
}


int BasePrintIsHexDigit(int a1, unsigned __int8 a2)
{
 int result; // eax

 result = a2; /*0xffe3fc37*/
 __outbyte(0x80u, a2); /*0xffe3fc41*/
 return result; /*0xffe3fc42*/
}


int BasePrintFillBuffer(int a1, unsigned __int8 a2, int a3)
{
 unsigned int n2; // eax
 int v4; // eax
 int v5; // ebx
 unsigned __int8 v6; // al
 void ( *i)(int, unsigned __int8); // eax
 unsigned __int8 v9; // [esp+Ch] [ebp+Ch]

 n2 = a2 - 1; /*0xffe3fc4a*/
 if ( n2 < 2 ) /*0xffe3fc4e*/
 {
 v4 = (int)*(&off_FFE4287C + n2); /*0xffe3fc50*/
 v5 = 0; /*0xffe3fc58*/
 while ( 1 ) /*0xffe3fc64*/
 {
 if ( !*(_DWORD *)v4 ) /*0xffe3fc64*/
 {
 v6 = 0; /*0xffe3fc6a*/
 goto LABEL_7; /*0xffe3fc6a*/
 }
 if ( *(_DWORD *)v4 == a3 ) /*0xffe3fc5f*/
 break; /*0xffe3fc5f*/
 v4 += 8; /*0xffe3fc61*/
 }
 v6 = *(_BYTE *)(v4 + 4); /*0xffe3fc7a*/
LABEL_7:
 v9 = v6; /*0xffe3fc6c*/
 if ( v6 ) /*0xffe3fc71*/
 {
 for ( i = (void ( *)(int, unsigned __int8))BasePrintIsHexDigit; /*0xffe3fc73*/
 i;
 i = (void ( *)(int, unsigned __int8))funcs_FFE3FC85[v5++] )
 {
 i(a1, v9); /*0xffe3fc85*/
 }
 }
 }
 return 0; /*0xffe3fc98*/
}


int BasePrintProduceSChar(int a1, unsigned __int8 n2, int a3)
{
 unsigned int n2_1; // esi
 int i; // eax
 unsigned __int8 v5; // al
 int v6; // edi

 n2_1 = n2 - 1; /*0xffe3fca5*/
 if ( n2_1 < 2 ) /*0xffe3fcaa*/
 {
 for ( i = (int)*(&off_FFE42884 + n2_1); ; i += 8 ) /*0xffe3fcac*/
 {
 if ( !*(_DWORD *)i ) /*0xffe3fcbd*/
 {
 v5 = 0; /*0xffe3fcc3*/
 goto LABEL_7; /*0xffe3fcc3*/
 }
 if ( *(_DWORD *)i == a3 ) /*0xffe3fcb8*/
 break; /*0xffe3fcb8*/
 }
 v5 = *(_BYTE *)(i + 4); /*0xffe3fd01*/
LABEL_7:
 if ( v5 ) /*0xffe3fcc7*/
 {
 v6 = v5; /*0xffe3fcc9*/
 do /*0xffe3fce8*/
 {
 ComPortSetBaud(0xE56Cu, 0x61A80u); /*0xffe3fcd6*/
 TimerDelay(0x186A0u); /*0xffe3fce0*/
 --v6; /*0xffe3fce5*/
 }
 while ( v6 ); /*0xffe3fce8*/
 }
 if ( n2 == 2 ) /*0xffe3fced*/
 TimerDelay(0xF4240u); /*0xffe3fcf4*/
 }
 return 0; /*0xffe3fcf9*/
}


int BasePrintParseHexByte(int a1, int a2, __int16 a3)
{
 int v3; // esi

 if ( (a3 & 0xFF00) == 0x8100 && (_BYTE)a3 ) /*0xffe3fd21*/
 {
 v3 = (unsigned __int8)a3; /*0xffe3fd23*/
 do /*0xffe3fd42*/
 {
 ComPortSetBaud(0x33198u, 0x9C40u); /*0xffe3fd30*/
 TimerDelay(0x186A0u); /*0xffe3fd3a*/
 --v3; /*0xffe3fd3f*/
 }
 while ( v3 ); /*0xffe3fd42*/
 }
 return 0; /*0xffe3fd46*/
}


int LocateReportStatusCodePpi()
{
 int PeiServices; // eax
 _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF
 int v3; // [esp+4h] [ebp-4h] BYREF

 PeiServices = GetPeiServices(); /*0xffe3fd50*/
 if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)PeiServices + 32))( /*0xffe3fd6f*/
 PeiServices,
 &unk_FFE4354C,
 0,
 v2,
 &v3) >= 0 )
 return v3; /*0xffe3fd75*/
 else
 return 0; /*0xffe3fd71*/
}


int DebugPrint(int a1, const char *a2, ...)
{
 int result; // eax
 int ( **v3)(int, const char *, char *); // esi
 va_list va; // [esp+10h] [ebp+Ch] BYREF

 va_start(va, a2);
 result = LocateReportStatusCodePpi(); /*0xffe3fd7d*/
 v3 = (int ( **)(int, const char *, char *))result; /*0xffe3fd82*/
 if ( result ) /*0xffe3fd86*/
 {
 result = DebugEnabled(); /*0xffe3fd88*/
 if ( (result & a1) != 0 ) /*0xffe3fd93*/
 return (*v3)(a1, a2, (char *)va); /*0xffe3fd9f*/
 }
 return result; /*0xffe3fda4*/
}


int CpuDeadLoop(
 int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 int n48,
 const char *PeiServices____((void__)_0))
{
 int result; // eax

 result = LocateReportStatusCodePpi(); /*0xffe3fdac*/
 if ( result ) /*0xffe3fdb3*/
 return (*(int ( **)(int, int, const char *))(result + 4))( /*0xffe3fdbb*/
 e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 n48,
 PeiServices____((void__)_0));
 return result; /*0xffe3fdc1*/
}


int GetPeiServices()
{
 int v0; // esi
 _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF
 int v3; // [esp+6h] [ebp-6h]

 PeiServicesGetTss(v2); /*0xffe3fdcd*/
 v0 = *(_DWORD *)(v3 - 4); /*0xffe3fdd5*/
 if ( !v0 ) /*0xffe3fdda*/
 CpuDeadLoop( /*0xffe3fde9*/
 (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c",
 48,
 "PeiServices != ((void *) 0)");
 return v0; /*0xffe3fdf1*/
}


unsigned int AsciiSPrint(
 _BYTE *p__r_n,
 unsigned int n0xF4240,
 unsigned __int8 *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n,
 ...)
{
 va_list va; // [esp+10h] [ebp+10h] BYREF

 va_start(va, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n);
 return AsciiSPrintUnicodeFormat(p__r_n, n0xF4240, 0, ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n, (int)va, 0); /*0xffe3fe13*/
}


_BYTE *BasePrintFillChar(_BYTE *a1, unsigned int a2, int i, __int16 a4, int a5)
{
 int j; // esi

 for ( j = 0; j < i; ++j ) /*0xffe3fe20*/
 {
 if ( (unsigned int)a1 >= a2 ) /*0xffe3fe27*/
 break; /*0xffe3fe27*/
 *a1 = a4; /*0xffe3fe2d*/
 if ( a5 != 1 ) /*0xffe3fe2f*/
 a1[1] = HIBYTE(a4); /*0xffe3fe36*/
 a1 += a5; /*0xffe3fe39*/
 }
 return a1; /*0xffe3fe42*/
}


_BYTE *SPrintMarker(_BYTE *_r_n, unsigned int n16, int a3, unsigned int a4)
{
 _BYTE *_r_n_1; // esi
 int ReportStatusCodePpi; // eax
 int v7; // eax
 int v8; // edx
 unsigned __int64 v9; // rtt
 unsigned int v11; // [esp-4h] [ebp-1Ch]
 int v12; // [esp+Ch] [ebp-Ch] BYREF
 int *v13; // [esp+10h] [ebp-8h]
 unsigned int n16_1; // [esp+14h] [ebp-4h]

 _r_n_1 = _r_n; /*0xffe3fe4f*/
 v13 = &v12; /*0xffe3fe57*/
 n16_1 = n16; /*0xffe3fe5a*/
 *_r_n = 0; /*0xffe3fe5d*/
 do /*0xffe3fe9e*/
 {
 if ( !n16 ) /*0xffe3fe62*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe3fe64*/
 if ( ReportStatusCodePpi ) /*0xffe3fe6b*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe3fe79*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c",
 47,
 "Divisor != 0");
 }
 v11 = a4 / n16_1; /*0xffe3fe89*/
 LODWORD(v9) = a3; /*0xffe3fe8d*/
 HIDWORD(v9) = a4 % n16_1; /*0xffe3fe8d*/
 v7 = v9 / n16_1; /*0xffe3fe8d*/
 v8 = v9 % n16_1; /*0xffe3fe8d*/
 if ( v13 ) /*0xffe3fe92*/
 *v13 = v8; /*0xffe3fe94*/
 ++_r_n_1; /*0xffe3fe9a*/
 a3 = v7; /*0xffe3fe9b*/
 a4 = v11; /*0xffe3fea0*/
 *_r_n_1 = byte_FFE42EBC[v12]; /*0xffe3fea9*/
 }
 while ( v11 | v7 ); /*0xffe3fe9e*/
 return _r_n_1; /*0xffe3fead*/
}



unsigned int PciCf8Read(_BYTE *_r_n, unsigned int n38, __int16 a3, char *%02d_%02d_%04d__%02d:%02d, ...)
{
 va_list va; // [esp+18h] [ebp+18h] BYREF

 va_start(va, %02d_%02d_%04d__%02d:%02d);
 return AsciiSPrintUnicodeFormat(_r_n, n38, a3, (unsigned __int8 *)%02d_%02d_%04d__%02d:%02d, (int)va, 0); /*0xffe40b1a*/
}


int PpiListIteratorInit()
{
 int PeiServices; // eax
 int v1; // eax
 int ReportStatusCodePpi; // eax
 int v3; // eax
 int v5; // [esp+4h] [ebp-4h] BYREF

 PeiServices = GetPeiServices(); /*0xffe40b21*/
 v1 = (*(int ( **)(int, int *))(*(_DWORD *)PeiServices + 48))(PeiServices, &v5); /*0xffe40b2d*/
 if ( v1 < 0 ) /*0xffe40b39*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0xffe40b46*/
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b4e*/
 if ( ReportStatusCodePpi ) /*0xffe40b55*/
 (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40b5f*/
 "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c",
 50,
 "!EFI_ERROR (Status)");
 }
 if ( !v5 ) /*0xffe40b69*/
 {
 v3 = LocateReportStatusCodePpi(); /*0xffe40b6b*/
 if ( v3 ) /*0xffe40b72*/
 (*(void ( **)(char *, int, const char *))(v3 + 4))( /*0xffe40b7c*/
 "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c",
 51,
 "HobList != ((void *) 0)");
 }
 return v5; /*0xffe40b85*/
}


_WORD *PpiListIteratorNext(int a1, _WORD *i)
{
 _WORD *i_1; // esi
 int ReportStatusCodePpi; // eax

 i_1 = i; /*0xffe40b8b*/
 if ( !i ) /*0xffe40b8f*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe40b91*/
 if ( ReportStatusCodePpi ) /*0xffe40b98*/
 (*(void ( **)(char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe40ba6*/
 "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c",
 82,
 "HobStart != ((void *) 0)");
 }
 while ( 1 ) /*0xffe40bbf*/
 {
 if ( *i_1 == 0xFFFF ) /*0xffe40bc5*/
 return 0; /*0xffe40bca*/
 if ( *i_1 == 4 ) /*0xffe40bb7*/
 break; /*0xffe40bb7*/
 i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0xffe40bbd*/
 }
 return i_1; /*0xffe40bc9*/
}


_WORD *__thiscall FindGuidInPpiList(char *this)
{
 _WORD *i; // edx
 int v3; // ecx
 _WORD *v4; // eax
 _WORD *v5; // esi

 for ( i = (_WORD *)PpiListIteratorInit(); ; i = (_WORD *)((char *)v5 + (unsigned __int16)v5[1]) ) /*0xffe40bde*/
 {
 v4 = PpiListIteratorNext(v3, i); /*0xffe40bf6*/
 v5 = v4; /*0xffe40bfb*/
 if ( !v4 || GuidCompare(this, (int)(v4 + 4)) ) /*0xffe40be7*/
 break; /*0xffe40be7*/
 }
 return v5; /*0xffe40c01*/
}


int StrnCmp(_BYTE *a1, _BYTE *src)
{
 _BYTE *v2; // esi
 _BYTE *v3; // edi
 int n4; // ebx
 int v5; // ecx

 v2 = a1; /*0xffe40c0b*/
 v3 = a1 + 16; /*0xffe40c10*/
 n4 = (unsigned __int8)a1 & 3; /*0xffe40c13*/
 if ( ((unsigned __int8)a1 & 3) != 0 && n4 == ((unsigned __int8)src & 3) ) /*0xffe40c1f*/
 {
 v5 = 4 - n4; /*0xffe40c24*/
 if ( n4 != 4 ) /*0xffe40c26*/
 {
 do /*0xffe40c33*/
 {
 if ( *v2 != *src ) /*0xffe40c2c*/
 break; /*0xffe40c2c*/
 ++v2; /*0xffe40c2e*/
 ++src; /*0xffe40c2f*/
 --v5; /*0xffe40c30*/
 }
 while ( v5 ); /*0xffe40c33*/
 }
 }
 while ( v2 <= v3 - 4 && *(_DWORD *)v2 == *(_DWORD *)src ) /*0xffe40c3e*/
 {
 v2 += 4; /*0xffe40c40*/
 src += 4; /*0xffe40c43*/
 }
 while ( 1 ) /*0xffe40c54*/
 {
 if ( v2 >= v3 ) /*0xffe40c56*/
 return 0; /*0xffe40c5d*/
 if ( *v2 != *src ) /*0xffe40c50*/
 break; /*0xffe40c50*/
 ++v2; /*0xffe40c52*/
 ++src; /*0xffe40c53*/
 }
 return (char)*v2 - (char)*src; /*0xffe40c5a*/
}


_BYTE *NumberToString(_BYTE *a1, unsigned int n10, __int64 n0xA, char a4)
{
 int v4; // ebx
 int _EDX; // edx
 int n0xA_1; // ecx
 char v9; // al

 v4 = HIDWORD(n0xA); /*0xffe40c69*/
 if ( n0xA >= 0 ) /*0xffe40c7a*/
 goto LABEL_2; /*0xffe40c7a*/
 if ( n10 == 10 ) /*0xffe40c89*/
 {
 n0xA_1 = -(int)n0xA; /*0xffe40c8f*/
 _EDX = (unsigned __int64)-n0xA >> 32; /*0xffe40c94*/
 goto LABEL_8; /*0xffe40c96*/
 }
 if ( a4 ) /*0xffe40c9d*/
LABEL_2:
 _EDX = HIDWORD(n0xA); /*0xffe40c82*/
 else
 _EDX = 0; /*0xffe40c9f*/
 n0xA_1 = n0xA; /*0xffe40ca1*/
LABEL_8:
 if ( __PAIR64__(n0xA_1, _EDX) ) /*0xffe40ca7*/
 {
 do /*0xffe40cd0*/
 {
 n0xA_1 = Udiv64Remainder(n10, (unsigned int *)&n0xA, n0xA_1, _EDX); /*0xffe40cb8*/
 if ( (unsigned int)n0xA >= 0xA ) /*0xffe40cc1*/
 v9 = n0xA + 87; /*0xffe40cc7*/
 else
 v9 = n0xA + 48; /*0xffe40cc3*/
 *a1++ = v9; /*0xffe40cc9*/
 }
 while ( __PAIR64__(n0xA_1, _EDX) ); /*0xffe40cd0*/
 }
 else
 {
 *a1++ = 48; /*0xffe40cd4*/
 }
 if ( n10 == 10 && v4 < 0 ) /*0xffe40cdf*/
 *a1++ = 45; /*0xffe40ce7*/
 *a1 = 0; /*0xffe40cec*/
 return a1 - 1; /*0xffe40ceb*/
}


char *StringReverse(char *a1, unsigned int n10, __int64 n0xA, char a4)
{
 char *v5; // esi
 char *v6; // eax
 char v7; // dl

 v5 = a1; /*0xffe40d02*/
 v6 = NumberToString(a1, n10, n0xA, a4); /*0xffe40d08*/
 if ( a1 < v6 ) /*0xffe40d12*/
 {
 do /*0xffe40d20*/
 {
 v7 = *v5; /*0xffe40d16*/
 *v5++ = *v6; /*0xffe40d18*/
 *v6-- = v7; /*0xffe40d1b*/
 }
 while ( v5 < v6 ); /*0xffe40d20*/
 }
 return a1; /*0xffe40d24*/
}


unsigned int AsciiStrDecimalToUintn(char *a1, char **p_Status_Code:_%X)
{
 char v2; // bl
 unsigned int n0x7FFFFFFF; // esi
 char n57; // al
 char n10; // al
 char v7; // [esp+Ch] [ebp-4h]

 v2 = 1; /*0xffe40d2d*/
 v7 = 0; /*0xffe40d31*/
 n0x7FFFFFFF = 0; /*0xffe40d35*/
 while ( *a1 == 32 || *a1 == 9 ) /*0xffe40d3f*/
 ++a1; /*0xffe40d41*/
 if ( !*a1 ) /*0xffe40d44*/
 {
 *p_Status_Code:_%X = a1; /*0xffe40d4a*/
 return 0; /*0xffe40d4e*/
 }
 if ( *a1 == 45 ) /*0xffe40d52*/
 {
 v2 = -1; /*0xffe40d54*/
 ++a1; /*0xffe40d57*/
 }
 if ( *a1 == 43 ) /*0xffe40d5b*/
 ++a1; /*0xffe40d5d*/
 while ( 1 ) /*0xffe40d64*/
 {
 n57 = *a1; /*0xffe40d64*/
 if ( *a1 >= 48 && n57 <= 57 ) /*0xffe40d6c*/
 {
 n10 = n57 - 48; /*0xffe40d6e*/
 goto LABEL_17; /*0xffe40d70*/
 }
 if ( (n57 & 0xDFu) < 0x41 || (n57 & 0xDFu) > 0x5A ) /*0xffe40d7f*/
 break; /*0xffe40d7f*/
 n10 = (n57 & 0xDF) - 55; /*0xffe40d83*/
LABEL_17:
 if ( n10 >= 10 ) /*0xffe40d8b*/
 break; /*0xffe40d8b*/
 n0x7FFFFFFF = n10 + 10 *n0x7FFFFFFF; /*0xffe40d90*/
 if ( v2 == 1 ) /*0xffe40d95*/
 {
 if ( n0x7FFFFFFF < 0x80000000 ) /*0xffe40d99*/
 goto LABEL_23; /*0xffe40d99*/
 }
 else if ( n0x7FFFFFFF <= 0x80000000 ) /*0xffe40d9f*/
 {
 goto LABEL_23; /*0xffe40d9f*/
 }
 v7 = 1; /*0xffe40da1*/
LABEL_23:
 ++a1; /*0xffe40da6*/
 }
 *p_Status_Code:_%X = a1; /*0xffe40da9*/
 if ( v7 ) /*0xffe40db0*/
 {
 n0x7FFFFFFF = 0x7FFFFFFF; /*0xffe40db2*/
 if ( v2 == -1 ) /*0xffe40dba*/
 n0x7FFFFFFF = 0x80000000; /*0xffe40dbc*/
 }
 return n0x7FFFFFFF *v2; /*0xffe40dc5*/
}


char *__thiscall AsciiStrToUpper(char *this)
{
 char *i; // eax
 char n122; // dl

 for ( i = this; *i; ++i ) /*0xffe40dca*/
 {
 n122 = *i; /*0xffe40dd1*/
 if ( *i >= 97 && n122 <= 122 ) /*0xffe40ddb*/
 *i = n122 - 32; /*0xffe40de0*/
 }
 return this; /*0xffe40dea*/
}


char *SPrintUnicodeFormat(int p_StatusText, char *Status_Code:_%X, ...)
{
 va_list va; // [esp+Ch] [ebp+Ch] BYREF

 va_start(va, Status_Code:_%X);
 return (char *)SPrintAsciiFormatWorker(p_StatusText, 0, Status_Code:_%X, va); /*0xffe40e01*/
}


char *EfiStatusToStr(int n2)
{
 unsigned int n3; // edx

 if ( !n2 ) /*0xffe40e04*/
 return "EFI_SUCCESS"; /*0xffe40e0b*/
 if ( n2 < 0 ) /*0xffe40e0c*/
 {
 n3 = n2 & 0x1FFFFFFF; /*0xffe40e42*/
 if ( (n2 & 0xA0000000) == 0xA0000000 ) /*0xffe40e4b*/
 {
 if ( n3 >= 3 ) /*0xffe40e50*/
 return 0; /*0xffe40e50*/
 // "EFI_INTERRUPT_PENDING"
 return &MEMORY[0xFFE43964][25 *n3]; /*0xffe40e55*/
 }
 else if ( (n2 & 0xC0000000) == 0xC0000000 ) /*0xffe40e64*/
 {
 if ( n3 > 2 ) /*0xffe40e69*/
 return 0; /*0xffe40e69*/
 // "ABLE_YET"
 return &MEMORY[0xFFE439A3][25 *n3]; /*0xffe40e6e*/
 }
 else
 {
 if ( n3 > 0x1E ) /*0xffe40e78*/
 return 0; /*0xffe40e78*/
 // "E_BOF"
 return &MEMORY[0xFFE439DB][25 *n3]; /*0xffe40e7d*/
 }
 }
 else if ( (n2 & 0x20000000) != 0 ) /*0xffe40e14*/
 {
 if ( (unsigned int)n2 >= 2 ) /*0xffe40e19*/
 return 0; /*0xffe40e1d*/
 // "EFI_WARN_INTERRUPT_SOURCE_PENDING"
 return &MEMORY[0xFFE4391C][35 *n2]; /*0xffe40e21*/
 }
 else
 {
 if ( (unsigned int)n2 > 4 ) /*0xffe40e2a*/
 return 0; /*0xffe40e2a*/
 return (char *)&unk_FFE4389A + 26 *n2; /*0xffe40e2f*/
 }
}



int SPrintAsciiFormat(int a1, int a2, int a3, ...)
{
 va_list va; // [esp+14h] [ebp+14h] BYREF

 va_start(va, a3);
 return SPrintAsciiFormatWorker(a3, va); /*0xffe41215*/
}


int SPrintGuidMarker(int n8, unsigned __int16 **p_i)
{
 unsigned __int16 *i; // ecx
 int n4; // eax

 if ( !p_i ) /*0xffe41219*/
 return -2147483646; /*0xffe4121b*/
 i = *p_i; /*0xffe41221*/
 if ( **p_i == 0xFFFF ) /*0xffe4122c*/
 return -2147483634; /*0xffe41241*/
 while ( 1 ) /*0xffe41232*/
 {
 i = (unsigned __int16 *)((char *)i + i[1]); /*0xffe41232*/
 n4 = *i; /*0xffe41234*/
 if ( n4 == 4 ) /*0xffe4123a*/
 break; /*0xffe4123a*/
 if ( (_WORD)n4 == 0xFFFF ) /*0xffe4123f*/
 return -2147483634; /*0xffe4123f*/
 }
 *p_i = i; /*0xffe41248*/
 return 0; /*0xffe41220*/
}


int SPrintScanGuid(int n8, unsigned __int16 **p_i)
{
 unsigned __int16 *i_1; // edi
 int v4; // eax
 int result; // eax
 int n8_2; // ecx
 int n8_1; // [esp-4h] [ebp-10h]
 unsigned __int16 *i; // [esp+8h] [ebp-4h] BYREF

 if ( !p_i ) /*0xffe41258*/
 return -2147483646; /*0xffe4128b*/
 i = *p_i; /*0xffe4125c*/
 while ( 1 ) /*0xffe4127a*/
 {
 result = SPrintGuidMarker(n8, &i); /*0xffe4127a*/
 if ( result < 0 ) /*0xffe41281*/
 break; /*0xffe41281*/
 i_1 = i; /*0xffe41261*/
 n8_1 = n8_2; /*0xffe41269*/
 v4 = StrnCmp((_BYTE *)i + 8, src); /*0xffe4126d*/
 n8 = n8_1; /*0xffe41272*/
 if ( !v4 ) /*0xffe41275*/
 {
 *p_i = i_1; /*0xffe41285*/
 return 0; /*0xffe41289*/
 }
 }
 return result; /*0xffe41290*/
}


int Udiv64Remainder(unsigned int _EDI, unsigned int *p_n0xA, int n0xA, int _EDX)
{
 int n0xA_1; // eax
 int n64; // ecx

 n0xA_1 = n0xA; /*0xffe412a5*/
 _EDX = _EDX; /*0xffe412a8*/
 _EDI = 0; /*0xffe412ae*/
 n64 = 64; /*0xffe412b0*/
 do
 {
 __asm /*0xffe412b7*/
 {
 rcl edx, 1
 rcl edi, 1
 }
 n0xA_1 = 2 *n0xA_1 + (_EDI >= _EDI); /*0xffe412c0*/
 _EDI = _EDI - (_EDI >= _EDI ? _EDI : 0);
 --n64; /*0xffe412c6*/
 }
 while ( n64 );
 if ( p_n0xA ) /*0xffe412d9*/
 *p_n0xA = _EDI; /*0xffe412de*/
 return n0xA_1; /*0xffe412d4*/
}


unsigned int TimerDelayLoop(unsigned int a1)
{
 unsigned int v1; // esi
 unsigned int n0x400000; // edi
 unsigned __int32 v3; // ebx
 unsigned int result; // eax

 v1 = a1 >> 22; /*0xffe412f7*/
 n0x400000 = a1 & 0x3FFFFF; /*0xffe412fa*/
 do /*0xffe41332*/
 {
 v3 = n0x400000 + (IoPortRead32(0x508u) & 0xFFFFFF); /*0xffe4130f*/
 n0x400000 = 0x400000; /*0xffe41311*/
 while ( ((v3 - IoPortRead32(0x508u)) & 0x800000) == 0 ) /*0xffe4132b*/
 _mm_pause(); /*0xffe41318*/
 result = v1--; /*0xffe4132d*/
 }
 while ( result ); /*0xffe41332*/
 return result; /*0xffe41334*/
}


unsigned int __thiscall TimerDelay(unsigned int n100000)
{
 unsigned __int64 v2; // rtt

 LODWORD(v2) = 3579545 *n100000; /*0xffe4136f*/
 HIDWORD(v2) = ((3579545 * (unsigned __int64)n100000) >> 32) % 0xF4240; /*0xffe4136f*/
 TimerDelayLoop(v2 / 0xF4240); /*0xffe41374*/
 return n100000; /*0xffe4137b*/
}


int ComPortGetBase()
{
 unsigned __int8 n33; // al

 __outbyte(0x72u, 0x5Cu); /*0xffe4138a*/
 n33 = __inbyte(0x73u); /*0xffe41391*/
 return n33 != 33 ? 1016 : 760;
}


int __thiscall ComPortInitialize(void *this)
{
 int result; // eax
 unsigned __int8 v2; // al
 unsigned int n115200; // ecx
 unsigned int v4; // ebx
 int Base; // eax
 unsigned __int16 Base_1; // di
 unsigned __int16 v7; // bp
 unsigned __int8 v8; // al
 unsigned __int8 v9; // cl
 unsigned __int8 v10; // al
 unsigned __int8 v11; // al
 int v12; // esi
 unsigned __int8 v13; // al
 int v14; // esi
 unsigned __int8 v15; // al
 unsigned __int8 v16; // al

 result = PciCfgInit((unsigned int)this); /*0xffe413a6*/
 if ( result >= 0 )
 {
 __outbyte(0x72u, 0x5Cu); /*0xffe413bc*/
 __inbyte(0x73u); /*0xffe413c3*/
 __outbyte(0x72u, 0x6Cu); /*0xffe413c9*/
 v2 = __inbyte(0x73u); /*0xffe413cd*/
 switch ( v2 )
 {
 case 0xA7:
 n115200 = 115200; /*0xffe413d7*/
 break;
 case 0xA6:
 n115200 = 57600; /*0xffe413df*/
 break;
 case 0xA5:
 n115200 = 38400; /*0xffe413ea*/
 break;
 case 0xA4:
 n115200 = 19200; /*0xffe413f5*/
 break;
 default:
 n115200 = v2 != 0xA3 ? 115200 : 9600;
 break;
 }
 v4 = 0x1C200 / n115200; /*0xffe41414*/
 Base = ComPortGetBase(); /*0xffe41416*/
 Base_1 = Base; /*0xffe4141b*/
 if ( Base ) /*0xffe4141f*/
 {
 v7 = Base + 3; /*0xffe41429*/
 v8 = __inbyte(Base + 3); /*0xffe4142f*/
 v9 = v8; /*0xffe41430*/
 v10 = __inbyte(Base_1 + 3); /*0xffe41432*/
 __outbyte(Base_1 + 3, v10 | 0x80); /*0xffe41435*/
 v11 = __inbyte(Base_1 + 1); /*0xffe41439*/
 v12 = v11 << 8; /*0xffe4143d*/
 v13 = __inbyte(Base_1); /*0xffe41443*/
 v14 = v13 | v12; /*0xffe41447*/
 v15 = __inbyte(Base_1 + 3); /*0xffe4144c*/
 __outbyte(Base_1 + 3, v15 & 0x7F); /*0xffe4144f*/
 if ( (((v9 & 0x3F) == 3) & (unsigned __int8)((v14 != v4) - 1)) == 0 ) /*0xffe41462*/
 {
 do /*0xffe4146f*/
 v16 = __inbyte(Base_1 + 5); /*0xffe4146a*/
 while ( (v16 & 0x60) != 0x60 ); /*0xffe4146f*/
 __outbyte(v7, 0x80u); /*0xffe41476*/
 __outbyte(Base_1 + 1, BYTE1(v4)); /*0xffe4147f*/
 __outbyte(Base_1, v4); /*0xffe41485*/
 __outbyte(v7, 3u); /*0xffe4148b*/
 __outbyte(Base_1 + 2, 0); /*0xffe41494*/
 __outbyte(Base_1 + 2, 1u); /*0xffe41497*/
 __outbyte(Base_1 + 4, 0); /*0xffe414a0*/
 }
 return 0; /*0xffe414a1*/
 }
 else
 {
 return -2147483641; /*0xffe41421*/
 }
 }
 return result; /*0xffe414a8*/
}


int ComPortPollLsrTx(char *_r_n, int n2)
{
 unsigned __int8 *_r_n_1; // ebp
 int n0xFFFF; // esi
 int Base; // eax
 unsigned __int16 Base_1; // cx
 unsigned __int16 v8; // cx
 unsigned __int8 v9; // al
 int v10; // ebx
 unsigned __int8 v11; // al
 unsigned int n0x10; // ebx
 int n2_1; // [esp+Ch] [ebp-4h]

 _r_n_1 = (unsigned __int8 *)_r_n; /*0xffe414ac*/
 n0xFFFF = 0; /*0xffe414ae*/
 if ( !_r_n ) /*0xffe414b5*/
 return 0; /*0xffe414b5*/
 Base = ComPortGetBase(); /*0xffe414bb*/
 Base_1 = Base; /*0xffe414c0*/
 if ( !Base ) /*0xffe414c4*/
 return 0; /*0xffe414b9*/
 if ( !n2 ) /*0xffe414c8*/
 {
 v8 = Base + 5; /*0xffe414ca*/
 do /*0xffe414de*/
 {
 v9 = __inbyte(v8); /*0xffe414d0*/
 if ( (v9 & 0x60) == 0x60 ) /*0xffe414d5*/
 break; /*0xffe414d5*/
 ++n0xFFFF; /*0xffe414d7*/
 }
 while ( n0xFFFF != 0xFFFF ); /*0xffe414de*/
 return 0; /*0xffe414de*/
 }
 n2_1 = n2; /*0xffe414e2*/
LABEL_10:
 v10 = 0; /*0xffe414e7*/
 while ( 1 ) /*0xffe414ef*/
 {
 v11 = __inbyte(Base_1 + 5); /*0xffe414ef*/
 if ( (v11 & 0x40) != 0 ) /*0xffe414f2*/
 break; /*0xffe414f2*/
 if ( ++v10 == 0xFFFF ) /*0xffe414fb*/
 return 0; /*0xffe414ff*/
 }
 n0x10 = 0; /*0xffe41501*/
 while ( n2 ) /*0xffe41505*/
 {
 __outbyte(Base_1, *_r_n_1); /*0xffe4150d*/
 ++n0x10; /*0xffe4150e*/
 --n2; /*0xffe4150f*/
 ++_r_n_1; /*0xffe41510*/
 if ( n0x10 >= 0x10 ) /*0xffe41514*/
 {
 if ( n2 ) /*0xffe41518*/
 goto LABEL_10; /*0xffe41518*/
 return n2_1; /*0xffe41518*/
 }
 }
 return n2_1; /*0xffe4151f*/
}


unsigned __int8 ComPortSetBaud(unsigned int n209304, unsigned int n40000)
{
 __int16 v2; // cx
 unsigned __int8 v3; // al
 unsigned __int8 v4; // al
 unsigned __int8 result; // al

 v2 = ((n209304 >> 1) + 119318200) / n209304; /*0xffe41536*/
 __outbyte(0x43u, 0x54u); /*0xffe41541*/
 __outbyte(0x41u, 0x12u); /*0xffe4154a*/
 __outbyte(0x43u, 0xB6u); /*0xffe41550*/
 __outbyte(0x42u, v2); /*0xffe41559*/
 __outbyte(0x42u, HIBYTE(v2)); /*0xffe4155f*/
 v3 = __inbyte(0x61u); /*0xffe41566*/
 __outbyte(0x61u, v3 | 3); /*0xffe41569*/
 TimerDelay(n40000); /*0xffe4156c*/
 v4 = __inbyte(0x61u); /*0xffe41574*/
 result = v4 & 0xFC; /*0xffe41575*/
 __outbyte(0x61u, result); /*0xffe41577*/
 return result; /*0xffe41578*/
}


char __thiscall ProgressDisplay10(char *_10%)
{
 int v2; // [esp-Ch] [ebp-5Ch]
 int v3; // [esp-8h] [ebp-58h]
 char v4; // [esp-4h] [ebp-54h]
 int v5[20]; // [esp+0h] [ebp-50h] BYREF

 SPrintUnicodeFormat((int)v5, "== Progress : %s ==", _10%);
 return VideoDisplayProgress(9u, 0, 7, (int)v5, v2, v3, v4, v5[0]); /*0xffe415a3*/
}


void ProgressStatusCodeHandler(int PeiServices, unsigned __int8 StatusCode)
{
 int StatusText; // [esp+8h] [ebp-50h] BYREF

 SPrintUnicodeFormat((int)&StatusText, "Status Code: %X", StatusCode);
 VideoDisplayProgress(0x18u, 0x3Eu, 7, &StatusText); /*0xffe415ce*/
 DebugPrint(64, "Status Code: %X\n", StatusCode);
 switch ( StatusCode )
 {
 case 0x11u:
 ProgressDisplay10(" 10%"); /*0xffe416b5*/
 VideoScrollBackground(0, 5u); /*0xffe416be*/
 VideoDisplayProgress(0xBu, 0, 14, "UPI initialization: Starting...");
 break;
 case 0x19u:
 ProgressDisplay10(" 20%"); /*0xffe4167d*/
 VideoScrollBackground(5u, 0xAu); /*0xffe41686*/
 VideoDisplayProgress(0xBu, 0, 7, "UPI initialization: Done ");
 VideoDisplayProgress(0xCu, 0, 14, "Basic IO initialization: Starting... ");
 break;
 case 0x2Fu:
 ProgressDisplay10(" 30%"); /*0xffe41651*/
 VideoScrollBackground(0xAu, 0xFu); /*0xffe4165a*/
 VideoDisplayProgress(0xCu, 0, 7, "Basic IO initialization: Done ");
 VideoDisplayProgress(0xDu, 0, 14, "Memory initialization: Starting... ");
 break;
 case 0x33u:
 ProgressDisplay10(" 40%"); /*0xffe41639*/
 VideoScrollBackground(0xFu, 0x14u); /*0xffe41642*/
 break;
 case 0x4Fu:
 ProgressDisplay10(" 50%"); /*0xffe4160d*/
 VideoScrollBackground(0xFu, 0x19u); /*0xffe41616*/
 VideoDisplayProgress(0xDu, 0, 7, "Memory initialization: Done ");
 VideoDisplayProgress(0xEu, 0, 14, "UEFI kernel initialization: Starting... ");
 break;
 }
}


char IoOr32()
{
 __int16 v0; // kr00_2
 unsigned int v1; // esi
 unsigned __int8 v2; // al
 char v3; // bl
 __int16 v5; // [esp+10h] [ebp-4h]

 v0 = __readeflags(); /*0xffe416e0*/
 v5 = v0; /*0xffe416e2*/
 _disable(); /*0xffe416e6*/
 v1 = IoPortRead32(0xCF8u); /*0xffe416fa*/
 IoPortWrite32(0xCF8u, 0x8000FA44); /*0xffe416fc*/
 v2 = __inbyte(0xCFCu); /*0xffe41707*/
 v3 = v2 | 0x80; /*0xffe4170a*/
 __outbyte(0xCFCu, v2 | 0x80); /*0xffe4170f*/
 IoPortWrite32(0xCF8u, v1); /*0xffe41714*/
 if ( (v5 & 0x200) != 0 ) /*0xffe41722*/
 _enable(); /*0xffe41724*/
 else
 _disable(); /*0xffe41727*/
 return v3; /*0xffe41728*/
}


int IoPortRead16(unsigned __int16 a1)
{
 int ReportStatusCodePpi; // eax
 int result; // eax

 if ( (a1 & 1) != 0 ) /*0xffe41736*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41738*/
 if ( ReportStatusCodePpi ) /*0xffe4173f*/
 (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 133, (char *)-1822456); /*0xffe41750*/
 }
 LOWORD(result) = __inword(a1); /*0xffe41759*/
 return (unsigned __int16)result; /*0xffe4175e*/
}


unsigned __int16 IoPortWrite16(unsigned __int16 a1, unsigned __int16 n1280)
{
 int ReportStatusCodePpi; // eax

 if ( (a1 & 1) != 0 ) /*0xffe4176a*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4176c*/
 if ( ReportStatusCodePpi ) /*0xffe41773*/
 (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822440, 163, (char *)-1822456); /*0xffe41784*/
 }
 __outword(a1, n1280); /*0xffe41790*/
 return n1280; /*0xffe41792*/
}


unsigned __int32 IoPortRead32(unsigned __int16 a1)
{
 int ReportStatusCodePpi; // eax

 if ( (a1 & 3) != 0 ) /*0xffe4179b*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4179d*/
 if ( ReportStatusCodePpi ) /*0xffe417a4*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417b5*/
 "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c",
 193,
 "(Port & 3) == 0");
 }
 return __indword(a1); /*0xffe417bf*/
}


unsigned int IoPortWrite32(unsigned __int16 a1, unsigned int a2)
{
 int ReportStatusCodePpi; // eax

 if ( (a1 & 3) != 0 ) /*0xffe417ca*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417cc*/
 if ( ReportStatusCodePpi ) /*0xffe417d3*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe417e4*/
 "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c",
 223,
 "(Port & 3) == 0");
 }
 __outdword(a1, a2); /*0xffe417ef*/
 return a2; /*0xffe417f0*/
}


__int16 IoPortWrite8(_WORD *a1, __int16 n1280)
{
 int ReportStatusCodePpi; // eax

 if ( ((unsigned __int8)a1 & 1) != 0 ) /*0xffe417fd*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe417ff*/
 if ( ReportStatusCodePpi ) /*0xffe41806*/
 (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822372, 183, (char *)-1822324); /*0xffe41817*/
 }
 *a1 = n1280; /*0xffe4181d*/
 return n1280; /*0xffe41823*/
}


int DebugEnabled()
{
 unsigned __int8 v0; // al
 char n3; // al
 char n3_1; // cl

 v0 = __inbyte(0x70u); /*0xffe4182c*/
 __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe41831*/
 n3 = __inbyte(0x71u); /*0xffe41838*/
 n3_1 = n3; /*0xffe41839*/
 if ( (unsigned __int8)n3 <= 3u ) /*0xffe4183e*/
 {
LABEL_4:
 if ( !n3_1 ) /*0xffe41859*/
 return 0; /*0xffe41859*/
 goto LABEL_5; /*0xffe41859*/
 }
 n3_1 = n3; /*0xffe41840*/
 if ( !n3 ) /*0xffe41848*/
 {
 n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe41854*/
 goto LABEL_4; /*0xffe41854*/
 }
LABEL_5:
 if ( n3_1 != -1 )
 return n3_1 != 1 ? -2147483578 : -2147483644;
 return 0; /*0xffe41871*/
}


bool GuidCompare(char *this, int a2)
{
 __int64 v4; // rax
 int v5; // ebp
 __int64 v6; // rax
 int v7; // edi
 __int64 v8; // kr00_8
 __int64 v9; // rax
 int v11; // [esp+10h] [ebp-Ch]
 int v12; // [esp+14h] [ebp-8h]

 v4 = GuidCopy(this); /*0xffe41880*/
 v12 = HIDWORD(v4); /*0xffe41887*/
 v5 = v4; /*0xffe4188b*/
 v6 = GuidCopy((void *)a2); /*0xffe4188d*/
 v11 = HIDWORD(v6); /*0xffe41895*/
 v7 = v6; /*0xffe41899*/
 v8 = GuidCopy(this + 8); /*0xffe418a7*/
 v9 = GuidCopy((void *)(a2 + 8)); /*0xffe418a9*/
 return v5 == v7 && v12 == v11 && v8 == v9; /*0xffe418cc*/
}


void *__thiscall PeiServicesGetTss(void *this)
{
 void *this_1; // eax

 if ( !this ) /*0xffe418da*/
 CpuDeadLoop((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, "Idtr != ((void *) 0)"); /*0xffe418e9*/
 this_1 = this; /*0xffe418ef*/
 __sidt(this); /*0xffe418f2*/
 return this_1; /*0xffe418f6*/
}


__int16 __thiscall PciReadBuffer(void *this)
{
 int ReportStatusCodePpi; // eax

 if ( !this ) /*0xffe418fc*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe418fe*/
 if ( ReportStatusCodePpi ) /*0xffe41905*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41913*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 38,
 "Buffer != ((void *) 0)");
 }
 return *(_WORD *)this; /*0xffe4191c*/
}


int __thiscall PciWriteBuffer(void *this)
{
 int ReportStatusCodePpi; // eax

 if ( !this ) /*0xffe41923*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41925*/
 if ( ReportStatusCodePpi ) /*0xffe4192c*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe4193d*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 141,
 "Buffer != ((void *) 0)");
 }
 return *(_DWORD *)this; /*0xffe41945*/
}


__int64 __thiscall GuidCopy(void *this)
{
 int ReportStatusCodePpi; // eax

 if ( !this ) /*0xffe4194c*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4194e*/
 if ( ReportStatusCodePpi ) /*0xffe41955*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41966*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 192,
 "Buffer != ((void *) 0)");
 }
 return *(_QWORD *)this; /*0xffe41971*/
}


unsigned int PciCf8Write(_WORD *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n)
{
 int ReportStatusCodePpi; // eax
 unsigned int n0xF4240; // eax

 if ( ((unsigned __int8)ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n & 1) != 0 ) /*0xffe41979*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4197b*/
 if ( ReportStatusCodePpi ) /*0xffe41982*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41993*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
 128,
 "((UINTN) String & 0x00000001) == 0");
 }
 if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe4199b*/
 return 0; /*0xffe419bd*/
 n0xF4240 = 0; /*0xffe4199f*/
 if ( *ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n ) /*0xffe419a1*/
 {
 while ( n0xF4240 < 0xF4240 ) /*0xffe419ab*/
 {
 if ( !ASSERT_%a(%d):_%a_n_Press_any_key_to_continue.__n[++n0xF4240] ) /*0xffe419ae*/
 return n0xF4240; /*0xffe419b2*/
 }
 return 1000001; /*0xffe419b6*/
 }
 return n0xF4240; /*0xffe419b4*/
}


unsigned int __thiscall PciCf8Modify(_BYTE *this)
{
 unsigned int n0xF4240; // eax

 n0xF4240 = 0; /*0xffe419c1*/
 if ( this && *this ) /*0xffe419c7*/
 {
 while ( n0xF4240 < 0xF4240 ) /*0xffe419d0*/
 {
 if ( !*(this + ++n0xF4240) ) /*0xffe419d3*/
 return n0xF4240; /*0xffe419d7*/
 }
 return 1000001; /*0xffe419da*/
 }
 return n0xF4240; /*0xffe419d9*/
}


unsigned int __thiscall VideoAsciiStrLen(_BYTE *this)
{
 _BYTE *this_1; // esi
 int ReportStatusCodePpi; // eax
 unsigned int n0xF4240; // edi
 int v4; // eax

 this_1 = this; /*0xffe419e2*/
 if ( !this ) /*0xffe419ec*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe419ee*/
 if ( ReportStatusCodePpi ) /*0xffe419f5*/
 (*(void ( **)(char *, int, char *))(ReportStatusCodePpi + 4))((char *)-1822044, 1082, (char *)-1822004); /*0xffe41a02*/
 }
 n0xF4240 = 0; /*0xffe41a08*/
 while ( *this_1 ) /*0xffe41a33*/
 {
 if ( n0xF4240 >= 0xF4240 ) /*0xffe41a12*/
 {
 v4 = LocateReportStatusCodePpi(); /*0xffe41a14*/
 if ( v4 ) /*0xffe41a1b*/
 (*(void ( **)(char *, int, char *))(v4 + 4))((char *)-1822044, 1090, (char *)-1821980); /*0xffe41a28*/
 }
 ++this_1; /*0xffe41a2e*/
 ++n0xF4240; /*0xffe41a2f*/
 }
 return n0xF4240; /*0xffe41a37*/
}


int __thiscall PciCfgInit(void *This)
{
 unsigned __int8 PlatformId; // al
 char *IoConfigTable; // esi
 int IoTableCount; // edi
 void *ConfigTable; // edx
 char *v5; // esi
 int n2; // edi
 unsigned int Index; // edi
 int PciAddr; // esi
 void *This_1; // [esp-4h] [ebp-14h]
 void *This_2; // [esp-4h] [ebp-14h]
 int Data; // [esp+Ch] [ebp-4h] BYREF

 __outbyte(0x72u, 0x5Cu); /*0xffe41a6a*/
 PlatformId = __inbyte(0x73u); /*0xffe41a71*/
 if ( PlatformId == 33 ) /*0xffe41a74*/
 {
 IoConfigTable = (char *)&unk_FFE43D6E; /*0xffe41a78*/
 IoTableCount = 3; /*0xffe41a7d*/
 do /*0xffe41a96*/
 {
 IoReadEx((int)This, *((_WORD *)IoConfigTable - 1), *IoConfigTable, *(_DWORD *)(IoConfigTable + 2)); /*0xffe41a89*/
 IoConfigTable += 8; /*0xffe41a8e*/
 This = This_1; /*0xffe41a92*/
 --IoTableCount; /*0xffe41a93*/
 }
 while ( IoTableCount ); /*0xffe41a96*/
 ConfigTable = &unk_FFE43D9C; /*0xffe41a98*/
 }
 else
 {
 v5 = (char *)&unk_FFE43D8E; /*0xffe41aa1*/
 n2 = 2; /*0xffe41aa6*/
 do /*0xffe41abf*/
 {
 IoReadEx((int)This, *((_WORD *)v5 - 1), *v5, *(_DWORD *)(v5 + 2)); /*0xffe41ab2*/
 v5 += 8; /*0xffe41ab7*/
 This = This_2; /*0xffe41abb*/
 --n2; /*0xffe41abc*/
 }
 while ( n2 ); /*0xffe41abf*/
 ConfigTable = &unk_FFE43D3C; /*0xffe41ac1*/
 }
 CopyMemWrapper((int)This, (int)ConfigTable); /*0xffe41ac7*/
 for ( Index = 0; Index < 18; Index += 3 ) /*0xffe41acf*/
 {
 PciAddr = (unsigned __int8)byte_FFE43DCC[Index *4] | 0x1E6E2000; /*0xffe41adc*/
 PciCfgAddrWrite(PciAddr, &Data); /*0xffe41ae4*/
 Data = dword_FFE43DD4[Index] | Data & dword_FFE43DD0[Index]; /*0xffe41afb*/
 PciCfgWriteVerify(PciAddr, Data); /*0xffe41aff*/
 }
 return 0; /*0xffe41b0c*/
}


char PciCfgAddrWrite(int Address, int *DataOut)
{
 unsigned __int8 ConfigByte; // al
 unsigned __int8 ConfigByte2; // al
 unsigned __int8 DataByte0; // al
 unsigned __int8 DataByte0_1; // ah
 unsigned __int8 DataByte1; // al
 unsigned __int8 DataByte1_1; // cl
 unsigned __int8 DataByte2; // al
 unsigned __int8 DataByte2_1; // bl
 unsigned __int8 DataByte3; // al

 __outbyte(0x2Eu, 0xA5u); /*0xffe41b22*/
 __outbyte(0x2Eu, 0xA5u); /*0xffe41b23*/
 __outbyte(0x2Eu, 7u); /*0xffe41b26*/
 __outbyte(0x2Fu, 0xDu); /*0xffe41b2f*/
 __outbyte(0x2Eu, 0x30u); /*0xffe41b35*/
 ConfigByte = __inbyte(0x2Fu); /*0xffe41b39*/
 __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41b3c*/
 __outbyte(0x2Eu, 0xF0u); /*0xffe41b42*/
 __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41b4b*/
 __outbyte(0x2Eu, 0xF1u); /*0xffe41b51*/
 __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41b5a*/
 __outbyte(0x2Eu, 0xF2u); /*0xffe41b60*/
 __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41b69*/
 __outbyte(0x2Eu, 0xF3u); /*0xffe41b6f*/
 __outbyte(0x2Fu, Address); /*0xffe41b75*/
 __outbyte(0x2Eu, 0xF8u); /*0xffe41b7b*/
 ConfigByte2 = __inbyte(0x2Fu); /*0xffe41b7f*/
 __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41b84*/
 __outbyte(0x2Eu, 0xFEu); /*0xffe41b8a*/
 __inbyte(0x2Fu); /*0xffe41b8e*/
 __outbyte(0x2Eu, 0xF4u); /*0xffe41b94*/
 DataByte0 = __inbyte(0x2Fu); /*0xffe41b98*/
 DataByte0_1 = DataByte0; /*0xffe41b99*/
 __outbyte(0x2Eu, 0xF5u); /*0xffe41ba0*/
 DataByte1 = __inbyte(0x2Fu); /*0xffe41ba4*/
 DataByte1_1 = DataByte1; /*0xffe41ba5*/
 __outbyte(0x2Eu, 0xF6u); /*0xffe41bac*/
 DataByte2 = __inbyte(0x2Fu); /*0xffe41bb0*/
 DataByte2_1 = DataByte2; /*0xffe41bb1*/
 __outbyte(0x2Eu, 0xF7u); /*0xffe41bb8*/
 DataByte3 = __inbyte(0x2Fu); /*0xffe41bbc*/
 *DataOut = DataByte3 | ((DataByte2_1 | ((DataByte1_1 | (DataByte0_1 << 8)) << 8)) << 8); /*0xffe41bd8*/
 __outbyte(0x2Eu, 0xAAu); /*0xffe41bdf*/
 return -86; /*0xffe41be0*/
}


char PciCfgWriteVerify(int Address, int Data)
{
 unsigned __int8 ConfigByte; // al
 unsigned __int8 ConfigByte2; // al

 __outbyte(0x2Eu, 0xA5u); /*0xffe41bf2*/
 __outbyte(0x2Eu, 0xA5u); /*0xffe41bf3*/
 __outbyte(0x2Eu, 7u); /*0xffe41bf6*/
 __outbyte(0x2Fu, 0xDu); /*0xffe41bff*/
 __outbyte(0x2Eu, 0x30u); /*0xffe41c05*/
 ConfigByte = __inbyte(0x2Fu); /*0xffe41c09*/
 __outbyte(0x2Fu, ConfigByte | 1); /*0xffe41c0c*/
 __outbyte(0x2Eu, 0xF0u); /*0xffe41c12*/
 __outbyte(0x2Fu, HIBYTE(Address)); /*0xffe41c1b*/
 __outbyte(0x2Eu, 0xF1u); /*0xffe41c21*/
 __outbyte(0x2Fu, BYTE2(Address)); /*0xffe41c2a*/
 __outbyte(0x2Eu, 0xF2u); /*0xffe41c30*/
 __outbyte(0x2Fu, BYTE1(Address)); /*0xffe41c39*/
 __outbyte(0x2Eu, 0xF3u); /*0xffe41c3f*/
 __outbyte(0x2Fu, Address); /*0xffe41c45*/
 __outbyte(0x2Eu, 0xF4u); /*0xffe41c4b*/
 __outbyte(0x2Fu, HIBYTE(Data)); /*0xffe41c54*/
 __outbyte(0x2Eu, 0xF5u); /*0xffe41c5a*/
 __outbyte(0x2Fu, BYTE2(Data)); /*0xffe41c63*/
 __outbyte(0x2Eu, 0xF6u); /*0xffe41c69*/
 __outbyte(0x2Fu, BYTE1(Data)); /*0xffe41c72*/
 __outbyte(0x2Eu, 0xF7u); /*0xffe41c78*/
 __outbyte(0x2Fu, Data); /*0xffe41c7e*/
 __outbyte(0x2Eu, 0xF8u); /*0xffe41c84*/
 ConfigByte2 = __inbyte(0x2Fu); /*0xffe41c88*/
 __outbyte(0x2Fu, ConfigByte2 & 0xFC | 2); /*0xffe41c8d*/
 __outbyte(0x2Eu, 0xFEu); /*0xffe41c93*/
 __outbyte(0x2Fu, 0xCFu); /*0xffe41c99*/
 __outbyte(0x2Eu, 0xAAu); /*0xffe41c9f*/
 return -86; /*0xffe41ca0*/
}


void VideoScrollBackground(unsigned __int8 StartRow, unsigned __int8 StartRow_1)
{
 int FbSize; // edi
 int FbBase; // esi
 _WORD *FbInfo; // eax
 int RowOffset; // edx
 int WidthPixels; // ebx
 int CurrentPtr; // edx
 int LineDistance; // ecx
 int NextLineBase; // ebp
 int RowCount; // eax
 unsigned int WidthPixels_3; // esi
 unsigned int WidthPixels_2; // eax
 int PixelPtr; // ecx
 int FbDelta; // ebx
 int WidthPixels_1; // [esp+8h] [ebp-Ch]
 int n68; // [esp+Ch] [ebp-8h]
 int LineDistance_1; // [esp+10h] [ebp-4h]

 FbSize = 0; /*0xffe41cad*/
 if ( StartRow <= StartRow_1 ) /*0xffe41cb1*/
 {
 FbBase = -1879048192; /*0xffe41cbe*/
 FbInfo = FindGuidInPpiList(byte_FFE4355C); /*0xffe41cc3*/
 if ( FbInfo && *((_BYTE *)FbInfo + 24) && (*((_DWORD *)FbInfo + 14) || *((_DWORD *)FbInfo + 15)) ) /*0xffe41cd7*/
 {
 FbSize = *((_DWORD *)FbInfo + 14); /*0xffe41cdc*/
 FbBase = *((_DWORD *)FbInfo + 10); /*0xffe41cdf*/
 }
 RowOffset = 12 *StartRow; /*0xffe41ce5*/
 WidthPixels = 3 * (StartRow_1 - StartRow + 1); /*0xffe41cf0*/
 CurrentPtr = FbBase + RowOffset + 690728; /*0xffe41cf9*/
 LineDistance = FbSize - FbBase; /*0xffe41cfb*/
 LineDistance_1 = FbSize - FbBase; /*0xffe41cff*/
 NextLineBase = FbSize - FbBase; /*0xffe41d03*/
 RowCount = 68; /*0xffe41d07*/
 WidthPixels_1 = WidthPixels; /*0xffe41d08*/
 n68 = 68; /*0xffe41d0c*/
 do /*0xffe41d7c*/
 {
 if ( FbSize ) /*0xffe41d12*/
 NextLineBase = LineDistance + CurrentPtr; /*0xffe41d14*/
 WidthPixels_3 = 0; /*0xffe41d17*/
 if ( WidthPixels ) /*0xffe41d1b*/
 {
 WidthPixels_2 = WidthPixels_1; /*0xffe41d1d*/
 PixelPtr = CurrentPtr + 1; /*0xffe41d21*/
 FbDelta = NextLineBase - CurrentPtr; /*0xffe41d26*/
 do /*0xffe41d61*/
 {
 if ( *(_BYTE *)(PixelPtr + 1) > 0x91u && *(_BYTE *)PixelPtr > 0x91u && *(_BYTE *)(PixelPtr - 1) > 0x91u ) /*0xffe41d37*/
 {
 *(_WORD *)PixelPtr = -13120; /*0xffe41d39*/
 *(_BYTE *)(PixelPtr - 1) = 10; /*0xffe41d3e*/
 if ( FbSize ) /*0xffe41d44*/
 {
 *(_BYTE *)(FbDelta + PixelPtr + 1) = -52; /*0xffe41d46*/
 *(_BYTE *)(FbDelta + PixelPtr) = *(_BYTE *)PixelPtr; /*0xffe41d4d*/
 *(_BYTE *)(NextLineBase + 4 *WidthPixels_3) = *(_BYTE *)(PixelPtr - 1); /*0xffe41d53*/
 WidthPixels_2 = WidthPixels_1; /*0xffe41d57*/
 }
 }
 ++WidthPixels_3; /*0xffe41d5b*/
 PixelPtr += 4; /*0xffe41d5c*/
 }
 while ( WidthPixels_3 < WidthPixels_2 ); /*0xffe41d61*/
 RowCount = n68; /*0xffe41d63*/
 WidthPixels = WidthPixels_1; /*0xffe41d67*/
 LineDistance = LineDistance_1; /*0xffe41d6b*/
 }
 CurrentPtr += 4096; /*0xffe41d6f*/
 n68 = --RowCount; /*0xffe41d78*/
 }
 while ( RowCount ); /*0xffe41d7c*/
 }
}


char VideoDisplayProgress(unsigned __int8 a1, unsigned __int8 a2, char a3, _BYTE *a4)
{
 unsigned int i_1; // ebp
 _BYTE *v7; // esi
 char n32; // al
 unsigned int i; // ecx

 i_1 = VideoAsciiStrLen(a4); /*0xffe41d9c*/
 v7 = (_BYTE *)(2 * (a2 + 80 *a1) + 753664); /*0xffe41da6*/
 n32 = 32; /*0xffe41dad*/
 __outbyte(0x3D4u, 0xAu); /*0xffe41db7*/
 __outbyte(0x3D5u, 0x20u); /*0xffe41dbf*/
 for ( i = 0; i < i_1; *(v7 - 1) = a3 ) /*0xffe41dc4*/
 {
 n32 = a4[i++]; /*0xffe41dca*/
 *v7 = n32; /*0xffe41dce*/
 v7 += 2; /*0xffe41dd0*/
 }
 return n32; /*0xffe41dda*/
}


unsigned __int8 __thiscall MmioRead32(unsigned int n1024068)
{
 int ReportStatusCodePpi; // eax
 __int16 v3; // kr00_2
 unsigned int v4; // esi
 unsigned __int8 v5; // al
 unsigned __int8 v6; // bl
 __int16 v8; // [esp+10h] [ebp-4h]

 if ( (n1024068 & 0xF0000F00) != 0 ) /*0xffe41dec*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41dee*/
 if ( ReportStatusCodePpi ) /*0xffe41df5*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e03*/
 "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c",
 121,
 "((Address) & (~0xffff0ff | (0))) == 0");
 }
 v3 = __readeflags(); /*0xffe41e09*/
 v8 = v3; /*0xffe41e0b*/
 _disable(); /*0xffe41e0f*/
 v4 = IoPortRead32(0xCF8u); /*0xffe41e2f*/
 IoPortWrite32(0xCF8u, n1024068 & 0xFC | (n1024068 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41e3b*/
 v5 = __inbyte((n1024068 & 3) + 3324); /*0xffe41e49*/
 v6 = v5; /*0xffe41e4a*/
 IoPortWrite32(0xCF8u, v4); /*0xffe41e50*/
 if ( (v8 & 0x200) != 0 ) /*0xffe41e5e*/
 _enable(); /*0xffe41e60*/
 else
 _disable(); /*0xffe41e63*/
 return v6; /*0xffe41e64*/
}


__int16 __thiscall MmioRead16(unsigned int n1015936)
{
 int ReportStatusCodePpi; // eax
 __int16 v3; // kr00_2
 unsigned int v4; // esi
 __int16 v5; // di
 __int16 v7; // [esp+Ch] [ebp-4h]

 if ( (n1015936 & 0xF0000F01) != 0 ) /*0xffe41e7b*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41e7d*/
 if ( ReportStatusCodePpi ) /*0xffe41e84*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41e95*/
 "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c",
 613,
 "((Address) & (~0xffff0ff | (1))) == 0");
 }
 v3 = __readeflags(); /*0xffe41e9b*/
 v7 = v3; /*0xffe41e9d*/
 _disable(); /*0xffe41ea0*/
 v4 = IoPortRead32(0xCF8u); /*0xffe41ec0*/
 IoPortWrite32(0xCF8u, n1015936 & 0xFC | (n1015936 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ecc*/
 v5 = IoPortRead16((n1015936 & 2) + 3324); /*0xffe41ee1*/
 IoPortWrite32(0xCF8u, v4); /*0xffe41ee6*/
 if ( (v7 & 0x200) != 0 ) /*0xffe41ef3*/
 _enable(); /*0xffe41ef5*/
 else
 _disable(); /*0xffe41ef8*/
 return v5; /*0xffe41efc*/
}


unsigned __int16 MmioWrite32(unsigned int n1024064, unsigned __int16 n1280)
{
 int ReportStatusCodePpi; // eax
 __int16 v5; // kr00_2
 unsigned int v6; // esi
 unsigned __int16 v7; // di
 __int16 v9; // [esp+10h] [ebp-4h]

 if ( (n1024064 & 0xF0000F01) != 0 ) /*0xffe41f12*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41f14*/
 if ( ReportStatusCodePpi ) /*0xffe41f1b*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41f2c*/
 "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c",
 652,
 "((Address) & (~0xffff0ff | (1))) == 0");
 }
 v5 = __readeflags(); /*0xffe41f32*/
 v9 = v5; /*0xffe41f34*/
 _disable(); /*0xffe41f38*/
 v6 = IoPortRead32(0xCF8u); /*0xffe41f58*/
 IoPortWrite32(0xCF8u, n1024064 & 0xFC | (n1024064 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41f64*/
 v7 = IoPortWrite16((n1024064 & 2) + 3324, n1280); /*0xffe41f7b*/
 IoPortWrite32(0xCF8u, v6); /*0xffe41f80*/
 if ( (v9 & 0x200) != 0 ) /*0xffe41f8e*/
 _enable(); /*0xffe41f90*/
 else
 _disable(); /*0xffe41f93*/
 return v7; /*0xffe41f97*/
}


unsigned __int32 IoRead32(unsigned int a1)
{
 int ReportStatusCodePpi; // eax
 __int16 v3; // kr00_2
 unsigned int v4; // esi
 unsigned __int32 v5; // edi
 __int16 v7; // [esp+Ch] [ebp-4h]

 if ( (a1 & 0xF0000F03) != 0 ) /*0xffe41fac*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe41fae*/
 if ( ReportStatusCodePpi ) /*0xffe41fb5*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe41fc6*/
 "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c",
 1114,
 "((Address) & (~0xffff0ff | (3))) == 0");
 }
 v3 = __readeflags(); /*0xffe41fcc*/
 v7 = v3; /*0xffe41fce*/
 _disable(); /*0xffe41fd1*/
 v4 = IoPortRead32(0xCF8u); /*0xffe41ff1*/
 IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe41ffb*/
 v5 = IoPortRead32(0xCFCu); /*0xffe4200c*/
 IoPortWrite32(0xCF8u, v4); /*0xffe4200e*/
 if ( (v7 & 0x200) != 0 ) /*0xffe4201b*/
 _enable(); /*0xffe4201d*/
 else
 _disable(); /*0xffe42020*/
 return v5; /*0xffe42023*/
}


unsigned int IoAnd32(unsigned int a1, unsigned int OrMask)
{
 int ReportStatusCodePpi; // eax
 __int16 v5; // kr00_2
 unsigned int v6; // esi
 unsigned int v7; // edi
 __int16 v9; // [esp+10h] [ebp-4h]

 if ( (a1 & 0xF0000F03) != 0 ) /*0xffe42039*/
 {
 ReportStatusCodePpi = LocateReportStatusCodePpi(); /*0xffe4203b*/
 if ( ReportStatusCodePpi ) /*0xffe42042*/
 (*(void ( **)(const char *, int, const char *))(ReportStatusCodePpi + 4))( /*0xffe42053*/
 "e:\\hs\\MdePkg\\Library\\BasePciCf8Lib\\PciCf8Lib.c",
 1153,
 "((Address) & (~0xffff0ff | (3))) == 0");
 }
 v5 = __readeflags(); /*0xffe42059*/
 v9 = v5; /*0xffe4205b*/
 _disable(); /*0xffe4205f*/
 v6 = IoPortRead32(0xCF8u); /*0xffe4207f*/
 IoPortWrite32(0xCF8u, a1 & 0xFC | (a1 >> 4) & 0xFFFF00 | 0x80000000); /*0xffe42089*/
 v7 = IoPortWrite32(0xCFCu, OrMask); /*0xffe4209c*/
 IoPortWrite32(0xCF8u, v6); /*0xffe4209e*/
 if ( (v9 & 0x200) != 0 ) /*0xffe420ac*/
 _enable(); /*0xffe420ae*/
 else
 _disable(); /*0xffe420b1*/
 return v7; /*0xffe420b4*/
}


int IoOr32Ex(int PciHandle, __int16 RegMask)
{
 unsigned __int8 ShiftCount; // bl
 unsigned __int16 SlotIndex; // di
 __int16 SlotValue; // ax
 unsigned __int16 Temp; // cx
 unsigned __int8 BitCount; // al
 unsigned __int16 n4; // cx
 unsigned int OrMask; // esi

 ShiftCount = 0; /*0xffe420c7*/
 for ( SlotIndex = 0; SlotIndex < 4u; ++SlotIndex ) /*0xffe420c9*/
 {
 SlotValue = IoRead32(4 *SlotIndex + 1015940); /*0xffe420d6*/
 if ( (SlotValue & 1) == 0 ) /*0xffe420dd*/
 break; /*0xffe420dd*/
 if ( (SlotValue & 0xFFFC) == RegMask ) /*0xffe420e7*/
 break; /*0xffe420e7*/
 }
 if ( SlotIndex == 4 ) /*0xffe420f2*/
 return -2147483639; /*0xffe420f4*/
 Temp = 4; /*0xffe42102*/
 BitCount = 0; /*0xffe42105*/
 do /*0xffe42114*/
 {
 Temp >>= 1; /*0xffe42107*/
 ++BitCount; /*0xffe4210a*/
 }
 while ( (Temp & 1) == 0 ); /*0xffe42114*/
 n4 = 4; /*0xffe4211a*/
 do /*0xffe42122*/
 {
 ++ShiftCount; /*0xffe4211d*/
 n4 >>= 1; /*0xffe4211f*/
 }
 while ( n4 ); /*0xffe42122*/
 if ( BitCount == ShiftCount - 1 ) /*0xffe4212d*/
 --ShiftCount; /*0xffe4212f*/
 OrMask = ((((1 << ShiftCount) - 1) & 0xFFFC) << 16) | (unsigned __int16)(RegMask & ~((1 << ShiftCount) - 1)) | 1; /*0xffe4215c*/
 IoAnd32(4 *SlotIndex + 1015940, OrMask); /*0xffe42168*/
 *(_DWORD *)((unsigned __int16)(4 *SlotIndex + 10032) | 0xFDEF0000) = OrMask; /*0xffe4217c*/
 return 0; /*0xffe42180*/
}


int IoReadEx(int PciHandle, __int16 Register, char SubFunction, int Width)
{
 __int16 MaskLow; // bx
 __int16 MaskHigh; // bp
 __int16 WidthMask; // si
 __int16 DefaultValue; // di
 unsigned __int8 Index; // cl
 __int16 SearchReg; // ax
 __int16 MaskLow_2; // ax
 unsigned __int8 MaskLow_1; // cl
 __int16 n1016; // ax
 unsigned __int8 v14; // cl
 __int16 n1008; // ax
 __int16 AccessWidth; // [esp-4h] [ebp-40h]
 int n57672688; // [esp+14h] [ebp-28h]
 __int16 v18; // [esp+18h] [ebp-24h]
 _DWORD v19[2]; // [esp+1Ch] [ebp-20h]
 _DWORD v20[5]; // [esp+24h] [ebp-18h]
 __int16 v21; // [esp+38h] [ebp-4h]
 __int16 n5; // [esp+44h] [ebp+8h]
 __int16 ConfigLow; // [esp+44h] [ebp+8h]

 v20[0] = 49808376; /*0xffe4218e*/
 v21 = 0; /*0xffe42198*/
 MaskLow = 0; /*0xffe4219d*/
 v18 = 0; /*0xffe4219f*/
 MaskHigh = -1; /*0xffe421a4*/
 WidthMask = 0; /*0xffe421ad*/
 v20[1] = 36176416; /*0xffe421af*/
 v20[2] = 48759352; /*0xffe421b7*/
 v20[3] = 65536824; /*0xffe421bf*/
 v20[4] = 48235248; /*0xffe421c7*/
 v19[0] = 41419640; /*0xffe421cf*/
 v19[1] = 956; /*0xffe421d7*/
 n57672688 = 57672688; /*0xffe421df*/
 DefaultValue = -1; /*0xffe421e8*/
 if ( Width == 1 ) /*0xffe421ed*/
 {
 if ( !Register ) /*0xffe42378*/
 {
 DefaultValue = -9; /*0xffe4237a*/
 goto LABEL_47; /*0xffe4237f*/
 }
 v14 = 0; /*0xffe42381*/
 n1008 = 1008; /*0xffe42383*/
 do /*0xffe4239a*/
 {
 if ( n1008 == Register ) /*0xffe4238b*/
 break; /*0xffe4238b*/
 n1008 = *((_WORD *)&n57672688 + ++v14); /*0xffe42392*/
 }
 while ( n1008 ); /*0xffe4239a*/
 if ( !*((_WORD *)&n57672688 + v14) ) /*0xffe423a4*/
 return -2147483645; /*0xffe423a4*/
 MaskHigh = -4097; /*0xffe423ad*/
 AccessWidth = 8; /*0xffe423b2*/
 MaskLow_2 = v14 << 12; /*0xffe423b4*/
 goto LABEL_46; /*0xffe423b4*/
 }
 if ( Width <= 1 ) /*0xffe421f3*/
 return -2147483645; /*0xffe421f3*/
 if ( Width <= 5 )
 {
 DefaultValue = Register == 0 ? -1025 : -1;
 WidthMask = Register != 0 ? 0x400 : 0;
 goto LABEL_47; /*0xffe42373*/
 }
 switch ( Width ) /*0xffe42205*/
 {
 case 6: /*0xffe42205*/
 if ( !Register ) /*0xffe422eb*/
 {
 DefaultValue = (SubFunction == 0) - 3; /*0xffe422fb*/
 goto LABEL_47; /*0xffe422fe*/
 }
 MaskLow_1 = 0; /*0xffe42303*/
 n1016 = 1016; /*0xffe42305*/
 do /*0xffe4231c*/
 {
 if ( n1016 == Register ) /*0xffe4230d*/
 break; /*0xffe4230d*/
 n1016 = *((_WORD *)v20 + ++MaskLow_1); /*0xffe42314*/
 }
 while ( n1016 ); /*0xffe4231c*/
 if ( !*((_WORD *)v20 + MaskLow_1) ) /*0xffe42326*/
 return -2147483645; /*0xffe42326*/
 if ( !SubFunction ) /*0xffe42330*/
 {
 MaskLow = MaskLow_1; /*0xffe42344*/
 WidthMask = 1; /*0xffe42347*/
 MaskHigh = -8; /*0xffe42348*/
 goto LABEL_47; /*0xffe4234d*/
 }
 MaskHigh = -113; /*0xffe42335*/
 AccessWidth = 2; /*0xffe4233a*/
 MaskLow_2 = 16 *MaskLow_1; /*0xffe4233c*/
 goto LABEL_46; /*0xffe42340*/
 case 7: /*0xffe42205*/
 if ( !Register ) /*0xffe422a4*/
 {
 DefaultValue = -5; /*0xffe422a6*/
 goto LABEL_47; /*0xffe422ab*/
 }
 Index = 0; /*0xffe422b0*/
 SearchReg = 888; /*0xffe422b2*/
 do /*0xffe422c9*/
 {
 if ( SearchReg == Register ) /*0xffe422ba*/
 break; /*0xffe422ba*/
 SearchReg = *((_WORD *)v19 + ++Index); /*0xffe422c1*/
 }
 while ( SearchReg ); /*0xffe422c9*/
 if ( !*((_WORD *)v19 + Index) ) /*0xffe422d3*/
 return -2147483645; /*0xffe422d3*/
 MaskHigh = -769; /*0xffe422d8*/
 AccessWidth = 4; /*0xffe422dd*/
 MaskLow_2 = Index << 8; /*0xffe422df*/
LABEL_46:
 WidthMask = AccessWidth; /*0xffe423b8*/
 MaskLow = MaskLow_2; /*0xffe423b9*/
 goto LABEL_47; /*0xffe423b9*/
 case 8: /*0xffe42205*/
 if ( !Register ) /*0xffe42266*/
 {
 DefaultValue = -769; /*0xffe42268*/
 goto LABEL_47; /*0xffe4226d*/
 }
 WidthMask = 512; /*0xffe42272*/
 if ( Register == 512 ) /*0xffe4227a*/
 {
 WidthMask = 256; /*0xffe4227c*/
 goto LABEL_47; /*0xffe42281*/
 }
 if ( Register == 520 ) /*0xffe4228e*/
 goto LABEL_47; /*0xffe4228e*/
 return -2147483645; /*0xffe4228e*/
 }
 if ( Width != 255 ) /*0xffe4221e*/
 return -2147483645; /*0xffe4221e*/
 if ( Register != 46 ) /*0xffe42224*/
 {
 if ( Register == 78 ) /*0xffe42234*/
 {
 WidthMask = 0x2000; /*0xffe42236*/
 goto LABEL_47; /*0xffe4223b*/
 }
 if ( Register == 98 ) /*0xffe42244*/
 {
 WidthMask = 2048; /*0xffe42246*/
 goto LABEL_47; /*0xffe4224b*/
 }
 if ( Register ) /*0xffe42253*/
 {
 IoOr32Ex(PciHandle, Register); /*0xffe42257*/
 goto LABEL_47; /*0xffe4225e*/
 }
 return -2147483645; /*0xffe422a0*/
 }
 WidthMask = 4096; /*0xffe42226*/
LABEL_47:
 n5 = MaskLow | MaskHigh & MmioRead16(0xF8080u); /*0xffe423bc*/
 MmioWrite32(0xF8080u, n5); /*0xffe423d9*/
 IoPortWrite8((_WORD *)0xFDEF2770, n5); /*0xffe423e7*/
 ConfigLow = WidthMask | DefaultValue & MmioRead16(0xF8082u); /*0xffe42404*/
 MmioWrite32(0xF8082u, ConfigLow); /*0xffe42408*/
 IoPortWrite8((_WORD *)0xFDEF2774, ConfigLow); /*0xffe42416*/
 return 0; /*0xffe42299*/
}


unsigned __int8 CopyMemWrapper(int This, int ConfigTable)
{
 unsigned __int8 *v2; // esi
 int n11; // edi
 unsigned __int8 v4; // bl
 unsigned __int8 v5; // al
 unsigned __int8 result; // al

 v2 = (unsigned __int8 *)(ConfigTable + 3); /*0xffe42427*/
 n11 = 11; /*0xffe4242a*/
 do /*0xffe4244e*/
 {
 if ( *(v2 - 1) ) /*0xffe4242b*/
 {
 v5 = __inbyte(*(_WORD *)(v2 - 3)); /*0xffe42439*/
 v4 = *v2 | v5 & *(v2 - 1); /*0xffe4243f*/
 }
 else
 {
 v4 = *v2; /*0xffe42431*/
 }
 result = v4; /*0xffe42445*/
 __outbyte(*(_WORD *)(v2 - 3), v4); /*0xffe42447*/
 v2 += 4; /*0xffe42448*/
 --n11; /*0xffe4244b*/
 }
 while ( n11 ); /*0xffe4244e*/
 return result; /*0xffe42450*/
}


_BYTE *__usercall SetMemWrapper@<eax>(int value@<eax>, _BYTE *buf, char a3, unsigned int n255)
{
 unsigned int n255_1; // ecx
 _BYTE *buf_1; // edi
 __int16 value_1; // bx
 int value_2; // eax
 int v8; // edx
 char n255_2; // dl
 unsigned int count; // ecx

 n255_1 = n255; /*0xffe4245c*/
 LOBYTE(value) = a3; /*0xffe42460*/
 buf_1 = buf; /*0xffe4246f*/
 BYTE1(value) = a3; /*0xffe42478*/
 value_1 = value; /*0xffe4247a*/
 value_2 = value << 16; /*0xffe4247d*/
 LOWORD(value_2) = value_1; /*0xffe42480*/
 if ( n255 >= 4 ) /*0xffe42486*/
 {
 v8 = (unsigned __int8)buf & 3; /*0xffe4248a*/
 if ( ((unsigned __int8)buf & 3) != 0 ) /*0xffe4248d*/
 {
 memset(buf, value_1, 4 - v8); /*0xffe42498*/
 buf_1 = &buf[4 - v8]; /*0xffe42498*/
 n255_1 = n255 - (4 - v8); /*0xffe4249a*/
 }
 n255_2 = n255_1; /*0xffe4249c*/
 count = n255_1 >> 2; /*0xffe4249e*/
 memset32(buf_1, value_2, count); /*0xffe424a1*/
 buf_1 += 4 *count; /*0xffe424a1*/
 n255_1 = n255_2 & 3; /*0xffe424a6*/
 }
 memset(buf_1, value_1, n255_1); /*0xffe424a8*/
 return buf; /*0xffe424ad*/
}


unsigned int ZeroMem(unsigned int dst, char *src, unsigned int n16)
{
 char *src_1; // esi
 unsigned int dst_1; // edi
 unsigned int n16_1; // ecx
 char v10; // dl
 char *n4; // eax
 unsigned int count; // eax
 int count_1; // ebx
 char n16_2; // al
 unsigned int v15; // ecx
 int n16_3; // eax

 __asm { pushfw } /*0xffe424c2*/
 src_1 = src; /*0xffe424c7*/
 dst_1 = dst; /*0xffe424ca*/
 n16_1 = n16; /*0xffe424cd*/
 v10 = 0; /*0xffe424d0*/
 n4 = &src[-dst]; /*0xffe424d4*/
 if ( (unsigned int)src < dst ) /*0xffe424d6*/
 {
 n4 = (char *)(dst - (_DWORD)src); /*0xffe424db*/
 if ( (unsigned int)&src[n16] >= dst ) /*0xffe424df*/
 {
 src_1 = &src[n16]; /*0xffe424e1*/
 dst_1 = n16 + dst; /*0xffe424e3*/
 v10 = 1; /*0xffe424e6*/
 }
 }
 if ( n16 < 4 || (unsigned int)n4 < 4 ) /*0xffe424f1*/
 goto LABEL_19; /*0xffe424f1*/
 count = (unsigned __int8)src_1 & 3; /*0xffe424f7*/
 count_1 = dst_1 & 3; /*0xffe424fa*/
 if ( v10 ) /*0xffe424ff*/
 {
 --src_1; /*0xffe42501*/
 --dst_1; /*0xffe42502*/
 }
 if ( count == count_1 && count ) /*0xffe42509*/
 {
 if ( !v10 ) /*0xffe4250d*/
 count = 4 - count; /*0xffe42511*/
 qmemcpy((void *)dst_1, src_1, count); /*0xffe42517*/
 src_1 += count; /*0xffe42517*/
 dst_1 += count; /*0xffe42517*/
 n16_1 = n16 - count; /*0xffe42519*/
 }
 if ( v10 ) /*0xffe4251d*/
 {
 src_1 -= 3; /*0xffe4251f*/
 dst_1 -= 3; /*0xffe42522*/
 }
 n16_2 = n16_1; /*0xffe42525*/
 v15 = n16_1 >> 2; /*0xffe42527*/
 qmemcpy((void *)dst_1, src_1, 4 *v15); /*0xffe4252a*/
 src_1 += 4 *v15; /*0xffe4252a*/
 dst_1 += 4 *v15; /*0xffe4252a*/
 n16_3 = n16_2 & 3; /*0xffe4252c*/
 if ( n16_3 ) /*0xffe4252f*/
 {
 if ( v10 ) /*0xffe42533*/
 {
 src_1 += 4; /*0xffe42535*/
 dst_1 += 4; /*0xffe42538*/
 }
 n16_1 = n16_3; /*0xffe4253b*/
LABEL_19:
 if ( v10 ) /*0xffe4253f*/
 {
 --src_1; /*0xffe42541*/
 --dst_1; /*0xffe42542*/
 }
 qmemcpy((void *)dst_1, src_1, n16_1); /*0xffe42543*/
 }
 __asm { popfw } /*0xffe42545*/
 return dst; /*0xffe42548*/
}
