Newer
Older
AMI-Aptio-BIOS-Reversed / CmosPei / CmosPei.c
@Ajax Dong Ajax Dong 2 days ago 51 KB Init
/*
 *CmosPei - Decompiled CmosPei
 *Source: Auto-generated from IDA Pro decompilation
 *
 *Decompiled from port 13404
 */

#include "CmosPei.h"

/*
 *SetMem at 0xffe6427c
 */
void *SetMem(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffe64289*/
 return buf; /*0xffe6428f*/
}

/*
 *CopyMem at 0xffe642bc
 */
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; /*0xffe642c6*/
 if ( src < dst && &src[count - 1] >= dst ) /*0xffe642d4*/
 {
 src_1 = &src[count - 1]; /*0xffe642e8*/
 dst_1 = &dst[count - 1]; /*0xffe642ea*/
 }
 else
 {
 count_1 = count & 3; /*0xffe642d8*/
 qmemcpy(dst, src, 4 * (count >> 2)); /*0xffe642e1*/
 src_1 = &src[4 * (count >> 2)]; /*0xffe642e1*/
 dst_1 = &dst[4 * (count >> 2)]; /*0xffe642e1*/
 }
 qmemcpy(dst_1, src_1, count_1); /*0xffe642f1*/
 return dst; /*0xffe642f8*/
}

/*
 *SetMem32 at 0xffe642fc
 */
int SetMem32(int a1, int a2, int a3, int a4)
{
 do /*0xffe64315*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffe6430d*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffe64311*/
 }
 while ( a2 ); /*0xffe64315*/
 return a1; /*0xffe64319*/
}

/*
 *SetMemN at 0xffe6431c
 */
void *SetMemN(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffe64329*/
 return buf; /*0xffe6432f*/
}

/*
 *_ModuleEntryPoint at 0xffe6433c
 */
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 _DWORD *v2; // eax _DWORD *v3; // esi if ( *(char *)(PcdGetPtr() + 1024068) >= 0 ) /*0xffe6434a*/
 {
 PcdSet16(); /*0xffe6434c*/
 PcdSetBit(); /*0xffe64351*/
 }
 DebugPrint(-1, SystemTable, "CmosManagerPeiEntry Entry\n"); /*0xffe646c7*/
 v2 = CmosControllerConstructor(SystemTable); /*0xffe646d1*/
 v3 = v2; /*0xffe646d6*/
 if ( v2 && (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v2 + 170))(v2, 8) ) /*0xffe646e3*/
 {
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 2) ) /*0xffe646f6*/
 return 0; /*0xffe64704*/
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 0x80000) /*0xffe64729*/
 && (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 0x20000) )
 {
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 16) /*0xffe6474a*/
 && (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 0x10000) )
 {
 goto LABEL_22; /*0xffe64754*/
 }
 (*(void ( **)(_DWORD *, _DWORD))((char *)v3 + 182))(v3, 0); /*0xffe64775*/
 }
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 174))(v3, 4224) ) /*0xffe64783*/
 {
 if ( !(*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 128) /*0xffe647b8*/
 && !(*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 4096) )
 {
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 0x80000) ) /*0xffe647d3*/
 (*(int ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 0x40000); /*0xffe647e5*/
 }
 }
 else
 {
 ((void ( *)(_DWORD *))v3[8])(v3); /*0xffe64830*/
 if ( (*(unsigned __int8 ( **)(_DWORD *, int))((char *)v3 + 170))(v3, 1) ) /*0xffe64836*/
 {
 (*(void ( **)(EFI_SYSTEM_TABLE *, void *))(LODWORD(SystemTable->Hdr.Signature) + 36))( /*0xffe64862*/
 SystemTable,
 &unk_FFE66C40);
 return 0; /*0xffe64867*/
 }
 }
LABEL_22:
 JUMPOUT(0xFFE64550); /*0xffe64550*/
 }
 return -2147483645; /*0xffe64859*/
}

/*
 *CmosControllerValidate at 0xffe6486c
 */
int CmosControllerValidate(int a1)
{
 int Result; // edi Result = 0; /*0xffe64872*/
 if ( a1 && (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 8) ) /*0xffe6487b*/
 return a1; /*0xffe64887*/
 return Result; /*0xffe6488b*/
}

/*
 *CmosFlagCheckAllSet at 0xffe6488e
 */
bool CmosFlagCheckAllSet(int a1, int a2)
{
 return (a2 & *(_DWORD *)(a1 + 158)) == a2; /*0xffe648a3*/
}

/*
 *CmosFlagCheckAnySet at 0xffe648a4
 */
bool CmosFlagCheckAnySet(int a1, int a2)
{
 return (a2 & *(_DWORD *)(a1 + 158)) != 0; /*0xffe648b5*/
}

/*
 *CmosFlagSetOrClear at 0xffe648b6
 */
int CmosFlagSetOrClear(int a1, int n8, int a3)
{
 __int16 n8_1; // bx int result; // eax int Result; // ecx n8_1 = n8; /*0xffe648bb*/
 if ( a3 == 1 ) /*0xffe648c4*/
 {
 *(_DWORD *)(a1 + 158) |= n8; /*0xffe648c6*/
 result = (*(int ( **)(int, int))(a1 + 170))(a1, 0x80000); /*0xffe648d2*/
 if ( (_BYTE)result ) /*0xffe648dc*/
 {
 if ( (n8_1 & 0x1000) != 0 ) /*0xffe648e4*/
 result = (*(int ( **)(int, int, int))(a1 + 8))(a1, 4658, 1); /*0xffe648ed*/
 if ( (n8_1 & 0x80u) != 0 ) /*0xffe648f5*/
 result = (*(int ( **)(int, int, int))(a1 + 8))(a1, 4659, 1); /*0xffe648fe*/
 if ( (n8_1 & 0x4000) != 0 ) /*0xffe6490a*/
 result = (*(int ( **)(int, int, int))(a1 + 8))(a1, 4660, 1); /*0xffe64913*/
 if ( (n8_1 & 0x10) != 0 ) /*0xffe6491c*/
 result = (*(int ( **)(int, int, int))(a1 + 8))(a1, 4661, 1); /*0xffe64925*/
 }
 }
 else
 {
 result = ~n8; /*0xffe6492f*/
 *(_DWORD *)(a1 + 158) &= ~n8; /*0xffe64931*/
 }
 if ( (n8_1 & 0x1080) != 0 ) /*0xffe6493d*/
 result = CmosSmiInterruptConfig((_DWORD *)a1, n8_1, a3); /*0xffe64947*/
 Result = *(_DWORD *)(a1 + 178); /*0xffe6494d*/
 if ( Result ) /*0xffe64955*/
 {
 result = *(_DWORD *)(a1 + 158); /*0xffe64957*/
 *(_DWORD *)(Result + 24) = result; /*0xffe6495d*/
 }
 return result; /*0xffe64960*/
}

/*
 *CmosFlagSet at 0xffe64964
 */
int CmosFlagSet(int a1, int n8)
{
 return CmosFlagSetOrClear(a1, n8, 1); /*0xffe64974*/
}

/*
 *CmosFlagClear at 0xffe64975
 */
int CmosFlagClear(int a1, int n8)
{
 return CmosFlagSetOrClear(a1, n8, 0); /*0xffe64985*/
}

/*
 *CmosControllerInit at 0xffe64986
 */
int CmosControllerInit(_DWORD *a1, char a2)
{
 unsigned int dst_1; // ecx unsigned int dst; // [esp+0h] [ebp-4h] BYREF dst = dst_1; /*0xffe64989*/
 if ( (a2 & 0xC) == 0xC ) /*0xffe64992*/
 return -2147483646; /*0xffe64999*/
 if ( (a2 & 4) == 0 ) /*0xffe649ac*/
 goto LABEL_8; /*0xffe649ac*/
 if ( !(*(unsigned __int8 ( **)(_DWORD *, int))((char *)a1 + 170))(a1, 0x2000) ) /*0xffe649b0*/
 {
 if ( !(*(unsigned __int8 ( **)(_DWORD *, int))((char *)a1 + 170))(a1, 64) ) /*0xffe649bf*/
 {
 (*(void ( **)(_DWORD, int, unsigned int *))(*(_DWORD *)*a1 + 76))( /*0xffe649db*/
 *a1,
 2 * *((unsigned __int16 *)a1 + 61),
 &dst);
 CopyMemOverlap(dst, *(char **)((char *)a1 + 118), 2 * *((unsigned __int16 *)a1 + 61)); /*0xffe649eb*/
 *(_DWORD *)((char *)a1 + 118) = dst; /*0xffe649f6*/
 }
 (*(void ( **)(_DWORD *, int))((char *)a1 + 162))(a1, 0x2000); /*0xffe649fc*/
 (*(void ( **)(_DWORD *, _DWORD *))((char *)a1 + 142))(a1, a1 + 35); /*0xffe64a0a*/
 (*(void ( **)(_DWORD *, _DWORD))((char *)a1 + 150))(a1, *((unsigned __int16 *)a1 + 70)); /*0xffe64a15*/
LABEL_8:
 if ( (a2 & 8) != 0 ) /*0xffe64a23*/
 (*(void ( **)(_DWORD *, int))((char *)a1 + 166))(a1, 0x2000); /*0xffe64a27*/
 }
 return 0; /*0xffe64a35*/
}

/*
 *CmosIoWrite32 at 0xffe64a37
 */
int CmosIoWrite32(int a1, unsigned int a2)
{
 unsigned int v2; // edi unsigned int i; // ebx v2 = a2; /*0xffe64a3f*/
 if ( !a2 ) /*0xffe64a44*/
 v2 = (*(int ( **)(int))(a1 + 36))(a1); /*0xffe64a4b*/
 if ( !(*(unsigned __int8 ( **)(int, int))(a1 + 174))(a1, 0x80000) ) /*0xffe64a53*/
 return -2147483641; /*0xffe64a5f*/
 for ( i = 0; i < 4; ++i ) /*0xffe64a67*/
 {
 HIBYTE(a2) = v2 >> (8 * (3 - i)); /*0xffe64a79*/
 CmosRegisterReadModifyWrite(a1, 0, i + 66, 255, (char *)&a2 + 3); /*0xffe64a89*/
 }
 return 0; /*0xffe64a9a*/
}

/*
 *CmosIoRead32 at 0xffe64a9e
 */
int CmosIoRead32(int a1, int *a2)
{
 int v2; // edi int v3; // esi unsigned __int8 i; // bl v2 = a1; /*0xffe64aa4*/
 v3 = 0; /*0xffe64aa7*/
 if ( !(*(unsigned __int8 ( **)(int, int))(a1 + 174))(a1, 0x80000) ) /*0xffe64aaf*/
 return -2147483641; /*0xffe64abb*/
 for ( i = 0; i < 4u; ++i ) /*0xffe64ac3*/
 {
 CmosAccessByRange(v2, 1, (unsigned __int16)(i + 66), (unsigned __int8 *)&a1 + 3); /*0xffe64add*/
 v3 = HIBYTE(a1) | (v3 << 8); /*0xffe64ae9*/
 }
 *a2 = v3; /*0xffe64af8*/
 return 0; /*0xffe64afc*/
}

/*
 *CmosPpiNotify at 0xffe64b02
 */
int CmosPpiNotify(_DWORD *a1)
{
 int Result; // edi Result = (*(int ( **)(_DWORD, _DWORD *))(*(_DWORD *)*a1 + 24))(*a1, a1 + 18); /*0xffe64b14*/
 if ( Result < 0 ) /*0xffe64b1a*/
 {
 (*(void ( **)(_DWORD *, int))((char *)a1 + 162))(a1, 4); /*0xffe64b2c*/
 (*(void ( **)(_DWORD *, int))((char *)a1 + 166))(a1, 1); /*0xffe64b35*/
 }
 else
 {
 (*(void ( **)(_DWORD *, int))((char *)a1 + 162))(a1, 1); /*0xffe64b1f*/
 }
 return Result; /*0xffe64b40*/
}

/*
 *CmosControllerInstall at 0xffe64b43
 */
int CmosControllerInstall(int SystemTable, _DWORD *buf)
{
 *buf = SystemTable; /*0xffe64b46*/
 buf[1] = CmosRead; /*0xffe64b48*/
 buf[2] = CmosWrite; /*0xffe64b4f*/
 buf[3] = CmosRegisterLookupByOffset; /*0xffe64b56*/
 buf[4] = CmosGetRegisterTable; /*0xffe64b5d*/
 buf[5] = CmosGetDateTime; /*0xffe64b64*/
 buf[6] = CmosSetDateTime; /*0xffe64b6b*/
 buf[9] = CmosControllerValidate; /*0xffe64b72*/
 buf[8] = CmosPpiNotify; /*0xffe64b79*/
 *(_DWORD *)((char *)buf + 142) = CmosChecksumVerify; /*0xffe64b80*/
 *(_DWORD *)((char *)buf + 146) = CmosChecksumGetSaved; /*0xffe64b8a*/
 *(_DWORD *)((char *)buf + 150) = CmosChecksumUpdate; /*0xffe64b94*/
 buf[34] = CmosControllerInit; /*0xffe64b9e*/
 *(_DWORD *)((char *)buf + 170) = CmosFlagCheckAllSet; /*0xffe64ba8*/
 *(_DWORD *)((char *)buf + 174) = CmosFlagCheckAnySet; /*0xffe64bb2*/
 *(_DWORD *)((char *)buf + 162) = CmosFlagSet; /*0xffe64bbc*/
 *(_DWORD *)((char *)buf + 166) = CmosFlagClear; /*0xffe64bc6*/
 *(_DWORD *)((char *)buf + 154) = CmosLoadDefaults; /*0xffe64bd0*/
 *(_DWORD *)((char *)buf + 182) = CmosIoWrite32; /*0xffe64bda*/
 *(_DWORD *)((char *)buf + 186) = CmosIoRead32; /*0xffe64be4*/
 CmosFlagSet((int)buf, 8); /*0xffe64bee*/
 return 0; /*0xffe64bf7*/
}

/*
 *CmosControllerConstructor at 0xffe64bf8
 */
char *__thiscall CmosControllerConstructor(EFI_SYSTEM_TABLE *SystemTable)
{
 int value; // eax char *buf_1; // eax unsigned __int8 ( **v5)(_DWORD); // edi unsigned __int8 ( **v6)(_DWORD); // ebx unsigned __int8 ( **v7)(_DWORD); // esi unsigned __int8 ( **i)(_DWORD); // ebp char *buf; // [esp+8h] [ebp-4h] BYREF if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, char **))(LODWORD(SystemTable->Hdr.Signature) + 32))( /*0xffe64c0e*/
 SystemTable,
 &unk_FFE66BEC,
 0,
 0,
 &buf) )
 {
 value = (*(int ( **)(EFI_SYSTEM_TABLE *, int, char **))(LODWORD(SystemTable->Hdr.Signature) + 76))( /*0xffe64c3f*/
 SystemTable,
 220,
 &buf);
 if ( value >= 0 ) /*0xffe64c47*/
 {
 SetMemM(value, buf, 0xDCu, 0); /*0xffe64c57*/
 CmosControllerInstall((int)SystemTable, buf); /*0xffe64c65*/
 ((void (__thiscall *)(char *))loc_FFE645D2)(buf); /*0xffe64c6e*/
 buf_1 = buf; /*0xffe64c73*/
 v5 = *(unsigned __int8 ( ***)(_DWORD))(buf + 194); /*0xffe64c77*/
 v6 = *(unsigned __int8 ( ***)(_DWORD))(buf + 198); /*0xffe64c7d*/
 v7 = *(unsigned __int8 ( ***)(_DWORD))(buf + 202); /*0xffe64c83*/
 for ( i = *(unsigned __int8 ( ***)(_DWORD))(buf + 206); *i; ++i ) /*0xffe64c89*/
 {
 if ( (*i)(*(_DWORD *)buf_1) ) /*0xffe64c98*/
 (*(void ( **)(char *, int))(buf + 162))(buf, 0x80000); /*0xffe64ca9*/
 else
 (*(void ( **)(char *, int))(buf + 166))(buf, 0x80000); /*0xffe64cb1*/
 buf_1 = buf; /*0xffe64cb7*/
 }
 while ( *v5 ) /*0xffe64cc7*/
 {
 if ( (*v5)(*(_DWORD *)buf_1) ) /*0xffe64ccb*/
 (*(void ( **)(char *, int))(buf + 162))(buf, 16); /*0xffe64cd9*/
 buf_1 = buf; /*0xffe64ce1*/
 ++v5; /*0xffe64ce5*/
 }
 while ( *v6 ) /*0xffe64cee*/
 {
 if ( (*v6)(*(_DWORD *)buf_1) ) /*0xffe64cf2*/
 (*(void ( **)(char *, int))(buf + 162))(buf, 0x10000); /*0xffe64d03*/
 buf_1 = buf; /*0xffe64d0b*/
 ++v6; /*0xffe64d0f*/
 }
 while ( *v7 ) /*0xffe64d18*/
 {
 if ( (*v7)(*(_DWORD *)buf_1) ) /*0xffe64d1c*/
 (*(void ( **)(char *, int))(buf + 162))(buf, 0x20000); /*0xffe64d2d*/
 buf_1 = buf; /*0xffe64d35*/
 ++v7; /*0xffe64d39*/
 }
 (*(void ( **)(char *, int))(buf_1 + 162))(buf_1, 0x40000); /*0xffe64d44*/
 (*(void ( **)(char *, char *))(buf + 142))(buf, buf + 140); /*0xffe64d56*/
 CmosCheckBatteryStatus(buf); /*0xffe64d63*/
 return buf; /*0xffe64d68*/
 }
 else
 {
 return 0; /*0xffe64c49*/
 }
 }
 else
 {
 (*(void ( **)(char *, int))(buf + 162))(buf, 2); /*0xffe64c1f*/
 return buf; /*0xffe64c25*/
 }
}

/*
 *CmosRegisterLookupByIndex at 0xffe64d71
 */
unsigned __int16 CmosRegisterLookupByIndex(int a1, __int16 n0xE)
{
 unsigned __int16 v2; // di unsigned __int16 Index; // si int v4; // ecx v2 = *(_WORD *)(a1 + 116); /*0xffe64d74*/
 Index = 1; /*0xffe64d7d*/
 if ( v2 > 1u ) /*0xffe64d83*/
 {
 v4 = *(_DWORD *)(a1 + 112); /*0xffe64d85*/
 do /*0xffe64d95*/
 {
 if ( *(_WORD *)(v4 + 2 *Index) == n0xE ) /*0xffe64d8f*/
 break; /*0xffe64d8f*/
 ++Index; /*0xffe64d91*/
 }
 while ( Index < v2 ); /*0xffe64d95*/
 }
 if ( Index >= v2 ) /*0xffe64d9a*/
 return 0; /*0xffe64da1*/
 else return Index; /*0xffe64d9c*/
}

/*
 *CmosRegisterLookupByOffset at 0xffe64da7
 */
int CmosRegisterLookupByOffset(int a1, __int16 a2)
{
 unsigned __int16 Index; // cx unsigned __int16 v3; // di int result; // eax Index = 1; /*0xffe64daf*/
 v3 = *(_WORD *)(a1 + 116); /*0xffe64db4*/
 if ( v3 > 1u ) /*0xffe64db9*/
 {
 do /*0xffe64dde*/
 {
 if ( ((*(_WORD *)(*(_DWORD *)(a1 + 112) + 2 *Index) >> 3) & 0x1FF) == a2 ) /*0xffe64dd8*/
 break; /*0xffe64dd8*/
 ++Index; /*0xffe64dda*/
 }
 while ( Index < v3 ); /*0xffe64dde*/
 }
 if ( Index >= *(_WORD *)(a1 + 116) ) /*0xffe64de7*/
 return 0; /*0xffe64de7*/
 result = *(unsigned __int16 *)(*(_DWORD *)(a1 + 112) + 2 *Index); /*0xffe64df4*/
 if ( (result & 0xF000) != 0x8000 ) /*0xffe64e03*/
 return 0; /*0xffe64e05*/
 return result; /*0xffe64de2*/
}

/*
 *CmosAccessByRange at 0xffe64e08
 */
int CmosAccessByRange(int a1, int a2, int a3, unsigned __int8 *a4)
{
 int Result; // esi unsigned __int8 Index; // bl unsigned __int16 v7; // bp int v8; // ecx int v9; // edx int v10; // eax int v11; // esi unsigned __int8 v12; // al Result = -2147483634; /*0xffe64e15*/
 Index = 1; /*0xffe64e1b*/
 v7 = *(_WORD *)(a1 + 218); /*0xffe64e1d*/
 if ( v7 > 1u ) /*0xffe64e27*/
 {
 v8 = *(_DWORD *)(a1 + 214); /*0xffe64e2d*/
 v9 = a3; /*0xffe64e33*/
 while ( 1 ) /*0xffe64e3a*/
 {
 v10 = 12 *Index; /*0xffe64e3a*/
 if ( (unsigned __int16)v9 >= *(_WORD *)(v10 + v8 + 4) && (unsigned __int16)v9 <= *(_WORD *)(v10 + v8 + 6) ) /*0xffe64e49*/
 {
 if ( *(_DWORD *)(v10 + v8 + 8) ) /*0xffe64e4b*/
 return (*(int ( **)(_DWORD, int, int, unsigned __int8 *))(12 *Index + v8 + 8))(*(_DWORD *)a1, a2, v9, a4); /*0xffe64ecf*/
 v7 = *(_WORD *)(a1 + 218); /*0xffe64e58*/
 if ( *(_WORD *)(v10 + v8) ) /*0xffe64e54*/
 {
 v9 = a3; /*0xffe64e68*/
 if ( *(_WORD *)(v10 + v8 + 2) ) /*0xffe64e63*/
 break; /*0xffe64e63*/
 }
 }
 if ( ++Index >= v7 ) /*0xffe64e76*/
 return Result; /*0xffe64e76*/
 }
 v11 = 12 *Index; /*0xffe64e7d*/
 __outbyte(*(_WORD *)(v11 + v8), a3); /*0xffe64e88*/
 if ( a2 == 1 ) /*0xffe64e8e*/
 {
 v12 = __inbyte(*(_WORD *)(*(_DWORD *)(a1 + 214) + v11 + 2)); /*0xffe64e9b*/
 *a4 = v12; /*0xffe64ea2*/
 }
 else
 {
 __outbyte(*(_WORD *)(*(_DWORD *)(a1 + 214) + v11 + 2), *a4); /*0xffe64eb9*/
 }
 return 0; /*0xffe64ed6*/
 }
 return Result; /*0xffe64ed8*/
}

/*
 *CmosRegisterReadModifyWrite at 0xffe64ee0
 */
int CmosRegisterReadModifyWrite(int va_, int a2, unsigned int n0xD, char n255, char *va)
{
 unsigned int v8; // [esp+8h] [ebp-Ch] BYREF unsigned __int8 v9[4]; // [esp+Ch] [ebp-8h] BYREF unsigned __int8 v10[4]; // [esp+10h] [ebp-4h] BYREF v8 = 0; /*0xffe64ee6*/
 CmosAccessByRange(va_, 1, n0xD, v10); /*0xffe64efa*/
 if ( a2 == 1 ) /*0xffe64f04*/
 {
 *va = v10[0]; /*0xffe64f0c*/
 }
 else
 {
 v9[0] = *va | v10[0] & ~n255; /*0xffe64f27*/
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 1024) ) /*0xffe64f2a*/
 CmosChecksumAccumulateRegister(va_, n0xD, v10[0], v9[0], &v8); /*0xffe64f45*/
 CmosAccessByRange(va_, 0, n0xD, v9); /*0xffe64f58*/
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 1024) /*0xffe64f72*/
 && (*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 256) )
 {
 (*(void ( **)(int, int))(va_ + 162))(va_, 1024); /*0xffe64f80*/
 CmosChecksumUpdate(va_, v8); /*0xffe64f8a*/
 (*(void ( **)(int, int))(va_ + 166))(va_, 1024); /*0xffe64f91*/
 }
 }
 return 0; /*0xffe64f9a*/
}

/*
 *CmosBufferReadWrite at 0xffe64fa2
 */
int CmosBufferReadWrite(int va_, int a2, unsigned __int16 i, char n255, _BYTE *va)
{
 int Ptr; // ebp char v7; // cl unsigned __int8 v8; // bl unsigned int v10; // [esp+8h] [ebp-8h] BYREF unsigned __int8 v11[4]; // [esp+Ch] [ebp-4h]

 v10 = 0; /*0xffe64fa4*/
 if ( (unsigned __int16)(i - 64) > 0x31u )
 {
 ((void (*)(int, const char *, ...))loc_FFE64550)(va_, " CmosBufferReadWrite: Invalid CmosAddress (0x%X)\n", i);
 return -2147483646; /*0xffe6507a*/
 }
 else
 {
 Ptr = (unsigned __int16)(i - 63); /*0xffe64fc7*/
 v7 = *(_BYTE *)(*(_DWORD *)(va_ + 118) + 2 *Ptr); /*0xffe64fc9*/
 v11[0] = *(_BYTE *)(*(_DWORD *)(va_ + 118) + 2 *Ptr); /*0xffe64fd0*/
 if ( a2 == 1 ) /*0xffe64fd7*/
 {
 *va = v7; /*0xffe64fd9*/
 }
 else
 {
 v8 = *va | v7 & ~n255; /*0xffe64fe9*/
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 1024) ) /*0xffe64ff5*/
 CmosChecksumAccumulateRegister(va_, i, v11[0], v8, &v10); /*0xffe65012*/
 *(_BYTE *)(*(_DWORD *)(va_ + 118) + 2 *Ptr) = v8; /*0xffe65024*/
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 1024) ) /*0xffe65027*/
 {
 if ( (*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 256) ) /*0xffe6503a*/
 {
 (*(void ( **)(int, int))(va_ + 162))(va_, 1024); /*0xffe65048*/
 CmosChecksumUpdate(va_, v10); /*0xffe65053*/
 (*(void ( **)(int, int))(va_ + 166))(va_, 1024); /*0xffe6505a*/
 }
 }
 }
 return 0; /*0xffe65063*/
 }
}

/*
 *CmosSelectAccessMethod at 0xffe65084
 */
int CmosSelectAccessMethod(int va_, int a2, unsigned int i, char n255, char *va)
{
 unsigned __int16 j_1; // dx unsigned __int16 j; // cx if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 0x2000) ) /*0xffe65091*/
 return CmosRegisterReadModifyWrite(va_, a2, i, n255, va); /*0xffe65091*/
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 0x80000) /*0xffe650b9*/
 || !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 0x8000) )
 {
 return CmosBufferReadWrite(va_, a2, i, n255, va); /*0xffe650b9*/
 }
 j_1 = *(_WORD *)(va_ + 128); /*0xffe650c5*/
 for ( j = 1; j < j_1; ++j ) /*0xffe650d2*/
 {
 if ( (unsigned __int16)i <= *(_WORD *)(*(_DWORD *)(va_ + 124) + 2 *j) ) /*0xffe650df*/
 break; /*0xffe650df*/
 }
 if ( (_WORD)i == *(_WORD *)(*(_DWORD *)(va_ + 124) + 2 *j) ) /*0xffe650f2*/
 return CmosRegisterReadModifyWrite(va_, a2, i, n255, va); /*0xffe65115*/
 else return CmosBufferReadWrite(va_, a2, i, n255, va); /*0xffe65101*/
}

/*
 *CmosBitFieldAccess at 0xffe65121
 */
int CmosBitFieldAccess(int a1, int a2, unsigned __int16 a3, char *va)
{
 int v4; // ebp char n255; // [esp+10h] [ebp-Ch]

 v4 = *(_DWORD *)(a1 + 112); /*0xffe65126*/
 n255 = 0; /*0xffe65138*/
 if ( !a2 ) /*0xffe6514d*/
 {
 if ( ((unsigned __int8)~(255 >> (8 - (*(unsigned __int16 *)(v4 + 2 *a3) >> 12))) & (unsigned __int8)*va) != 0 ) /*0xffe65165*/
 return -2147483646; /*0xffe6516c*/
 *va <<= *(_BYTE *)(v4 + 2 *a3) & 7; /*0xffe65177*/
 n255 = (unsigned __int8)(255 >> (8 - (*(unsigned __int16 *)(v4 + 2 *a3) >> 12))) << (*(_BYTE *)(v4 + 2 *a3) & 7); /*0xffe65196*/
 }
 CmosSelectAccessMethod(a1, a2, (*(_WORD *)(v4 + 2 *a3) >> 3) & 0x1FF, n255, va); /*0xffe651b8*/
 if ( a2 == 1 ) /*0xffe651c5*/
 {
 *va = (unsigned __int8)*va >> (*(_BYTE *)(v4 + 2 *a3) & 7); /*0xffe651ce*/
 *va &= 255 >> (8 - (*(unsigned __int16 *)(v4 + 2 *a3) >> 12)); /*0xffe651df*/
 }
 return 0; /*0xffe651e3*/
}

/*
 *CmosRead at 0xffe651eb
 */
int CmosRead(int a1, int n0xE, unsigned __int8 *va)
{
 int v3; // ecx unsigned __int16 v5; // ax if ( (unsigned __int16)n0xE <= 0xEu ) /*0xffe651f7*/
 {
 v3 = a1; /*0xffe651f9*/
 return CmosAccessByRange(v3, 1, n0xE, va); /*0xffe65232*/
 }
 if ( (unsigned __int16)n0xE < 0x1000u ) /*0xffe65206*/
 {
 if ( !(*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 0x80000) ) /*0xffe65211*/
 return -2147483641; /*0xffe65222*/
 v3 = a1; /*0xffe65224*/
 return CmosAccessByRange(v3, 1, n0xE, va); /*0xffe65224*/
 }
 v5 = CmosRegisterLookupByIndex(a1, n0xE); /*0xffe65239*/
 if ( v5 ) /*0xffe65244*/
 return CmosBitFieldAccess(a1, 1, v5, (char *)va); /*0xffe65250*/
 else return -2147483646; /*0xffe65259*/
}

/*
 *CmosGetRegisterTable at 0xffe65262
 */
int CmosGetRegisterTable(int a1, char *p_n0xD)
{
 char *p_n0xD_1; // esi char *va; // [esp-8h] [ebp-Ch]

 p_n0xD_1 = p_n0xD; /*0xffe65266*/
 if ( !p_n0xD ) /*0xffe6526b*/
 return -2147483646; /*0xffe6526d*/
 va = p_n0xD + 3; /*0xffe6527e*/
 *p_n0xD = 14; /*0xffe65281*/
 p_n0xD_1[2] = 13; /*0xffe65289*/
 CmosRegisterReadModifyWrite(a1, 1, 0xDu, 0, va); /*0xffe6528f*/
 CmosRegisterReadModifyWrite(a1, 1, (unsigned __int8)*p_n0xD_1, 0, p_n0xD_1 + 1); /*0xffe652a3*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 0x2000) ) /*0xffe652ae*/
 p_n0xD_1[4] |= 1u; /*0xffe652bb*/
 else p_n0xD_1[4] &= ~1u; /*0xffe652c1*/
 p_n0xD_1[4] &= 0xC3u; /*0xffe652c5*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 0x80000) ) /*0xffe652cf*/
 {
 p_n0xD_1[4] &= ~2u; /*0xffe652df*/
 (*(void ( **)(int, int, char *))(a1 + 4))(a1, 4658, (char *)&p_n0xD + 3); /*0xffe652ed*/
 p_n0xD_1[4] ^= (p_n0xD_1[4] ^ (p_n0xD_1[4] | (4 *HIBYTE(p_n0xD)))) & 4; /*0xffe6530c*/
 (*(void ( **)(int, int, char *))(a1 + 4))(a1, 4660, (char *)&p_n0xD + 3); /*0xffe6530f*/
 p_n0xD_1[4] ^= (p_n0xD_1[4] ^ (p_n0xD_1[4] | (16 *HIBYTE(p_n0xD)))) & 0x10; /*0xffe6532e*/
 (*(void ( **)(int, int, char *))(a1 + 4))(a1, 4661, (char *)&p_n0xD + 3); /*0xffe65331*/
 p_n0xD_1[4] ^= (p_n0xD_1[4] ^ (p_n0xD_1[4] | (32 *HIBYTE(p_n0xD)))) & 0x20; /*0xffe65350*/
 (*(void ( **)(int, int, char *))(a1 + 4))(a1, 4659, (char *)&p_n0xD + 3); /*0xffe65353*/
 p_n0xD_1[4] ^= (p_n0xD_1[4] ^ (p_n0xD_1[4] | (8 *HIBYTE(p_n0xD)))) & 8; /*0xffe6536b*/
 }
 else
 {
 p_n0xD_1[4] |= 2u; /*0xffe65370*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 4096) ) /*0xffe6537a*/
 p_n0xD_1[4] |= 4u; /*0xffe65386*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 0x4000) ) /*0xffe65390*/
 p_n0xD_1[4] |= 0x10u; /*0xffe6539c*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 16) ) /*0xffe653a3*/
 p_n0xD_1[4] |= 0x20u; /*0xffe653af*/
 if ( (*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 128) ) /*0xffe653b9*/
 p_n0xD_1[4] |= 8u; /*0xffe653c5*/
 }
 return 0; /*0xffe653cc*/
}

/*
 *CmosChecksumGetSaved at 0xffe653cf
 */
int CmosChecksumGetSaved(int va_, _WORD *a2)
{
 (*(void ( **)(int, int, _WORD *))(va_ + 4))(va_, 33280, a2); /*0xffe653e0*/
 *a2 <<= 8; /*0xffe653e3*/
 (*(void ( **)(int, int, _WORD *))(va_ + 4))(va_, 33288, a2); /*0xffe653ee*/
 return 0; /*0xffe653f6*/
}

/*
 *CmosChecksumUpdate at 0xffe653f9
 */
int CmosChecksumUpdate(int va_, unsigned int a2)
{
 int v2; // eax v2 = *(_DWORD *)(va_ + 178); /*0xffe65404*/
 if ( v2 ) /*0xffe6540c*/
 *(_WORD *)(v2 + 28) = a2; /*0xffe6540e*/
 (*(void ( **)(int, int))(va_ + 162))(va_, 1024); /*0xffe65419*/
 (*(void ( **)(int, int, unsigned int))(va_ + 8))(va_, 33288, a2); /*0xffe65426*/
 (*(void ( **)(int, int, unsigned int))(va_ + 8))(va_, 33280, a2 >> 8); /*0xffe65433*/
 (*(void ( **)(int, int))(va_ + 166))(va_, 1024); /*0xffe65438*/
 return 0; /*0xffe65443*/
}

/*
 *CmosCheckBatteryStatus at 0xffe65447
 */
int __thiscall CmosCheckBatteryStatus(char *this)
{
 int ( **v2)(_DWORD); // edi int ( *v3)(_DWORD); // eax char v4; // cl v2 = *(int ( ***)(_DWORD))(this + 210); /*0xffe6544b*/
 v3 = *v2; /*0xffe65451*/
 if ( !*v2 ) /*0xffe65451*/
 goto LABEL_5; /*0xffe65451*/
 do /*0xffe65461*/
 {
 ++v2; /*0xffe6545c*/
 v4 = v3(*(_DWORD *)this); /*0xffe6545f*/
 v3 = *v2; /*0xffe65461*/
 }
 while ( *v2 ); /*0xffe65461*/
 if ( v4 ) /*0xffe65469*/
 (*(void ( **)(char *, int))(this + 166))(this, 4096); /*0xffe65471*/
 else LABEL_5:
 (*(void ( **)(char *, int))(this + 162))(this, 4096); /*0xffe6547f*/
 return 0; /*0xffe65487*/
}

/*
 *CmosSmiInterruptConfig at 0xffe6548c
 */
int CmosSmiInterruptConfig(_DWORD *a1, __int16 n8, int a3)
{
 unsigned __int8 v6; // [esp+Bh] [ebp-1h] BYREF if ( (n8 & 0x80u) != 0 ) /*0xffe65498*/
 {
 CmosAccessByRange((int)a1, 1, 14, &v6); /*0xffe654a3*/
 if ( a3 == 1 ) /*0xffe654ae*/
 {
 v6 |= 0x40u; /*0xffe654b0*/
 }
 else if ( !*a1 ) /*0xffe654b6*/
 {
 v6 &= ~0x40u; /*0xffe654bb*/
 }
 CmosAccessByRange((int)a1, 0, 14, &v6); /*0xffe654c9*/
 }
 if ( (n8 & 0x1000) != 0 ) /*0xffe654d6*/
 {
 CmosAccessByRange((int)a1, 1, 14, &v6); /*0xffe654e3*/
 if ( a3 == 1 ) /*0xffe654ee*/
 {
 v6 |= 0x80u; /*0xffe654f0*/
 }
 else if ( !*a1 ) /*0xffe654f6*/
 {
 v6 &= ~0x80u; /*0xffe654fb*/
 }
 CmosAccessByRange((int)a1, 0, 14, &v6); /*0xffe65509*/
 }
 return 0; /*0xffe65510*/
}

/*
 *CmosChecksumAccumulateRegister at 0xffe65518
 */
int CmosChecksumAccumulateRegister(
 int va_,
 unsigned __int16 n0xD,
 unsigned __int8 a3,
 unsigned __int8 a4,
 _WORD *a5)
{
 unsigned __int16 v6; // si unsigned __int16 v7; // cx unsigned __int16 v8; // bx unsigned __int16 v9; // bx v6 = 1; /*0xffe65520*/
 v7 = 1; /*0xffe65521*/
 v8 = *(_WORD *)(va_ + 128); /*0xffe65523*/
 if ( v8 > 1u ) /*0xffe6552d*/
 {
 do /*0xffe65540*/
 {
 if ( n0xD <= *(_WORD *)(*(_DWORD *)(va_ + 124) + 2 *v7) ) /*0xffe6553a*/
 break; /*0xffe6553a*/
 ++v7; /*0xffe6553c*/
 }
 while ( v7 < v8 ); /*0xffe65540*/
 }
 v9 = *(_WORD *)(va_ + 134); /*0xffe65542*/
 if ( v9 > 1u ) /*0xffe6554c*/
 {
 do /*0xffe65562*/
 {
 if ( n0xD <= *(_WORD *)(*(_DWORD *)(va_ + 130) + 2 *v6) ) /*0xffe6555c*/
 break; /*0xffe6555c*/
 ++v6; /*0xffe6555e*/
 }
 while ( v6 < v9 ); /*0xffe65562*/
 }
 if ( n0xD == *(_WORD *)(*(_DWORD *)(va_ + 124) + 2 *v7) || n0xD == *(_WORD *)(*(_DWORD *)(va_ + 130) + 2 *v6) ) /*0xffe6557d*/
 {
 (*(void ( **)(int, int))(va_ + 166))(va_, 256); /*0xffe655b1*/
 }
 else
 {
 CmosChecksumGetSaved(va_, a5); /*0xffe65585*/
 *a5 += a4 - a3; /*0xffe65597*/
 (*(void ( **)(int, int))(va_ + 162))(va_, 256); /*0xffe655a0*/
 }
 return 0; /*0xffe655b9*/
}

/*
 *CmosChecksumVerify at 0xffe655c0
 */
int CmosChecksumVerify(int va_, _WORD *a2)
{
 int va__1; // esi unsigned __int16 j_1; // bx unsigned __int16 k_1; // bp unsigned int i; // edi unsigned __int16 j; // cx unsigned __int16 k; // cx __int16 v9; // [esp+10h] [ebp-4h] BYREF va__1 = va_; /*0xffe655c8*/
 j_1 = 1; /*0xffe655d0*/
 k_1 = 1; /*0xffe655d1*/
 *a2 = 0; /*0xffe655d5*/
 for ( i = *(unsigned __int16 *)(va__1 + 108); (unsigned __int16)i <= *(_WORD *)(va__1 + 110); ++i ) /*0xffe655d8*/
 {
 for ( j = *(_WORD *)(va__1 + 134); j_1 < j; ++j_1 ) /*0xffe655e8*/
 {
 if ( (unsigned __int16)i <= *(_WORD *)(*(_DWORD *)(va__1 + 130) + 2 *j_1) ) /*0xffe655f7*/
 break; /*0xffe655f7*/
 }
 if ( (_WORD)i != *(_WORD *)(*(_DWORD *)(va__1 + 130) + 2 *j_1) ) /*0xffe6560c*/
 {
 for ( k = *(_WORD *)(va__1 + 128); k_1 < k; ++k_1 ) /*0xffe65618*/
 {
 if ( (unsigned __int16)i <= *(_WORD *)(*(_DWORD *)(va__1 + 124) + 2 *k_1) ) /*0xffe65624*/
 break; /*0xffe65624*/
 }
 if ( (_WORD)i != *(_WORD *)(*(_DWORD *)(va__1 + 124) + 2 *k_1) ) /*0xffe65636*/
 {
 CmosSelectAccessMethod(va__1, 1, i, 0, (char *)&va_); /*0xffe65645*/
 *a2 += (unsigned __int8)va_; /*0xffe65656*/
 }
 }
 }
 CmosChecksumGetSaved(va__1, &v9); /*0xffe6566a*/
 if ( *a2 == v9 ) /*0xffe65683*/
 {
 (*(void ( **)(int, int))(va__1 + 166))(va__1, 128); /*0xffe6569b*/
 }
 else
 {
 (*(void ( **)(int, int))(va__1 + 162))(va__1, 128); /*0xffe65685*/
 ((void ( *)(int, const char *))loc_FFE64550)(va__1, " ...CMOS_BAD_CHECKSUM\n"); /*0xffe65691*/
 }
 return 0; /*0xffe656a3*/
}

/*
 *CmosWrite at 0xffe656ab
 */
int CmosWrite(int a1, int n0xE, ...)
{
 int v2; // ecx unsigned __int16 v4; // ax va_list va; // [esp+18h] [ebp+10h] BYREF va_start(va, n0xE);
 if ( (unsigned __int16)n0xE <= 0xEu ) /*0xffe656b7*/
 {
 v2 = a1; /*0xffe656b9*/
 return CmosAccessByRange(v2, 0, n0xE, (unsigned __int8 *)va); /*0xffe656fb*/
 }
 if ( (unsigned __int16)n0xE >= 0x1000u ) /*0xffe656c6*/
 {
 v4 = CmosRegisterLookupByIndex(a1, n0xE); /*0xffe65702*/
 if ( v4 ) /*0xffe6570d*/
 return CmosBitFieldAccess(a1, 0, v4, (char *)va); /*0xffe65720*/
 }
 else
 {
 if ( !(*(unsigned __int8 ( **)(int, int))(a1 + 170))(a1, 0x80000) ) /*0xffe656d1*/
 return -2147483641; /*0xffe656e2*/
 if ( (unsigned __int16)(n0xE - 64) > 0x3Fu ) /*0xffe656eb*/
 {
 v2 = a1; /*0xffe656ed*/
 return CmosAccessByRange(v2, 0, n0xE, (unsigned __int8 *)va); /*0xffe656ed*/
 }
 }
 return -2147483646; /*0xffe65727*/
}

/*
 *CmosLoadDefaults at 0xffe6572b
 */
int CmosLoadDefaults(int va__2)
{
 int va_; // esi unsigned __int16 Index; // bx int Result; // ebp int v4; // eax unsigned int i; // edi int v6; // edx unsigned __int16 v7; // cx int v8; // esi int v9; // edx unsigned __int16 v10; // dx int Index; // ecx int v12; // esi char va__1; // [esp+13h] [ebp-15h] BYREF int v15; // [esp+14h] [ebp-14h]
 int v16; // [esp+18h] [ebp-10h]
 unsigned int v17; // [esp+1Ch] [ebp-Ch] BYREF int v18; // [esp+24h] [ebp-4h]

 va_ = va__2; /*0xffe65731*/
 Index = 1; /*0xffe65737*/
 v16 = 1; /*0xffe6573f*/
 v15 = 1; /*0xffe65743*/
 Result = 0; /*0xffe65747*/
 v4 = *(_DWORD *)(va__2 + 158) & 0x2000; /*0xffe65751*/
 v17 = 0; /*0xffe65753*/
 v18 = v4; /*0xffe65758*/
 (*(void ( **)(int, int))(va__2 + 166))(va__2, 0x2000); /*0xffe6575c*/
 (*(void ( **)(int, int))(va_ + 162))(va_, 1024); /*0xffe65768*/
 if ( (*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 16) ) /*0xffe65771*/
 (*(void ( **)(int, int))(va__2 + 166))(va__2, 128); /*0xffe65784*/
 i = *(unsigned __int16 *)(va__2 + 108); /*0xffe6578c*/
 if ( (unsigned __int16)i <= *(_WORD *)(va__2 + 110) )
 {
 v6 = v15; /*0xffe6579a*/
 while ( (unsigned __int16)v6 < *(_WORD *)(va_ + 122) )
 {
 v7 = *(_WORD *)(va_ + 134); /*0xffe657a8*/
 if ( Index < v7 ) /*0xffe657b2*/
 {
 v8 = *(_DWORD *)(va_ + 130); /*0xffe657b4*/
 do /*0xffe657c7*/
 {
 if ( (unsigned __int16)i <= *(_WORD *)(v8 + 2 *Index) ) /*0xffe657c1*/
 break; /*0xffe657c1*/
 ++Index; /*0xffe657c3*/
 }
 while ( Index < v7 ); /*0xffe657c7*/
 va_ = va__2; /*0xffe657c9*/
 }
 if ( (_WORD)i == *(_WORD *)(*(_DWORD *)(va_ + 130) + 2 *Index) )
 {
 v9 = v6 + 0xFFFF; /*0xffe657dc*/
 }
 else
 {
 if ( !(*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 32896) ) /*0xffe657ea*/
 goto LABEL_32; /*0xffe657ea*/
 v10 = *(_WORD *)(va_ + 128); /*0xffe657f6*/
 Index = v16; /*0xffe657fd*/
 if ( (unsigned __int16)v16 < v10 ) /*0xffe65804*/
 {
 v12 = *(_DWORD *)(va_ + 124); /*0xffe65806*/
 do /*0xffe65816*/
 {
 if ( (unsigned __int16)i <= *(_WORD *)(v12 + 2 * (unsigned __int16)Index) ) /*0xffe65810*/
 break; /*0xffe65810*/
 ++Index; /*0xffe65812*/
 }
 while ( (unsigned __int16)Index < v10 ); /*0xffe65816*/
 va_ = va__2; /*0xffe65818*/
 v16 = Index; /*0xffe6581c*/
 }
 if ( (_WORD)i != *(_WORD *)(*(_DWORD *)(va_ + 124) + 2 * (unsigned __int16)Index) )
 {
LABEL_32:
 va__1 = *(_BYTE *)(*(_DWORD *)(va_ + 118) + 2 * (unsigned __int16)v15); /*0xffe6583d*/
 Result = CmosSelectAccessMethod(va_, 0, i, 255, &va__1); /*0xffe65851*/
 if ( Result < 0 )
 {
 ((void (*)(int, const char *, ...))loc_FFE64550)(
 va_,
 " Error: unable to write to register: 0x%X\n",
 (unsigned __int16)i);
 (*(void ( **)(int, int))(va_ + 162))(va_, 512); /*0xffe65885*/
 break; /*0xffe65885*/
 }
 }
 v9 = v15; /*0xffe6585a*/
 }
 ++i; /*0xffe6585e*/
 v6 = v9 + 1; /*0xffe6585f*/
 v15 = v6; /*0xffe65860*/
 if ( (unsigned __int16)i > *(_WORD *)(va_ + 110) ) /*0xffe65868*/
 break; /*0xffe65868*/
 }
 if ( Result < 0 ) /*0xffe65890*/
 goto LABEL_28; /*0xffe65890*/
 }
 if ( (*(unsigned __int8 ( **)(int, int))(va_ + 170))(va_, 512) )
 {
LABEL_28:
 ((void ( *)(int, const char *))loc_FFE64550)(va_, " Error: Could not load Optimal Defaults\n");
 Result = -2147483645; /*0xffe658d7*/
 }
 else
 {
 CmosChecksumVerify(va_, &v17); /*0xffe658aa*/
 CmosChecksumUpdate(va_, v17); /*0xffe658b4*/
 (*(void ( **)(int, int))(va_ + 166))(va_, 128); /*0xffe658bf*/
 }
 *(_DWORD *)(va_ + 158) |= v18; /*0xffe658e0*/
 (*(void ( **)(int, int))(va_ + 166))(va_, 1024); /*0xffe658ec*/
 (*(void ( **)(int, int))(va_ + 162))(va_, 0x4000); /*0xffe658f8*/
 return Result; /*0xffe65903*/
}

/*
 *CmosBcdToBin at 0xffe6590b
 */
char CmosBcdToBin(int a1, unsigned __int8 a2)
{
 unsigned __int8 v3; // [esp+1h] [ebp-1h] BYREF v3 = HIBYTE(a1); /*0xffe6590e*/
 CmosAccessByRange(a1, 1, a2, &v3); /*0xffe6591a*/
 return (v3 & 0xF) + 10 * (v3 >> 4); /*0xffe65936*/
}

/*
 *CmosBinToBcd at 0xffe65938
 */
int CmosBinToBcd(int a1, unsigned __int8 a2, unsigned __int8 a3)
{
 a3 = a3 % 0xAu + 16 * (a3 / 0xAu); /*0xffe6594f*/
 return CmosAccessByRange(a1, 0, a2, &a3); /*0xffe65963*/
}

/*
 *CmosSetDateTime at 0xffe65966
 */
int CmosSetDateTime(int a1, int a2)
{
 int v2; // edi v2 = a2; /*0xffe6596b*/
 if ( !a2 || !a1 ) /*0xffe6597b*/
 return -2147483646; /*0xffe65a3b*/
 CmosAccessByRange(a1, 1, 11, (unsigned __int8 *)&a2 + 3); /*0xffe6598d*/
 HIBYTE(a2) |= 0x80u; /*0xffe65992*/
 CmosAccessByRange(a1, 0, 11, (unsigned __int8 *)&a2 + 3); /*0xffe659a0*/
 CmosBinToBcd(a1, 0x32u, *(_WORD *)v2 / 0x64u); /*0xffe659b4*/
 CmosBinToBcd(a1, 9u, *(_WORD *)v2 % 0x64u); /*0xffe659c5*/
 CmosBinToBcd(a1, 8u, *(_BYTE *)(v2 + 2)); /*0xffe659d3*/
 CmosBinToBcd(a1, 7u, *(_BYTE *)(v2 + 3)); /*0xffe659e1*/
 CmosBinToBcd(a1, 4u, *(_BYTE *)(v2 + 4)); /*0xffe659ef*/
 CmosBinToBcd(a1, 2u, *(_BYTE *)(v2 + 5)); /*0xffe659fd*/
 CmosBinToBcd(a1, 0, *(_BYTE *)(v2 + 6)); /*0xffe65a0b*/
 CmosAccessByRange(a1, 1, 11, (unsigned __int8 *)&a2 + 3); /*0xffe65a1b*/
 HIBYTE(a2) &= ~0x80u; /*0xffe65a20*/
 CmosAccessByRange(a1, 0, 11, (unsigned __int8 *)&a2 + 3); /*0xffe65a2e*/
 return 0; /*0xffe65a40*/
}

/*
 *CmosGetDateTime at 0xffe65a44
 */
int CmosGetDateTime(int a1, int a2)
{
 __int16 v2; // si char v3; // al if ( !a2 || !a1 ) /*0xffe65a54*/
 return -2147483646; /*0xffe65abd*/
 v2 = 100 * (unsigned __int8)CmosBcdToBin(a1, 0x32u); /*0xffe65a67*/
 *(_WORD *)a2 = v2 + (unsigned __int8)CmosBcdToBin(a1, 9u); /*0xffe65a79*/
 *(_BYTE *)(a2 + 2) = CmosBcdToBin(a1, 8u); /*0xffe65a83*/
 *(_BYTE *)(a2 + 3) = CmosBcdToBin(a1, 7u); /*0xffe65a8f*/
 *(_BYTE *)(a2 + 4) = CmosBcdToBin(a1, 4u); /*0xffe65a9b*/
 *(_BYTE *)(a2 + 5) = CmosBcdToBin(a1, 2u); /*0xffe65aa7*/
 v3 = CmosBcdToBin(a1, 0); /*0xffe65aac*/
 *(_DWORD *)(a2 + 8) = 0; /*0xffe65ab1*/
 *(_BYTE *)(a2 + 6) = v3; /*0xffe65ab5*/
 return 0; /*0xffe65ac2*/
}

/*
 *DebugGetPpi at 0xffe65ac5
 */
int DebugGetPpi()
{
 int Ptr; // eax _BYTE v2[4]; // [esp+0h] [ebp-8h] BYREF int Result; // [esp+4h] [ebp-4h] BYREF Ptr = PeiServicesGetPtr(); /*0xffe65aca*/
 if ( (*(int ( **)(int, void *, _DWORD, _BYTE *, int *))(*(_DWORD *)Ptr + 32))(Ptr, &unk_FFE66BAC, 0, v2, &Result) >= 0 ) /*0xffe65ae9*/
 return Result; /*0xffe65aef*/
 else return 0; /*0xffe65aeb*/
}

/*
 *DebugVPrint at 0xffe65af6
 */
int DebugVPrint(int a1, int _nASSERT_EFI_ERROR_(Status___%r)_n, ...)
{
 int result; // eax int ( **v3)(int, int, char *); // esi va_list va; // [esp+10h] [ebp+Ch] BYREF va_start(va, _nASSERT_EFI_ERROR_(Status___%r)_n);
 result = DebugGetPpi(); /*0xffe65af7*/
 v3 = (int ( **)(int, int, char *))result; /*0xffe65afc*/
 if ( result ) /*0xffe65b00*/
 {
 result = PcdGetBool(); /*0xffe65b02*/
 if ( (result & a1) != 0 ) /*0xffe65b0d*/
 return (*v3)(a1, _nASSERT_EFI_ERROR_(Status___%r)_n, (char *)va); /*0xffe65b19*/
 }
 return result; /*0xffe65b1e*/
}

/*
 *DebugAssert at 0xffe65b20
 */
int DebugAssert(
 int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 int n48,
 int PeiServices____((void__)_0))
{
 int result; // eax result = DebugGetPpi(); /*0xffe65b26*/
 if ( result ) /*0xffe65b2d*/
 return (*(int ( **)(int, int, int))(result + 4))( /*0xffe65b35*/
 e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 n48,
 PeiServices____((void__)_0));
 return result; /*0xffe65b3b*/
}

/*
 *DebugPrint at 0xffe65b3e
 */
int DebugPrint(int a1, EFI_SYSTEM_TABLE *SystemTable, char *CmosManagerPeiEntry_Entry_n, ...)
{
 int result; // eax char *CmosManagerPeiEntry_Entry_n_1; // eax va_list va; // [esp+18h] [ebp+14h] BYREF va_start(va, CmosManagerPeiEntry_Entry_n);
 result = (*(int (__stdcall **)(EFI_SYSTEM_TABLE *))(LODWORD(SystemTable->Hdr.Signature) + 32))(SystemTable); /*0xffe65b57*/
 if ( result >= 0 ) /*0xffe65b5f*/
 {
 if ( SystemTable ) /*0xffe65b67*/
 {
 result = PcdGetBool(); /*0xffe65b69*/
 if ( (result & a1) != 0 ) /*0xffe65b73*/
 {
 CmosManagerPeiEntry_Entry_n_1 = CmosManagerPeiEntry_Entry_n; /*0xffe65b75*/
 if ( *CmosManagerPeiEntry_Entry_n ) /*0xffe65b78*/
 {
 do /*0xffe65b98*/
 {
 if ( *CmosManagerPeiEntry_Entry_n_1 == 37 ) /*0xffe65b80*/
 {
 if ( *++CmosManagerPeiEntry_Entry_n_1 == 115 ) /*0xffe65b88*/
 {
 *CmosManagerPeiEntry_Entry_n_1 = 97; /*0xffe65b8a*/
 }
 else if ( *CmosManagerPeiEntry_Entry_n_1 == 71 ) /*0xffe65b92*/
 {
 *CmosManagerPeiEntry_Entry_n_1 = 103; /*0xffe65b94*/
 }
 }
 ++CmosManagerPeiEntry_Entry_n_1; /*0xffe65b97*/
 }
 while ( *CmosManagerPeiEntry_Entry_n_1 ); /*0xffe65b98*/
 CmosManagerPeiEntry_Entry_n_1 = CmosManagerPeiEntry_Entry_n; /*0xffe65b9d*/
 }
 return ((int ( *)(int, char *, char *))LODWORD(SystemTable->Hdr.Signature))( /*0xffe65ba6*/
 a1,
 CmosManagerPeiEntry_Entry_n_1,
 (char *)va);
 }
 }
 }
 return result; /*0xffe65bae*/
}

/*
 *DivU64x32 at 0xffe65bb0
 */
int DivU64x32(unsigned int _EDI, unsigned int *p_n0xA, int n0xA, int _EDX)
{
 int n0xA_1; // eax int n64; // ecx n0xA_1 = n0xA; /*0xffe65bbf*/
 _EDX = _EDX; /*0xffe65bc2*/
 _EDI = 0; /*0xffe65bc8*/
 n64 = 64; /*0xffe65bca*/
 do
 {
 __asm /*0xffe65bd1*/
 {
 rcl edx, 1 rcl edi, 1
 }
 n0xA_1 = 2 *n0xA_1 + (_EDI >= _EDI); /*0xffe65bda*/
 _EDI = _EDI - (_EDI >= _EDI ? _EDI : 0);
 --n64; /*0xffe65be0*/
 }
 while ( n64 );
 if ( p_n0xA ) /*0xffe65bf3*/
 *p_n0xA = _EDI; /*0xffe65bf8*/
 return n0xA_1; /*0xffe65bee*/
}

/*
 *NumberToString at 0xffe65c04
 */
_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); /*0xffe65c05*/
 if ( n0xA >= 0 ) /*0xffe65c16*/
 goto LABEL_2; /*0xffe65c16*/
 if ( n10 == 10 ) /*0xffe65c25*/
 {
 n0xA_1 = -(int)n0xA; /*0xffe65c2b*/
 _EDX = (unsigned __int64)-n0xA >> 32; /*0xffe65c30*/
 goto LABEL_8; /*0xffe65c32*/
 }
 if ( a4 ) /*0xffe65c39*/
LABEL_2:
 _EDX = HIDWORD(n0xA); /*0xffe65c1e*/
 else _EDX = 0; /*0xffe65c3b*/
 n0xA_1 = n0xA; /*0xffe65c3d*/
LABEL_8:
 if ( __PAIR64__(n0xA_1, _EDX) ) /*0xffe65c43*/
 {
 do /*0xffe65c6c*/
 {
 n0xA_1 = DivU64x32(n10, (unsigned int *)&n0xA, n0xA_1, _EDX); /*0xffe65c54*/
 if ( (unsigned int)n0xA >= 0xA ) /*0xffe65c5d*/
 v9 = n0xA + 87; /*0xffe65c63*/
 else v9 = n0xA + 48; /*0xffe65c5f*/
 *a1++ = v9; /*0xffe65c65*/
 }
 while ( __PAIR64__(n0xA_1, _EDX) ); /*0xffe65c6c*/
 }
 else
 {
 *a1++ = 48; /*0xffe65c70*/
 }
 if ( n10 == 10 && v4 < 0 ) /*0xffe65c7b*/
 *a1++ = 45; /*0xffe65c83*/
 *a1 = 0; /*0xffe65c88*/
 return a1 - 1; /*0xffe65c87*/
}

/*
 *NumberToStringReverse at 0xffe65c92
 */
char *NumberToStringReverse(char *a1, unsigned int n10, __int64 n0xA, char a4)
{
 char *v5; // esi char *v6; // eax char v7; // dl v5 = a1; /*0xffe65c9e*/
 v6 = NumberToString(a1, n10, n0xA, a4); /*0xffe65ca4*/
 if ( a1 < v6 ) /*0xffe65cae*/
 {
 do /*0xffe65cbc*/
 {
 v7 = *v5; /*0xffe65cb2*/
 *v5++ = *v6; /*0xffe65cb4*/
 *v6-- = v7; /*0xffe65cb7*/
 }
 while ( v5 < v6 ); /*0xffe65cbc*/
 }
 return a1; /*0xffe65cc0*/
}

/*
 *AsciiStrParseDecimal at 0xffe65cc3
 */
int AsciiStrParseDecimal(char *a1, char **p_%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x)
{
 char Ptr; // bl unsigned int n0x7FFFFFFF; // esi char n57; // al char n10; // al char v7; // [esp+Ch] [ebp-4h]

 Ptr = 1; /*0xffe65cc9*/
 v7 = 0; /*0xffe65ccd*/
 n0x7FFFFFFF = 0; /*0xffe65cd1*/
 while ( *a1 == 32 || *a1 == 9 ) /*0xffe65cdb*/
 ++a1; /*0xffe65cdd*/
 if ( !*a1 ) /*0xffe65ce0*/
 {
 *p_%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x = a1; /*0xffe65ce6*/
 return 0; /*0xffe65cea*/
 }
 if ( *a1 == 45 ) /*0xffe65cee*/
 {
 Ptr = -1; /*0xffe65cf0*/
 ++a1; /*0xffe65cf3*/
 }
 if ( *a1 == 43 ) /*0xffe65cf7*/
 ++a1; /*0xffe65cf9*/
 while ( 1 ) /*0xffe65d00*/
 {
 n57 = *a1; /*0xffe65d00*/
 if ( *a1 >= 48 && n57 <= 57 ) /*0xffe65d08*/
 {
 n10 = n57 - 48; /*0xffe65d0a*/
 goto LABEL_17; /*0xffe65d0c*/
 }
 if ( (n57 & 0xDFu) < 0x41 || (n57 & 0xDFu) > 0x5A ) /*0xffe65d1b*/
 break; /*0xffe65d1b*/
 n10 = (n57 & 0xDF) - 55; /*0xffe65d1f*/
LABEL_17:
 if ( n10 >= 10 ) /*0xffe65d27*/
 break; /*0xffe65d27*/
 n0x7FFFFFFF = n10 + 10 *n0x7FFFFFFF; /*0xffe65d2c*/
 if ( Ptr == 1 ) /*0xffe65d31*/
 {
 if ( n0x7FFFFFFF < 0x80000000 ) /*0xffe65d35*/
 goto LABEL_23; /*0xffe65d35*/
 }
 else if ( n0x7FFFFFFF <= 0x80000000 ) /*0xffe65d3b*/
 {
 goto LABEL_23; /*0xffe65d3b*/
 }
 v7 = 1; /*0xffe65d3d*/
LABEL_23:
 ++a1; /*0xffe65d42*/
 }
 *p_%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x = a1; /*0xffe65d45*/
 if ( v7 ) /*0xffe65d4c*/
 {
 n0x7FFFFFFF = 0x7FFFFFFF; /*0xffe65d4e*/
 if ( Ptr == -1 ) /*0xffe65d56*/
 n0x7FFFFFFF = 0x80000000; /*0xffe65d58*/
 }
 return n0x7FFFFFFF *Ptr; /*0xffe65d61*/
}

/*
 *AsciiStrToUpper at 0xffe65d66
 */
char *__thiscall AsciiStrToUpper(char *this)
{
 char *i; // eax char n122; // dl for ( i = this; *i; ++i ) /*0xffe65d66*/
 {
 n122 = *i; /*0xffe65d6d*/
 if ( *i >= 97 && n122 <= 122 ) /*0xffe65d77*/
 *i = n122 - 32; /*0xffe65d7c*/
 }
 return this; /*0xffe65d86*/
}

/*
 *StatusToString at 0xffe65d87
 */
char *StatusToString(unsigned int n2)
{
 unsigned int Ptr; // edx if ( !n2 ) /*0xffe65d89*/
 return "EFI_SUCCESS"; /*0xffe65d90*/
 if ( (n2 & 0x80000000) != 0 ) /*0xffe65d91*/
 {
 Ptr = n2 & 0x1FFFFFFF; /*0xffe65dc7*/
 if ( (n2 & 0xA0000000) == 0xA0000000 ) /*0xffe65dd0*/
 {
 if ( Ptr >= 3 ) /*0xffe65dd5*/
 return 0; /*0xffe65dd5*/
 // "EFI_INTERRUPT_PENDING"
 return &aEfiInterruptPe[25 *Ptr]; /*0xffe65dda*/
 }
 else if ( (n2 & 0xC0000000) == 0xC0000000 ) /*0xffe65de9*/
 {
 if ( Ptr > 2 ) /*0xffe65dee*/
 return 0; /*0xffe65dee*/
 // "ABLE_YET"
 return &aAbleYet[25 *Ptr]; /*0xffe65df3*/
 }
 else
 {
 if ( Ptr > 0x1E ) /*0xffe65dfd*/
 return 0; /*0xffe65dfd*/
 // "E_BOF"
 return &aEBof[25 *Ptr]; /*0xffe65e02*/
 }
 }
 else if ( (n2 & 0x20000000) != 0 ) /*0xffe65d99*/
 {
 if ( n2 >= 2 ) /*0xffe65d9e*/
 return 0; /*0xffe65da2*/
 // "EFI_WARN_INTERRUPT_SOURCE_PENDING"
 return &aEfiWarnInterru[35 *n2]; /*0xffe65da6*/
 }
 else
 {
 if ( n2 > 4 ) /*0xffe65daf*/
 return 0; /*0xffe65daf*/
 // "... DEBUG BUFFER OVERFLOW!!!\n"
 return &src[26 *n2 + 6]; /*0xffe65db4*/
 }
}

/*
 *AsciiSPrintFormat at 0xffe65e09
 */
int AsciiSPrintFormat(char *a1, int a2, char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, int va)
{
 char *v4; // ebx int v5; // edi char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1; // esi int *v7; // ecx int i_1; // edx char n37; // al char *v10; // esi int i_2; // edx int *v12; // ecx int m_2; // eax char n97; // ah char *k; // ecx unsigned __int8 *v16; // edi int Unaligned32; // ebx int Unaligned16; // esi int v19; // ecx int v20; // eax int n10_1; // eax char *v22; // eax char n105; // ah unsigned int n10_3; // eax int *v25; // ecx unsigned int n10_4; // edx char v27; // dl unsigned int m; // eax char *v29; // ecx char *j; // eax int v32; // [esp-1Ch] [ebp-6Ch]
 int v33; // [esp-18h] [ebp-68h]
 int v34; // [esp-14h] [ebp-64h]
 int v35; // [esp-10h] [ebp-60h]
 int v36; // [esp-Ch] [ebp-5Ch]
 __int64 n0xA; // [esp-Ch] [ebp-5Ch]
 int v38; // [esp-8h] [ebp-58h]
 int v39; // [esp-4h] [ebp-54h]
 int ... [11015 chars total]

/*
 *AsciiSPrint at 0xffe6617e
 */
int AsciiSPrint(char *a1, int a2, char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, ...)
{
 va_list va; // [esp+10h] [ebp+10h] BYREF va_start(va, %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x);
 return AsciiSPrintFormat(a1, a2, %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, (int)va); /*0xffe66196*/
}

/*
 *CmosIoReadWrite at 0xffe66197
 */
int CmosIoReadWrite(int a1, int a2, unsigned __int16 n0x7F, unsigned __int8 *a4)
{
 char v5; // al unsigned __int8 v6; // al if ( n0x7F > 0x7Fu ) /*0xffe661a2*/
 return -2147483646; /*0xffe661a4*/
 if ( n0x7F <= 9u && a2 == 1 ) /*0xffe661bd*/
 {
 do /*0xffe661cb*/
 {
 __outbyte(0x70u, 0x8Au); /*0xffe661c4*/
 v5 = __inbyte(0x71u); /*0xffe661c8*/
 }
 while ( v5 < 0 ); /*0xffe661cb*/
 }
 __outbyte(0x70u, n0x7F | 0x80); /*0xffe661d5*/
 if ( a2 == 1 ) /*0xffe661da*/
 {
 v6 = __inbyte(0x71u); /*0xffe661df*/
 *a4 = v6; /*0xffe661e3*/
 }
 else
 {
 __outbyte(0x71u, *a4); /*0xffe661ef*/
 }
 return 0; /*0xffe661a9*/
}

/*
 *CmosCheckPowerFail at 0xffe661f6
 */
int CmosCheckPowerFail()
{
 unsigned __int8 Result; // al __outbyte(0x70u, 0x8Du); /*0xffe661fe*/
 Result = __inbyte(0x71u); /*0xffe66205*/
 return Result >> 7; /*0xffe6620c*/
}

/*
 *MonotonicCounterCheck at 0xffe6620d
 */
char MonotonicCounterCheck(int a1)
{
 char Result; // bl _DWORD v3[4]; // [esp+4h] [ebp-18h] BYREF int n4; // [esp+14h] [ebp-8h] BYREF int ( **v5)(_DWORD, const __int16 *, _DWORD *, _DWORD, int *, int *); // [esp+18h] [ebp-4h] BYREF Result = 0; /*0xffe66217*/
 n4 = 4; /*0xffe66219*/
 v3[0] = 20351105; /*0xffe66220*/
 v3[1] = 1260242093; /*0xffe66227*/
 v3[2] = 2060792246; /*0xffe6622e*/
 v3[3] = 1809565838; /*0xffe66235*/
 v5 = 0; /*0xffe6623c*/
 if ( a1 /*0xffe66278*/
 && ((*(int ( **)(int, void *, _DWORD, _DWORD, int ( ***)(_DWORD, const __int16 *, _DWORD *, _DWORD, int *, int *)))(*(_DWORD *)a1 + 32))(
 a1,
 &unk_FFE66B9C,
 0,
 0,
 &v5) < 0
 || (*v5)(v5, L"MonotonicCounter", v3, 0, &n4, &a1) < 0) )
 {
 return 1; /*0xffe6627a*/
 }
 return Result; /*0xffe6627e*/
}

/*
 *PlatformReturnTrue at 0xffe66283
 */
char PlatformReturnTrue()
{
 return 1; /*0xffe66285*/
}

/*
 *CmosExtIoReadWrite at 0xffe66286
 */
int CmosExtIoReadWrite(int a1, int a2, __int16 a3, unsigned __int8 *a4)
{
 unsigned __int8 v4; // al if ( (unsigned __int16)(a3 - 128) > 0x7Fu ) /*0xffe66291*/
 return -2147483646; /*0xffe662c0*/
 __outbyte(0x72u, a3); /*0xffe66299*/
 if ( a2 == 1 ) /*0xffe6629f*/
 {
 v4 = __inbyte(0x73u); /*0xffe662a7*/
 *a4 = v4; /*0xffe662ac*/
 }
 else
 {
 __outbyte(0x73u, *a4); /*0xffe662bc*/
 }
 return 0; /*0xffe662bf*/
}

/*
 *PcdSetBit at 0xffe662c6
 */
char PcdSetBit()
{
 int Result; // ecx char result; // al Result = PcdGetPtr(); /*0xffe662cb*/
 result = *(_BYTE *)(Result + 1024068) | 0x80; /*0xffe662d3*/
 *(_BYTE *)(Result + 1024068) = result; /*0xffe662d5*/
 return result; /*0xffe662db*/
}

/*
 *PcdGetBool at 0xffe6630c
 */
int PcdGetBool()
{
 unsigned __int8 v0; // al char Result; // al char n3_1; // cl v0 = __inbyte(0x70u); /*0xffe66312*/
 __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffe66317*/
 Result = __inbyte(0x71u); /*0xffe6631e*/
 n3_1 = Result; /*0xffe6631f*/
 if ( (unsigned __int8)Result <= 3u ) /*0xffe66324*/
 {
LABEL_4:
 if ( !n3_1 ) /*0xffe6633f*/
 return 0; /*0xffe6633f*/
 goto LABEL_5; /*0xffe6633f*/
 }
 n3_1 = Result; /*0xffe66326*/
 if ( !Result ) /*0xffe6632e*/
 {
 n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffe6633a*/
 goto LABEL_4; /*0xffe6633a*/
 }
LABEL_5:
 if ( n3_1 != -1 )
 return n3_1 != 1 ? -2147483578 : -2147483644;
 return 0; /*0xffe66357*/
}

/*
 *ReadUnaligned16 at 0xffe6635b
 */
__int16 __thiscall ReadUnaligned16(void *this)
{
 int Ppi; // eax if ( !this ) /*0xffe66360*/
 {
 Ppi = DebugGetPpi(); /*0xffe66362*/
 if ( Ppi ) /*0xffe66369*/
 (*(void ( **)(const char *, int, const char *))(Ppi + 4))( /*0xffe66377*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 38,
 "Buffer != ((void *) 0)");
 }
 return *(_WORD *)this; /*0xffe66380*/
}

/*
 *ReadUnaligned32 at 0xffe66382
 */
int __thiscall ReadUnaligned32(void *this)
{
 int Ppi; // eax if ( !this ) /*0xffe66387*/
 {
 Ppi = DebugGetPpi(); /*0xffe66389*/
 if ( Ppi ) /*0xffe66390*/
 (*(void ( **)(const char *, int, const char *))(Ppi + 4))( /*0xffe663a1*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 141,
 "Buffer != ((void *) 0)");
 }
 return *(_DWORD *)this; /*0xffe663a9*/
}

/*
 *PeiServicesGetPtr at 0xffe663c8
 */
int PeiServicesGetPtr()
{
 int Result; // esi _BYTE v2[2]; // [esp+4h] [ebp-8h] BYREF int v3; // [esp+6h] [ebp-6h]

 ReadIdtr(v2); /*0xffe663d1*/
 Result = *(_DWORD *)(v3 - 4); /*0xffe663d9*/
 if ( !Result ) /*0xffe663de*/
 DebugAssert( /*0xffe663ed*/
 (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c",
 48,
 (int)"PeiServices != ((void *) 0)");
 return Result; /*0xffe663f5*/
}

/*
 *PcdGetPtr at 0xffe663fa
 */
int __thiscall PcdGetPtr(void *this)
{
 int ( **Ptr)(int); // eax Ptr = (int ( **)(int))PeiPcdGetPtr(this); /*0xffe663fa*/
 return Ptr[4](5); /*0xffe66405*/
}

/*
 *PcdSet16 at 0xffe66406
 */
int __thiscall PcdSet16(void *this)
{
 int v1; // ebx int Ppi; // eax v1 = PcdGetPtr(this) + 1024064; /*0xffe662dd*/
 if ( (v1 & 1) != 0 ) /*0xffe662e2*/
 {
 Ppi = DebugGetPpi(); /*0xffe662e4*/
 if ( Ppi ) /*0xffe662eb*/
 (*(void ( **)(const char *, int, const char *))(Ppi + 4))( /*0xffe662fc*/
 "e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c",
 183,
 "(Address & 1) == 0");
 }
 *(_WORD *)v1 = 1280; /*0xffe66307*/
 return 1280; /*0xffe6630b*/
}

/*
 *ReadIdtr at 0xffe66417
 */
void *__thiscall ReadIdtr(void *this)
{
 void *this_1; // eax if ( !this ) /*0xffe6641d*/
 DebugAssert((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); /*0xffe6642c*/
 this_1 = this; /*0xffe66432*/
 __sidt(this); /*0xffe66435*/
 return this_1; /*0xffe66439*/
}

/*
 *PeiPcdGetPtr at 0xffe6643a
 */
void *__thiscall PeiPcdGetPtr(void *this)
{
 int Ptr; // eax int Status; // eax int Ppi; // eax void *this_1; // [esp+0h] [ebp-4h]

 this_1 = this; /*0xffe6643d*/
 Ptr = PeiServicesGetPtr(); /*0xffe6643e*/
 Status = (*(int (__stdcall **)(int))(*(_DWORD *)Ptr + 32))(Ptr); /*0xffe66453*/
 if ( Status < 0 ) /*0xffe6645b*/
 {
 DebugVPrint(0x80000000, (int)"\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffe66468*/
 Ppi = DebugGetPpi(); /*0xffe66470*/
 if ( Ppi ) /*0xffe66477*/
 (*(void ( **)(const char *, int, const char *))(Ppi + 4))( /*0xffe66485*/
 "e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c",
 49,
 "!EFI_ERROR (Status)");
 }
 return this_1; /*0xffe66490*/
}

/*
 *SetMemM at 0xffe664a6
 */
char *__usercall SetMemM@<eax>(int value@<eax>, char *buf, unsigned int n220, char a4)
{
 unsigned int n220_1; // ecx char *buf_1; // edi __int16 value_1; // bx int value_2; // eax int v8; // edx char n220_2; // dl unsigned int count; // ecx n220_1 = n220; /*0xffe664a6*/
 LOBYTE(value) = a4; /*0xffe664aa*/
 buf_1 = buf; /*0xffe664af*/
 BYTE1(value) = a4; /*0xffe664b8*/
 value_1 = value; /*0xffe664ba*/
 value_2 = value << 16; /*0xffe664bd*/
 LOWORD(value_2) = value_1; /*0xffe664c0*/
 if ( n220 >= 4 ) /*0xffe664c6*/
 {
 v8 = (unsigned __int8)buf & 3; /*0xffe664ca*/
 if ( ((unsigned __int8)buf & 3) != 0 ) /*0xffe664cd*/
 {
 memset(buf, value_1, 4 - v8); /*0xffe664d8*/
 buf_1 = &buf[4 - v8]; /*0xffe664d8*/
 n220_1 = n220 - (4 - v8); /*0xffe664da*/
 }
 n220_2 = n220_1; /*0xffe664dc*/
 count = n220_1 >> 2; /*0xffe664de*/
 memset32(buf_1, value_2, count); /*0xffe664e1*/
 buf_1 += 4 *count; /*0xffe664e1*/
 n220_1 = n220_2 & 3; /*0xffe664e6*/
 }
 memset(buf_1, value_1, n220_1); /*0xffe664e8*/
 return buf; /*0xffe664ec*/
}

/*
 *CopyMemOverlap at 0xffe664fc
 */
unsigned int CopyMemOverlap(unsigned int dst, char *src, unsigned int n4)
{
 char *src_1; // esi unsigned int dst_1; // edi unsigned int n4_1; // ecx char v10; // dl char *n4_2; // eax unsigned int count; // eax int count_1; // ebx char n4_3; // al unsigned int Ptr; // ecx int n4_4; // eax __asm { pushfw } /*0xffe66502*/
 src_1 = src; /*0xffe66507*/
 dst_1 = dst; /*0xffe6650a*/
 n4_1 = n4; /*0xffe6650d*/
 v10 = 0; /*0xffe66510*/
 n4_2 = &src[-dst]; /*0xffe66514*/
 if ( (unsigned int)src < dst ) /*0xffe66516*/
 {
 n4_2 = (char *)(dst - (_DWORD)src); /*0xffe6651b*/
 if ( (unsigned int)&src[n4] >= dst ) /*0xffe6651f*/
 {
 src_1 = &src[n4]; /*0xffe66521*/
 dst_1 = n4 + dst; /*0xffe66523*/
 v10 = 1; /*0xffe66526*/
 }
 }
 if ( n4 < 4 || (unsigned int)n4_2 < 4 ) /*0xffe66531*/
 goto LABEL_19; /*0xffe66531*/
 count = (unsigned __int8)src_1 & 3; /*0xffe66537*/
 count_1 = dst_1 & 3; /*0xffe6653a*/
 if ( v10 ) /*0xffe6653f*/
 {
 --src_1; /*0xffe66541*/
 --dst_1; /*0xffe66542*/
 }
 if ( count == count_1 && count ) /*0xffe66549*/
 {
 if ( !v10 ) /*0xffe6654d*/
 count = 4 - count; /*0xffe66551*/
 qmemcpy((void *)dst_1, src_1, count); /*0xffe66557*/
 src_1 += count; /*0xffe66557*/
 dst_1 += count; /*0xffe66557*/
 n4_1 = n4 - count; /*0xffe66559*/
 }
 if ( v10 ) /*0xffe6655d*/
 {
 src_1 -= 3; /*0xffe6655f*/
 dst_1 -= 3; /*0xffe66562*/
 }
 n4_3 = n4_1; /*0xffe66565*/
 Ptr = n4_1 >> 2; /*0xffe66567*/
 qmemcpy((void *)dst_1, src_1, 4 *Ptr); /*0xffe6656a*/
 src_1 += 4 *Ptr; /*0xffe6656a*/
 dst_1 += 4 *Ptr; /*0xffe6656a*/
 n4_4 = n4_3 & 3; /*0xffe6656c*/
 if ( n4_4 ) /*0xffe6656f*/
 {
 if ( v10 ) /*0xffe66573*/
 {
 src_1 += 4; /*0xffe66575*/
 dst_1 += 4; /*0xffe66578*/
 }
 n4_1 = n4_4; /*0xffe6657b*/
LABEL_19:
 if ( v10 ) /*0xffe6657f*/
 {
 --src_1; /*0xffe66581*/
 --dst_1; /*0xffe66582*/
 }
 qmemcpy((void *)dst_1, src_1, n4_1); /*0xffe66583*/
 }
 __asm { popfw } /*0xffe66585*/
 return dst; /*0xffe66588*/
}