Newer
Older
AMI-Aptio-BIOS-Reversed / UsbRtDxe / UsbRtDxe.c
@Ajax Dong Ajax Dong 2 days ago 434 KB Init
#include "UsbRtDxe.h"

//
// UsbRtDxe - UEFI Module
// Total functions: 265
//

// Function: MemMove @ 0x300 (0x42 bytes)

char *__fastcall MemMove(char *dst, char *src, unsigned __int64 count)
{
  char *dst_1; // rax
  unsigned __int64 count_1; // rcx
  char *dst_2; // rdi
  char *src_1; // rsi

  dst_1 = dst; /*0x310*/
  if ( src < dst && &src[count - 1] >= dst ) /*0x318*/
  {
    src_1 = &src[count - 1]; /*0x330*/
    dst_2 = &dst[count - 1]; /*0x333*/
  }
  else
  {
    count_1 = count; /*0x31a*/
    count &= 7u; /*0x31d*/
    count_1 >>= 3; /*0x324*/
    qmemcpy(dst, src, 8 * count_1); /*0x328*/
    src_1 = &src[8 * count_1]; /*0x328*/
    dst_2 = &dst[8 * count_1]; /*0x328*/
  }
  qmemcpy(dst_2, src_1, count); /*0x33c*/
  return dst_1; /*0x33f*/
}


// Function: MemCompare @ 0x350 (0x1d bytes)

unsigned __int64 __fastcall MemCompare(_BYTE *a1, _BYTE *a2, __int64 a3)
{
  bool v6; // zf

  do /*0x35b*/
  {
    if ( !a3 ) /*0x35b*/
      break; /*0x35b*/
    v6 = *a1++ == *a2++; /*0x35b*/
    --a3; /*0x35b*/
  }
  while ( v6 ); /*0x35b*/
  return (unsigned __int8)*(a1 - 1) - (unsigned __int64)(unsigned __int8)*(a2 - 1); /*0x36a*/
}


// Function: ModuleEntryPoint @ 0x400 (0xa6 bytes)

EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  signed __int64 Status; // rbx
  __int64 *v5; // [rsp+40h] [rbp+18h] BYREF

  UsbDriverEntryPoint((__int64)ImageHandle, SystemTable); /*0x409*/
  if ( !::SystemTable ) /*0x416*/
  {
    ::SystemTable = (__int64)SystemTable; /*0x418*/
    RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x423*/
  }
  Status = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 **))(BootServices + 320))(&UsbRtProtocolHandle, 0, &v5); /*0x445*/
  if ( Status >= 0 ) /*0x44b*/
  {
    UsbRtDispatchTable = *v5; /*0x45c*/
    v5[15] = (__int64)UsbApiHandler; /*0x463*/
  }
  UsbIdleTimerProc(); /*0x467*/
  if ( Status < 0 ) /*0x46f*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x480*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 191, (__int64)"!EFI_ERROR (Status)"); /*0x498*/
  }
  return Status; /*0x4a0*/
}


// Function: UsbDriverEntryPoint @ 0x4a8 (0x154 bytes)

__int64 __fastcall UsbDriverEntryPoint(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  __int64 PcdHandle; // rax
  UINTN Port; // rax
  UINT8 Value; // dl
  _BYTE *PciReg; // rax
  __int16 Features; // bx
  bool IsXhci; // bl
  UINT32 TimeoutCounter; // edi

  ::ImageHandle = ImageHandle; /*0x4b7*/
  if ( !ImageHandle ) /*0x4cb*/
    Assert( /*0x4da*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
      51,
      (__int64)"gImageHandle != ((void *) 0)");
  SystemTable_0 = (__int64)SystemTable; /*0x4df*/
  if ( !SystemTable ) /*0x4e9*/
    Assert( /*0x4f8*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
      57,
      (__int64)"gST != ((void *) 0)");
  BootServices = (__int64)SystemTable->BootServices; /*0x501*/
  if ( !BootServices ) /*0x50b*/
    Assert( /*0x51a*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
      63,
      (__int64)"gBS != ((void *) 0)");
  RuntimeServices_0 = (__int64)SystemTable->RuntimeServices; /*0x523*/
  if ( !RuntimeServices_0 ) /*0x52d*/
    Assert( /*0x540*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
      47,
      (__int64)"gRT != ((void *) 0)");
  HobLibGetHobList(ImageHandle); /*0x545*/
  PcdHandle = PcdGet32(); /*0x54a*/
  gXhciBase = (*(__int64 (__fastcall **)(__int64))(PcdHandle + 32))(5); /*0x55c*/
  if ( *(char *)PciExpressRead(1024068) >= 0 ) /*0x56e*/
  {
    Port = PciExpressRead(1024064); /*0x573*/
    IoWrite8(Port, Value); /*0x57b*/
    PciReg = (_BYTE *)PciExpressRead(1024068); /*0x582*/
    *PciReg |= 0x80u; /*0x58c*/
  }
  Features = sub_3F0(); /*0x593*/
  sub_3E0(); /*0x596*/
  IsXhci = (Features & 0x200) != 0; /*0x5a5*/
  TimeoutCounter = IoRead32(0x508u) & 0xFFFFFF; /*0x5af*/
  sub_3C0(); /*0x5b5*/
  while ( ((TimeoutCounter + 357 - IoRead32(0x508u)) & 0x800000) == 0 ) /*0x5d5*/
    sub_3B0(); /*0x5bc*/
  sub_3C0(); /*0x5d7*/
  if ( IsXhci ) /*0x5de*/
    return sub_3D0(); /*0x5e0*/
  else
    return sub_3E0(); /*0x5e7*/
}


// Function: UsbApiInstallHandlers @ 0x5fc (0x5bd bytes)

_QWORD *UsbApiInstallHandlers()
{
  _QWORD *DispatchTable; // rax
  _QWORD *UsbRtDispatchTable; // rax
  _QWORD *UsbRtDispatchTable_1; // rax
  _QWORD *UsbRtDispatchTable_2; // rax

  DispatchTable = (_QWORD *)UsbRtDispatchTable; /*0x615*/
  *(_QWORD *)(UsbRtDispatchTable + 920) = UhciInitController; /*0x638*/
  DispatchTable[126] = UsbNullFuncRet0; /*0x64d*/
  DispatchTable[116] = UhciStartHc; /*0x654*/
  DispatchTable[130] = UsbNullFunc; /*0x669*/
  DispatchTable[117] = UhciStopHc; /*0x670*/
  DispatchTable[118] = UhciResetHc; /*0x67e*/
  DispatchTable[119] = UsbNullFunc; /*0x68c*/
  DispatchTable[120] = UhciTransfer; /*0x69a*/
  DispatchTable[121] = UhciPortStatus; /*0x6a8*/
  DispatchTable[122] = UhciPortReset; /*0x6b6*/
  DispatchTable[123] = UhciPortDisconnect; /*0x6c4*/
  DispatchTable[124] = SysKbcDriverEntry; /*0x6d2*/
  DispatchTable[125] = SysKbcDataHandler; /*0x6e0*/
  DispatchTable[127] = SysKbcDecodeKey; /*0x6ee*/
  DispatchTable[128] = SysKbcBuildKeyCode; /*0x6fc*/
  Dis... [6295 chars total]


// Function: UsbIdleTimerProc @ 0xbbc (0x2a5 bytes)

__int64 UsbIdleTimerProc()
{
  __int64 DriverIndex; // rsi
  __int64 IsrLoopIndex; // rbp
  __int64 DriverOffset; // rdi
  __int64 IsrSlotOffset; // rbx
  __int64 (__fastcall **IsrFuncTable)(); // r14
  void (*IsrFunc)(void); // rcx
  __int64 (__fastcall **DevCheckTable)(); // rbx
  void (*DevCheckFunc)(void); // rcx
  UINT8 FillData; // r8
  __int64 AllocStatus; // rax
  UINT8 FillData_0; // r8
  __int64 AllocStatus2; // rax
  void *Buffer; // [rsp+40h] [rbp+8h] BYREF

  UsbApiInstallHandlers(); /*0xbd4*/
  DriverIndex = 7; /*0xbd9*/
  IsrLoopIndex = 7; /*0xbe5*/
  DriverOffset = 336; /*0xbe7*/
  if ( UsbMsIsrHandler ) /*0xbf3*/
  {
    IsrSlotOffset = 336; /*0xbf5*/
    IsrFuncTable = &IsrCheckFuncTable; /*0xbf7*/
    while ( IsrLoopIndex != 14 ) /*0xc02*/
    {
      ((void (__fastcall *)(__int64))*IsrFuncTable)(IsrSlotOffset + UsbRtDispatchTable + 2384); /*0xc15*/
      IsrFunc = *(void (**)(void))(IsrSlotOffset + UsbRtDispatchTable + 2392); /*0xc1f*/
      if ( IsrFunc ) /*0xc2a*/
        IsrFunc(); /*0xc2c*/
      if ( *(_BYTE *)(IsrSlotOffset + UsbRtDispatchTable + 2384) ) /*0xc35*/
      {
        ++IsrLoopIndex; /*0xc3f*/
        ++IsrFuncTable; /*0xc42*/
        IsrSlotOffset += 48; /*0xc46*/
      }
      if ( !*IsrFuncTable ) /*0xc4a*/
      {
        if ( IsrLoopIndex != 14 ) /*0xc54*/
          goto LABEL_11; /*0xc54*/
        break; /*0xc54*/
      }
    }
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 247, (__int64)"DelayedIndex != MaxIndex"); /*0xc56*/
  }
LABEL_11:
  if ( ElibCheckDevReady ) /*0xc78*/
  {
    DevCheckTable = &DevReadyCheckFuncTable; /*0xc7a*/
    while ( DriverIndex != 14 ) /*0xc85*/
    {
      ((void (__fastcall *)(__int64))*DevCheckTable)(DriverOffset + UsbRtDispatchTable + 1712); /*0xc98*/
      DevCheckFunc = *(void (**)(void))(DriverOffset + UsbRtDispatchTable + 1720); /*0xca1*/
      if ( DevCheckFunc ) /*0xcac*/
        DevCheckFunc(); /*0xcae*/
      if ( *(_BYTE *)(DriverOffset + UsbRtDispatchTable + 1712) ) /*0xcb7*/
      {
        ++DriverIndex; /*0xcc1*/
        ++DevCheckTable; /*0xcc4*/
        DriverOffset += 48; /*0xcc8*/
      }
      if ( !*DevCheckTable ) /*0xccc*/
      {
        if ( DriverIndex != 14 ) /*0xcd6*/
          goto LABEL_21; /*0xcd6*/
        break; /*0xcd6*/
      }
    }
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 265, (__int64)"DriverIndex != MaxIndex"); /*0xcd8*/
  }
LABEL_21:
  if ( !*(_QWORD *)(UsbRtDispatchTable + 30352) ) /*0xd06*/
  {
    Buffer = (void *)0xFFFFFFFFLL; /*0xd23*/
    if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, void **))(BootServices + 40))(1, 6, 1, &Buffer) < 0 ) /*0xd33*/
    {
      AllocStatus = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, void **))(BootServices + 40))(0, 6, 1, &Buffer); /*0xd48*/
      if ( AllocStatus < 0 ) /*0xd4e*/
      {
        DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", AllocStatus); /*0xd5c*/
        Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 283, (__int64)"!EFI_ERROR (Status)"); /*0xd74*/
      }
    }
    *(_QWORD *)(UsbRtDispatchTable + 30352) = Buffer; /*0xd8a*/
    SetMem(Buffer, 0x1000u, FillData); /*0xd96*/
  }
  if ( !*(_QWORD *)(UsbRtDispatchTable + 30344) ) /*0xda2*/
  {
    Buffer = (void *)0xFFFFFFFFLL; /*0xdbf*/
    if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, void **))(BootServices + 40))(1, 6, 1, &Buffer) < 0 ) /*0xdcf*/
    {
      AllocStatus2 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, void **))(BootServices + 40))( /*0xde4*/
                       0,
                       6,
                       1,
                       &Buffer);
      if ( AllocStatus2 < 0 ) /*0xdea*/
      {
        DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", AllocStatus2); /*0xdf9*/
        Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\AmiUsb.c", 302, (__int64)"!EFI_ERROR (Status)"); /*0xe11*/
      }
    }
    *(_QWORD *)(UsbRtDispatchTable + 30344) = Buffer; /*0xe27*/
    SetMem(Buffer, 0x80u, FillData_0); /*0xe33*/
  }
  *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xe4e*/
  return 0; /*0xe57*/
}


// Function: UsbApiHandler @ 0xe64 (0x49 bytes)

void __fastcall UsbApiHandler(unsigned __int8 *ApiPacket)
{
  unsigned __int8 ApiCmd; // dl

  if ( ApiPacket ) /*0xe67*/
  {
    ApiCmd = *ApiPacket; /*0xe6e*/
    if ( *ApiPacket ) /*0xe6e*/
    {
      if ( (unsigned __int8)(ApiCmd - 32) > 0x17u ) /*0xe7c*/
      {
        DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UsbApiHandler Invalid function#%x\n", ApiCmd); /*0xe8d*/
        return; /*0xe92*/
      }
      ApiCmd -= 31; /*0xe94*/
    }
    ((void (__fastcall *)(__int64))funcs_EA1[ApiCmd])((__int64)ApiPacket); /*0xea1*/
    *ApiPacket = 0; /*0xea4*/
  }
}


// Function: UsbFindActiveHc @ 0x25b8 (0x3c bytes)

__int64 UsbFindActiveHc()
{
  unsigned __int8 DevIdx; // dl
  unsigned __int8 DevCount; // r8
  __int64 DevIdx_1; // rax
  __int64 DevPtr; // r9

  DevIdx = 0; /*0x25bf*/
  DevCount = *(_BYTE *)(UsbRtDispatchTable + 27704); /*0x25c1*/
  if ( DevCount ) /*0x25cb*/
  {
    while ( 1 ) /*0x25d4*/
    {
      DevIdx_1 = DevIdx; /*0x25d4*/
      DevPtr = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * DevIdx); /*0x25d7*/
      if ( DevPtr ) /*0x25de*/
      {
        if ( (*(_BYTE *)(DevPtr + 64) & 1) != 0 ) /*0x25e5*/
          break; /*0x25e5*/
      }
      if ( ++DevIdx >= DevCount ) /*0x25ec*/
        goto LABEL_5; /*0x25ec*/
    }
  }
  else
  {
LABEL_5:
    *(_DWORD *)(UsbRtDispatchTable + 4) &= ~0x80u; /*0x25ee*/
  }
  return DevIdx_1; /*0x25f3*/
}


// Function: UsbGetInfo_12 @ 0x26a8 (0x40 bytes)

__int64 __fastcall UsbGetInfo_12(__int64 UsbHcPtr, __int64 EndpointAddr, __int64 CmdFlag, char FinalFlag)
{
  char CmdFlag_1; // r11

  CmdFlag_1 = CmdFlag; /*0x26ab*/
  if ( (EndpointAddr & 0x80u) == 0LL ) /*0x26b0*/
    JUMPOUT(0x11D00); /*0x11d00*/
  LOBYTE(CmdFlag) = FinalFlag; /*0x26b6*/
  LOBYTE(EndpointAddr) = CmdFlag_1; /*0x26bc*/
  return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(200LL
                                                              * (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4)
                                                              + UsbRtDispatchTable
                                                              + 168))(
           UsbHcPtr,
           EndpointAddr,
           CmdFlag);
}


// Function: UsbConfig_13 @ 0x26e8 (0xc6 bytes)

char __fastcall UsbConfig_13(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
  unsigned __int8 TmpR8_1; // di
  __int64 UsbRtDispatchTable; // rbp
  __int64 v6; // rsi
  char n4; // al

  TmpR8_1 = TmpR8; /*0x26fc*/
  if ( (TmpRdx & 0x80u) == 0LL ) /*0x2704*/
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x2730*/
    v6 = FwVolDriverEntry(16, 0, TmpRdx, UsbHcPtr); /*0x2746*/
    if ( (*(_WORD *)(v6 + 108) & 0x800) == 0 || TmpR8_1 != UsbHcPtr[69] ) /*0x2758*/
    {
      n4 = *(_BYTE *)(v6 + 14); /*0x275a*/
      if ( n4 != 4 && n4 != 64 ) /*0x2763*/
      {
        HcMemoryRead((__int64)UsbHcPtr, v6, TmpR8_1, UsbRtDispatchTable + 29904); /*0x2775*/
        if ( (*(_BYTE *)(UsbRtDispatchTable + 29904) & 2) != 0 ) /*0x2781*/
          HcMemoryWrite((__int64)UsbHcPtr, v6, TmpR8_1, 1); /*0x2792*/
      }
    }
  }
  else
  {
    LOBYTE(TmpRdx) = TmpR8; /*0x270a*/
    (*(void (__fastcall **)(_BYTE *, __int64))(200LL * ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4) + 4) /*0x2726*/
                                             + UsbRtDispatchTable
                                             + 176))(
      UsbHcPtr,
      TmpRdx);
  }
  return 0; /*0x27a8*/
}


// Function: UsbConfig_16 @ 0x27b0 (0x93 bytes)

char __fastcall UsbConfig_16(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
  char v3; // bl
  char TmpR8_1; // si
  __int64 dst; // rax
  __int64 n256; // r8

  v3 = 0; /*0x27bf*/
  TmpR8_1 = TmpR8; /*0x27c1*/
  if ( (TmpRdx & 0x80u) == 0LL ) /*0x27c9*/
  {
    dst = FwVolDriverEntry(16, 0, TmpRdx, UsbHcPtr); /*0x27ff*/
    if ( !dst ) /*0x2807*/
      return -1; /*0x2809*/
    if ( (*(_WORD *)(dst + 108) & 0x800) == 0 || TmpR8_1 != UsbHcPtr[69] ) /*0x281c*/
    {
      LOBYTE(n256) = TmpR8_1; /*0x2821*/
      return DebugLogPrint_2(UsbHcPtr, dst, n256, 0); /*0x282f*/
    }
    return v3; /*0x2831*/
  }
  else
  {
    LOBYTE(TmpRdx) = TmpR8; /*0x27cf*/
    return (*(__int64 (__fastcall **)(_BYTE *, __int64))(200LL * ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4) + 4) /*0x27eb*/
                                                       + UsbRtDispatchTable
                                                       + 280))(
             UsbHcPtr,
             TmpRdx);
  }
}


// Function: UsbGetInfo @ 0x2844 (0x708 bytes)

__int64 __fastcall UsbGetInfo(_BYTE *UsbHcPtr, char PortNum, char EndpointAddr, unsigned int n255)
{
  int v4; // eax
  __int64 src; // rdi
  __int64 n2_1; // rsi
  unsigned __int8 n4; // al
  unsigned __int64 v10; // r14
  __int64 n2; // rbp
  __int16 v13; // bx
  __int64 v14; // rax
  __int16 n64; // ax
  bool v16; // cc
  unsigned __int8 i; // bl
  __int64 BootServices; // rax
  char *src_3; // rax
  char *src_1; // rbx
  __int16 v21; // r8
  unsigned __int8 v22; // r13
  __int64 UsbRtDispatchTable_2; // rax
  __int16 v24; // dx
  _QWORD *v25; // rcx
  bool v26; // zf
  __int64 v27; // rax
  __int64 p_n2047_1; // rax
  unsigned __int8 *p_n2047; // rbx
  unsigned __int16 n2047; // bp
  unsigned __int16 n2047_1; // dx
  unsigned __int8 *v32; // r8
  unsigned __int16 n2047_2; // r15
  int v34; // r13d
  unsigned __int8 *v35; // r14
  int v36; // r9d
  int v37; // r8d
  _BYTE *src_2; // rax
  char v39; // dl
  __int64 UsbRtDispatchTable; // rcx
  __int64 TmpRdx; // rdx
  __int64 TmpR8; ... [11607 chars total]


// Function: DebugLogPrint_4 @ 0x2f4c (0x192 bytes)

char __fastcall DebugLogPrint_4(__int64 i, __int64 HcType, char PortFlag)
{
  char HcType_1; // r13
  char Result; // bp
  unsigned __int8 DevIdx; // si
  __int64 DevOffset; // r14
  __int64 DevEntry; // rdi
  __int64 CallStatus; // rax
  void (__fastcall *NotifyFunc)(__int64); // rax
  char Result_1; // al
  unsigned __int8 SlotFlags; // al
  __int64 UsbRtDispatchTable; // rbx

  HcType_1 = HcType; /*0x2f6b*/
  Result = -1; /*0x2f71*/
  DevIdx = 1; /*0x2f74*/
  DevOffset = 448; /*0x2f77*/
  do
  {
    DevEntry = DevOffset + UsbRtDispatchTable + 3056; /*0x2f8b*/
    if ( (*(_DWORD *)DevEntry & 0x21) == 1
      && *(_BYTE *)(DevEntry + 12) == HcType_1
      && *(_BYTE *)(DevEntry + 13) == PortFlag )
    {
      if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 /*0x2fbf*/
        && (*(_DWORD *)DevEntry & 0x100) == 0
        && (*(_BYTE *)DevEntry & 0x40) != 0 )
      {
        UsbCleanupDeviceEntry((_DWORD *)(DevOffset + UsbRtDispatchTable + 3056)); /*0x2fc4*/
        *(_DWORD *)DevEntry |= 0x100u; /*0x2fc9*/
      }
      CallStatus = UsbFindDeviceByHcPtr(*(_QWORD *)(DevEntry + 120)); /*0x2fd1*/
      if ( CallStatus && (NotifyFunc = *(void (__fastcall **)(__int64))(CallStatus + 32)) != 0 ) /*0x2fe2*/
      {
        NotifyFunc(DevEntry); /*0x2fe7*/
        *(_QWORD *)(DevEntry + 120) = 0; /*0x2fe9*/
      }
      else if ( *(_BYTE *)(DevEntry + 64) ) /*0x2ff0*/
      {
        (*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(i + 1) - 16) >> 4) + 4) /*0x301a*/
                                                 + UsbRtDispatchTable
                                                 + 224))(
          i,
          DevEntry);
        *(_BYTE *)(DevEntry + 64) = 0; /*0x3022*/
      }
      Result_1 = (*(__int64 (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(i + 1) - 16) >> 4) + 4) /*0x304a*/
                                                             + UsbRtDispatchTable
                                                             + 272))(
                   i,
                   DevEntry);
      *(_DWORD *)DevEntry &= ~0x80u; /*0x3052*/
      Result = Result_1; /*0x3056*/
      SlotFlags = *(_BYTE *)(DevEntry + 10); /*0x3059*/
      if ( SlotFlags ) /*0x305e*/
      {
        UsbRtDispatchTable = UsbRtDispatchTable; /*0x3060*/
        *(_QWORD *)(UsbRtDispatchTable + 29864) |= Assert_0(1, SlotFlags); /*0x3074*/
        *(_BYTE *)(DevEntry + 10) = 0; /*0x307b*/
      }
      *(_DWORD *)DevEntry &= ~2u; /*0x307f*/
      if ( (*(_DWORD *)DevEntry & 0x44) == 0 ) /*0x3086*/
        *(_DWORD *)DevEntry &= ~1u; /*0x308b*/
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Release Dev[%d]: %x, flag %x\n", DevIdx, DevEntry, *(_DWORD *)DevEntry);
    }
    ++DevIdx; /*0x30aa*/
    DevOffset += 448; /*0x30ad*/
  }
  while ( DevIdx < 0x37u );
  return Result; /*0x30d0*/
}


// Function: UsbGetInfo_13 @ 0x30e0 (0x3d bytes)

char __fastcall UsbGetInfo_13(_BYTE *UsbHcPtr, __int64 TmpRdx, __int64 TmpR8)
{
  char TmpR8_1; // bl
  char TmpRdx_1; // di
  __int64 HcType; // rdx

  TmpR8_1 = TmpR8; /*0x30ef*/
  TmpRdx_1 = TmpRdx; /*0x30f2*/
  UsbConfig_13(UsbHcPtr, TmpRdx, TmpR8); /*0x30f8*/
  LOBYTE(HcType) = TmpRdx_1; /*0x3100*/
  DebugLogPrint_4((__int64)UsbHcPtr, HcType, TmpR8_1); /*0x3106*/
  return 0; /*0x3117*/
}


// Function: DebugLogPrint_3 @ 0x3120 (0x1ed bytes)

char __fastcall DebugLogPrint_3(__int64 UsbHcPtr, __int64 PortNum, __int64 EndpointAddr)
{
  char EndpointAddr_1; // si
  char PortNum_1; // di
  unsigned __int8 RetryCnt; // bp
  int Status; // eax
  __int64 TmpRdx; // rdx
  __int64 TmpRcx; // rcx
  char Status_1; // r14
  __int64 TmpRdx_0; // rdx
  __int64 TmpR8; // r8
  __int64 TmpRdx_1; // rdx
  __int64 TmpR8_0; // r8
  unsigned int Info_12; // eax
  unsigned __int64 EnumResult; // rax
  __int64 TmpRdx_2; // rdx
  __int64 TmpR8_1; // r8
  __int64 TmpR8_2; // r8
  __int64 TmpRdx_3; // rdx
  __int64 TmpR8_3; // r8
  __int64 TmpRdx_4; // rdx

  EndpointAddr_1 = EndpointAddr; /*0x3138*/
  PortNum_1 = PortNum; /*0x313b*/
  for ( RetryCnt = 0; RetryCnt < 6u; ++RetryCnt ) /*0x3141*/
  {
    LOBYTE(EndpointAddr) = EndpointAddr_1; /*0x314d*/
    LOBYTE(PortNum) = PortNum_1; /*0x3150*/
    Status = UsbGetInfo_12(UsbHcPtr, PortNum, EndpointAddr, 1); /*0x3156*/
    Status_1 = Status; /*0x315b*/
    if ( Status == 255 ) /*0x3163*/
      return -1; /*0x3163*/
    if ( (Status & 0x40) == 0 ) /*0x316d*/
      return 0; /*0x316d*/
    LOBYTE(TmpRdx) = EndpointAddr_1; /*0x317b*/
    LOBYTE(TmpRcx) = PortNum_1; /*0x3183*/
    if ( UsbHidMatchDeviceTopology(TmpRcx, TmpRdx, *(_WORD *)(UsbHcPtr + 34), 0, 0) ) /*0x3186*/
    {
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Match the skip table ; skipping this device.\n"); /*0x3304*/
      return 0; /*0x3304*/
    }
    if ( !RetryCnt && (Status_1 & 0x10) == 0 ) /*0x319c*/
      return 0; /*0x319c*/
    LOBYTE(TmpR8) = EndpointAddr_1; /*0x31a2*/
    LOBYTE(TmpRdx_0) = PortNum_1; /*0x31a5*/
    if ( (Status_1 & 1) == 0 ) /*0x31af*/
    {
      UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x32e6*/
      DebugBeep(8u, 0x1000u); /*0x32f2*/
      return 0; /*0x32f7*/
    }
    if ( *(_BYTE *)(UsbRtDispatchTable + 30482) ) /*0x31bc*/
    {
      UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x32df*/
      return 0; /*0x32e4*/
    }
    UsbConfig_16((_BYTE *)UsbHcPtr, TmpRdx_0, TmpR8); /*0x31c9*/
    if ( PortNum_1 < 0 ) /*0x31d1*/
    {
      LOBYTE(TmpRdx_1) = EndpointAddr_1; /*0x31d7*/
      (*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4) /*0x31f6*/
                                               + UsbRtDispatchTable
                                               + 184))(
        UsbHcPtr,
        TmpRdx_1);
    }
    LOBYTE(TmpR8_0) = EndpointAddr_1; /*0x3201*/
    LOBYTE(TmpRdx_1) = PortNum_1; /*0x3204*/
    Info_12 = UsbGetInfo_12(UsbHcPtr, TmpRdx_1, TmpR8_0, 1); /*0x320a*/
    if ( Info_12 == 255 ) /*0x3214*/
      return -1; /*0x3214*/
    if ( (Info_12 & 0x40) == 0 ) /*0x321c*/
      return 0; /*0x321c*/
    if ( (Info_12 & 1) != 0 && (Info_12 & 0x20) != 0 ) /*0x3228*/
    {
      EnumResult = UsbGetInfo((_BYTE *)UsbHcPtr, PortNum_1, EndpointAddr_1, Info_12); /*0x3236*/
      if ( EnumResult != 2 ) /*0x323f*/
      {
        if ( !EnumResult ) /*0x32c9*/
          return -1; /*0x32c9*/
        if ( EnumResult <= 5 ) /*0x32cf*/
        {
          DebugBeep(0x10u, 0x4000u); /*0x32d8*/
          return -1; /*0x32dd*/
        }
        return 0; /*0x32cf*/
      }
      if ( RetryCnt >= 3u ) /*0x3249*/
      {
        LOBYTE(TmpR8_1) = EndpointAddr_1; /*0x324b*/
        LOBYTE(TmpRdx_2) = PortNum_1; /*0x324e*/
        UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_2, TmpR8_1); /*0x3254*/
      }
    }
    (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x3263*/
  }
  if ( RetryCnt == 6 ) /*0x3276*/
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Usb Device enumeration is failed.\n"); /*0x3287*/
    LOBYTE(TmpR8_2) = EndpointAddr_1; /*0x328c*/
    LOBYTE(TmpRdx_3) = PortNum_1; /*0x328f*/
    UsbConfig_13((_BYTE *)UsbHcPtr, TmpRdx_3, TmpR8_2); /*0x3295*/
    LOBYTE(TmpR8_3) = EndpointAddr_1; /*0x329d*/
    LOBYTE(TmpRdx_4) = PortNum_1; /*0x32a0*/
    UsbGetInfo_12(UsbHcPtr, TmpRdx_4, TmpR8_3, 1); /*0x32a6*/
    return -1; /*0x32ab*/
  }
  return 0; /*0x32bc*/
}


// Function: UsbConfig_1 @ 0x3310 (0x1d3 bytes)

__int64 __fastcall UsbConfig_1(unsigned __int16 RequestedBits)
{
  char Found; // bl
  unsigned __int8 BitIdx; // r8
  __int16 ConsecutiveCnt; // r10
  unsigned __int16 Position; // r11
  __int64 UsbRtDispatchTable; // rdi
  unsigned __int16 RequestedBits_1; // r9
  unsigned __int16 SegIdx; // r15
  unsigned int SegBits; // r14d
  unsigned __int16 CurSeg; // si
  unsigned __int16 CurSeg_3; // bp
  unsigned __int16 SegBits_1; // dx
  unsigned __int16 CurSeg_2; // cx
  int BitTestVal; // r12d
  unsigned __int16 RequestedBits_2; // r10
  int Mask; // edx
  unsigned __int16 CurSeg_1; // [rsp+50h] [rbp+8h]

  Found = 0; /*0x332f*/
  BitIdx = 0; /*0x3332*/
  ConsecutiveCnt = 0; /*0x3335*/
  Position = 0; /*0x3339*/
  if ( !RequestedBits ) /*0x3340*/
    return 0; /*0x34c4*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x3346*/
  RequestedBits_1 = RequestedBits + 1; /*0x3354*/
  SegIdx = 0; /*0x335b*/
  if ( (RequestedBits & 1) == 0 ) /*0x3365*/
    RequestedBits_1 = RequestedBits; /*0x3365*/
  SegBits = (*(_DWORD *)(UsbRtDispatchTable + 29888) >> 2) / *(_DWORD *)(UsbRtDispatchTable + 29876); /*0x3377*/
  CurSeg = CurSeg_1; /*0x3382*/
  CurSeg_3 = 0; /*0x3387*/
  while ( !Found ) /*0x338c*/
  {
    if ( RequestedBits_1 <= 0x80u ) /*0x339b*/
      ConsecutiveCnt = 0; /*0x339d*/
    SegBits_1 = 0; /*0x33a0*/
    if ( SegBits ) /*0x33a7*/
    {
      CurSeg_2 = CurSeg_3; /*0x33b0*/
      do /*0x340f*/
      {
        CurSeg = CurSeg_2; /*0x33b6*/
        for ( BitIdx = 0; BitIdx < 0x20u; ++BitIdx ) /*0x33b9*/
        {
          ++Position; /*0x33c6*/
          BitTestVal = *(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * CurSeg_2); /*0x33bc*/
          if ( _bittest(&BitTestVal, BitIdx) ) /*0x33ce*/
          {
            if ( ++ConsecutiveCnt == RequestedBits_1 ) /*0x33e1*/
            {
              Position -= ConsecutiveCnt; /*0x33e6*/
              Found = 1; /*0x33ea*/
              goto LABEL_17; /*0x33ed*/
            }
          }
          else
          {
            ConsecutiveCnt = 0; /*0x33f1*/
          }
        }
        ++SegBits_1; /*0x3403*/
        ++CurSeg_2; /*0x3406*/
      }
      while ( SegBits_1 < SegBits ); /*0x340f*/
    }
LABEL_17:
    ++SegIdx; /*0x341a*/
    CurSeg_3 += SegBits; /*0x341e*/
    if ( (unsigned int)SegIdx >= *(_DWORD *)(UsbRtDispatchTable + 29876) ) /*0x342c*/
    {
      if ( !Found ) /*0x3434*/
      {
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Usb.c", 1415, (__int64)"((BOOLEAN)(0==1))"); /*0x34bf*/
        return 0; /*0x34bf*/
      }
      goto LABEL_19; /*0x3434*/
    }
  }
  do
  {
LABEL_19:
    RequestedBits_2 = BitIdx + 1; /*0x3439*/
    if ( BitIdx >= RequestedBits_1 - 1 ) /*0x3450*/
      RequestedBits_2 = RequestedBits_1; /*0x3450*/
    Mask = (unsigned __int8)(BitIdx - RequestedBits_2 + 1) + (unsigned int)RequestedBits_2 < 0x20
         ? -1 << (BitIdx + 1)
         : 0;
    if ( BitIdx - (_BYTE)RequestedBits_2 != 0xFF ) /*0x3471*/
      Mask |= ~(-1 << (BitIdx - RequestedBits_2 + 1)); /*0x347b*/
    BitIdx = 31; /*0x3484*/
    *(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * CurSeg--) &= Mask; /*0x348a*/
    RequestedBits_1 -= RequestedBits_2; /*0x3495*/
  }
  while ( RequestedBits_1 );
  return *(_QWORD *)(UsbRtDispatchTable + 29880) + 32LL * Position; /*0x34d5*/
}


// Function: FwVolConfig @ 0x34e4 (0x107 bytes)

char __fastcall FwVolConfig(unsigned __int64 BufferAddr, unsigned __int16 Size)
{
  unsigned __int16 Size_1; // bx
  unsigned __int16 Size_2; // r14
  __int64 UsbRtDispatchTable; // rsi
  unsigned __int64 BufferAddr_1; // rax
  unsigned __int16 BitOffset; // r10
  unsigned __int8 SubBitIdx; // bp
  unsigned __int16 SegIdx; // di
  unsigned __int8 SubBitStart; // r10
  char LoopSubIdx; // cl
  int SegAdvance; // ecx
  unsigned __int64 CleanSize; // rdx

  Size_1 = Size + 1; /*0x34ff*/
  if ( (Size & 1) == 0 ) /*0x3509*/
    Size_1 = Size; /*0x3509*/
  Size_2 = Size_1; /*0x350d*/
  if ( !BufferAddr ) /*0x3514*/
    return -1; /*0x3514*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x351a*/
  BufferAddr_1 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x3521*/
  if ( BufferAddr < BufferAddr_1 ) /*0x352b*/
    return -1; /*0x352b*/
  if ( BufferAddr > BufferAddr_1 + 32800 ) /*0x353a*/
    return -1; /*0x353a*/
  BitOffset = (unsigned __int16)(BufferAddr - *(_WORD *)(UsbRtDispatchTable + 29880)) >> 5; /*0x3551*/
  if ( BitOffset >= 0x400u ) /*0x355a*/
    return -1; /*0x35d0*/
  SubBitIdx = 0; /*0x3560*/
  SegIdx = (unsigned __int16)(BufferAddr - *(_WORD *)(UsbRtDispatchTable + 29880)) >> 10; /*0x3563*/
  SubBitStart = BitOffset & 0x1F; /*0x3567*/
  do /*0x35b6*/
  {
    LoopSubIdx = SubBitIdx++; /*0x357a*/
    *(_DWORD *)(*(_QWORD *)(UsbRtDispatchTable + 29896) + 4LL * SegIdx) |= 1 << (SubBitStart + LoopSubIdx); /*0x358b*/
    --Size_2; /*0x3594*/
    SegAdvance = SubBitIdx + SubBitStart; /*0x359c*/
    if ( SegAdvance && (SegAdvance & 0x1F) == 0 ) /*0x35a7*/
    {
      ++SegIdx; /*0x35a9*/
      SubBitStart = 0; /*0x35ac*/
      SubBitIdx = 0; /*0x35af*/
    }
  }
  while ( Size_2 ); /*0x35b6*/
  CleanSize = 32LL * Size_1; /*0x35bb*/
  if ( CleanSize ) /*0x35c2*/
    MemGetInfo(BufferAddr, CleanSize); /*0x35c7*/
  return 0; /*0x35e1*/
}


// Function: UsbRegisterNotifyFunc @ 0x35ec (0x71 bytes)

__int64 __fastcall UsbRegisterNotifyFunc(__int64 NotifyFunc)
{
  int SlotIdx; // ebx
  __int64 NotifyFunc_1; // r8

  LOBYTE(SlotIdx) = 50; /*0x35f9*/
  do /*0x3615*/
  {
    NotifyFunc_1 = *(_QWORD *)(UsbRtDispatchTable + 8LL * (unsigned __int8)SlotIdx + 29064); /*0x35fe*/
    if ( !NotifyFunc_1 ) /*0x3609*/
      break; /*0x3609*/
    if ( NotifyFunc_1 == NotifyFunc ) /*0x360e*/
      return (unsigned int)(SlotIdx - 49); /*0x360e*/
    LOBYTE(SlotIdx) = SlotIdx + 1; /*0x3610*/
  }
  while ( (unsigned __int8)SlotIdx < 0x64u ); /*0x3615*/
  if ( (_BYTE)SlotIdx == 100 ) /*0x361a*/
  {
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Usb.c", 1609, (__int64)"Index != MaxIndex"); /*0x362f*/
    while ( 1 ) /*0x363d*/
      ; /*0x363d*/
  }
  *(_QWORD *)(UsbRtDispatchTable + 8LL * (unsigned __int8)SlotIdx + 29064) = NotifyFunc; /*0x364c*/
  return (unsigned int)(SlotIdx - 49); /*0x3657*/
}


// Function: UsbFindDeviceByHcPtr @ 0x3660 (0x75 bytes)

__int64 __fastcall UsbFindDeviceByHcPtr(__int64 i)
{
  unsigned __int64 n7; // rdx
  __int64 j; // rcx
  unsigned __int64 n7_2; // rax
  __int64 v6; // rax
  unsigned __int64 n7_1; // rax

  n7 = 0; /*0x3660*/
  if ( !i ) /*0x3668*/
    return 0; /*0x366a*/
  for ( j = UsbRtDispatchTable + 2384; i != j - 672; j += 48 ) /*0x3674*/
  {
    if ( i == j ) /*0x368a*/
    {
      n7_2 = n7 + 7; /*0x369f*/
      if ( n7 >= 7 ) /*0x36a3*/
        n7_2 = n7; /*0x36a3*/
      v6 = 48 * n7_2 + 2384; /*0x36af*/
      return UsbRtDispatchTable + v6; /*0x36b5*/
    }
    if ( ++n7 >= 0xE ) /*0x3697*/
      return 0; /*0x3697*/
  }
  n7_1 = n7 + 7; /*0x36bb*/
  if ( n7 >= 7 ) /*0x36bf*/
    n7_1 = n7; /*0x36bf*/
  v6 = 48 * n7_1 + 1712; /*0x36cb*/
  return UsbRtDispatchTable + v6; /*0x366c*/
}


// Function: DxeInit @ 0x36d8 (0x107 bytes)

__int64 __fastcall sub_36D8(__int64 a1, __int64 a2, __int64 a3, __int16 a4, unsigned __int8 a5, unsigned __int8 a6)
{
  char v11; // bl
  int v12; // [rsp+20h] [rbp-38h]
  int v13; // [rsp+30h] [rbp-28h]

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x3721*/
    return 0; /*0x370f*/
  v11 = 0; /*0x3738*/
  while ( 1 ) /*0x374c*/
  {
    LOWORD(v13) = a4; /*0x374c*/
    LOWORD(v12) = a6 + (a5 << 8); /*0x3779*/
    if ( (*(unsigned __int16 (__fastcall **)(__int64, __int64, __int64, _QWORD, int, __int64, int))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x377e*/
                                                                                                  + UsbRtDispatchTable
                                                                                                  + 192))(
           a1,
           a2,
           1664,
           0,
           v12,
           a3,
           v13) )
    {
      break; /*0x377e*/
    }
    if ( (*(_BYTE *)(UsbRtDispatchTable + 30476) & 0x40) == 0 ) /*0x3799*/
    {
      (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x37ab*/
      if ( (unsigned __int8)++v11 < 5u ) /*0x37b6*/
        continue; /*0x37b6*/
    }
    return 0; /*0x37b6*/
  }
  return a3; /*0x37d4*/
}


// Function: UsbControlTransfer @ 0x37e0 (0xa6 bytes)

char __fastcall UsbControlTransfer(_BYTE *UsbHcPtr, __int64 src, unsigned __int8 i)
{
  __int64 UsbRtDispatchTable; // r11
  char v4; // bl
  __int16 i_1; // bp
  int v9; // [rsp+20h] [rbp-28h]
  int v10; // [rsp+30h] [rbp-18h]

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x37f9*/
  v4 = 0; /*0x3803*/
  i_1 = i; /*0x3806*/
  while ( 1 ) /*0x381a*/
  {
    LOWORD(v10) = 0; /*0x381a*/
    LOWORD(v9) = i_1; /*0x3840*/
    (*(void (__fastcall **)(_BYTE *, __int64, __int64, _QWORD, int, _QWORD, int))(200LL /*0x3845*/
                                                                                * ((((unsigned __int8)UsbHcPtr[1] - 16) >> 4)
                                                                                 + 4)
                                                                                + UsbRtDispatchTable
                                                                                + 192))(
      UsbHcPtr,
      src,
      1280,
      0,
      v9,
      0,
      v10);
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x384d*/
    if ( (*(_BYTE *)(UsbRtDispatchTable + 30472) & 4) == 0 ) /*0x385c*/
      break; /*0x385c*/
    if ( (unsigned __int8)++v4 >= 5u ) /*0x3863*/
      return -1; /*0x3867*/
  }
  return 0; /*0x387f*/
}


// Function: UsbControlTransferRead @ 0x3888 (0x50 bytes)

char __fastcall UsbControlTransferRead(unsigned __int8 *UsbHcPtr, _DWORD *dst, unsigned __int8 a3)
{
  __int16 v4; // [rsp+20h] [rbp-28h]
  __int16 v5; // [rsp+30h] [rbp-18h]

  v5 = 0; /*0x3896*/
  v4 = a3; /*0x38bd*/
  (*(void (__fastcall **)(unsigned __int8 *, _DWORD *, __int64, _QWORD, __int16, _QWORD, __int16))(200LL /*0x38c9*/
                                                                                                 * (((UsbHcPtr[1] - 16) >> 4)
                                                                                                  + 4)
                                                                                                 + UsbRtDispatchTable
                                                                                                 + 192))(
    UsbHcPtr,
    dst,
    2304,
    0,
    v4,
    0,
    v5);
  return 0; /*0x38d3*/
}


// Function: DebugLogPrint_12 @ 0x38d8 (0x83 bytes)

char __fastcall DebugLogPrint_12(unsigned __int8 *UsbHcPtr, _DWORD *DevEntry, unsigned __int8 InterfaceNum)
{
  __int16 InterfaceNum_1; // bx
  __int16 InterfaceNum_2; // [rsp+20h] [rbp-28h]
  __int16 ZeroVal; // [rsp+30h] [rbp-18h]

  InterfaceNum_1 = InterfaceNum; /*0x38e7*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UsbSetInterface %d\n", InterfaceNum); /*0x38ff*/
  ZeroVal = 0; /*0x390d*/
  InterfaceNum_2 = InterfaceNum_1; /*0x393c*/
  (*(void (__fastcall **)(unsigned __int8 *, _DWORD *, __int64, _QWORD, __int16, _QWORD, __int16))(200LL /*0x3941*/
                                                                                                 * (((UsbHcPtr[1] - 16) >> 4)
                                                                                                  + 4)
                                                                                                 + UsbRtDispatchTable
                                                                                                 + 192))(
    UsbHcPtr,
    DevEntry,
    2817,
    0,
    InterfaceNum_2,
    0,
    ZeroVal);
  return 0; /*0x3955*/
}


// Function: FwVolDriverEntry @ 0x395c (0x229 bytes)

__int64 __fastcall FwVolDriverEntry(char QueryType, __int64 DevEntry, unsigned __int8 MatchVal, _BYTE *MatchExtra)
{
  char Found; // bp
  unsigned int Count; // edi
  __int64 DevEntry_1; // rbx
  unsigned __int8 StartIdx; // r8
  unsigned __int8 Idx; // si
  __int64 Offset; // rcx
  __int64 Offset2; // r9
  bool v14; // zf

  Found = 0; /*0x396f*/
  Count = 0; /*0x3972*/
  DevEntry_1 = DevEntry; /*0x3977*/
  if ( QueryType == (char)0x80 ) /*0x397d*/
  {
    if ( DevEntry ) /*0x3989*/
    {
      StartIdx = 1; /*0x3992*/
      while ( 448LL * StartIdx + UsbRtDispatchTable + 3056 != DevEntry ) /*0x39ad*/
      {
        if ( ++StartIdx >= 0x37u ) /*0x39b6*/
          return 0; /*0x39b6*/
      }
      return StartIdx; /*0x39bf*/
    }
    else
    {
      switch ( MatchVal ) /*0x39cc*/
      {
        case '~': /*0x39cc*/
          return UsbRtDispatchTable + 27712; /*0x39d5*/
        case '}': /*0x39cc*/
          return UsbRtDispatchTable + 28160; /*0x39ed*/
        case '\x7F': /*0x39cc*/
          return UsbRtDispatchTable + 28608; /*0x3a05*/
        default:
          if ( MatchVal ) /*0x3a13*/
            return 448LL * MatchVal + UsbRtDispatchTable + 3056; /*0x3a2d*/
          else
            return 0; /*0x39b8*/
      }
    }
  }
  for ( Idx = 1; Idx < 0x37u; ++Idx ) /*0x3a3c*/
  {
    if ( DevEntry_1 ) /*0x3a46*/
    {
      if ( 448LL * Idx + UsbRtDispatchTable + 3056 == DevEntry_1 ) /*0x3a5c*/
        DevEntry_1 = 0; /*0x3a62*/
      continue; /*0x3a64*/
    }
    if ( QueryType == 49 ) /*0x3a6d*/
    {
      Offset = 448LL * Idx; /*0x3a6f*/
      if ( *(_BYTE *)(Offset + UsbRtDispatchTable + 3127) == MatchVal /*0x3aa1*/
        && (!MatchExtra || *(_BYTE *)(Offset + UsbRtDispatchTable + 3067) == *MatchExtra)
        && (*(_BYTE *)(Offset + UsbRtDispatchTable + 3056) & 2) != 0 )
      {
        ++Count; /*0x3aa7*/
      }
      continue; /*0x3aa9*/
    }
    Offset2 = 448LL * Idx; /*0x3aae*/
    if ( (*(_BYTE *)(Offset2 + UsbRtDispatchTable + 3056) & 3) == 3 ) /*0x3ac2*/
    {
      if ( QueryType == 16 ) /*0x3ac8*/
      {
        if ( *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3066) != MatchVal ) /*0x3b1d*/
          goto LABEL_43; /*0x3b1d*/
        if ( !MatchExtra ) /*0x3b22*/
        {
LABEL_42:
          Found = 1; /*0x3b3f*/
          goto LABEL_43; /*0x3b3f*/
        }
        goto LABEL_40; /*0x3b22*/
      }
      if ( QueryType == 32 ) /*0x3ace*/
      {
        v14 = *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3060) == MatchVal; /*0x3b0b*/
        goto LABEL_41; /*0x3b13*/
      }
      if ( QueryType != 48 ) /*0x3ad4*/
      {
        if ( QueryType != 64 || !MatchExtra ) /*0x3ae3*/
          return 0; /*0x3ae3*/
LABEL_40:
        v14 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) /*0x3b24*/
                        + 8LL * (*(unsigned __int8 *)(Offset2 + UsbRtDispatchTable + 3067) - 1)) == (_QWORD)MatchExtra;
LABEL_41:
        if ( !v14 ) /*0x3b3d*/
          goto LABEL_43; /*0x3b3d*/
        goto LABEL_42; /*0x3b3d*/
      }
      if ( *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3060) == MatchVal /*0x3b05*/
        && (!MatchExtra || *(_BYTE *)(Offset2 + UsbRtDispatchTable + 3067) == *MatchExtra) )
      {
        ++Count; /*0x3b07*/
      }
    }
LABEL_43:
    if ( Found ) /*0x3b45*/
      return Offset2 + UsbRtDispatchTable + 3056; /*0x3b6d*/
  }
  if ( (unsigned __int8)(QueryType - 48) > 1u ) /*0x3b5c*/
    return 0; /*0x3b5c*/
  return Count; /*0x3b84*/
}


// Function: UsbFindDeviceEntry @ 0x3bb8 (0xc3 bytes)

__int64 __fastcall UsbFindDeviceEntry(__int64 src, char a2)
{
  __int64 v4; // r9
  unsigned __int8 v5; // r10
  __int64 v6; // rcx
  __int64 v7; // rdx
  __int16 v8; // ax
  bool v9; // zf

  v4 = 0; /*0x3bca*/
  v5 = 1; /*0x3bcd*/
  while ( 1 ) /*0x3bdb*/
  {
    v6 = 448LL * v5; /*0x3bdb*/
    v7 = v6 + UsbRtDispatchTable + 3056; /*0x3be2*/
    if ( (*(_BYTE *)v7 & 0x20) == 0 ) /*0x3be8*/
    {
      if ( (*(_BYTE *)v7 & 1) == 0 ) /*0x3bed*/
      {
        if ( v4 ) /*0x3bf2*/
          v7 = v4; /*0x3bf2*/
        v4 = v7; /*0x3bf6*/
        goto LABEL_20; /*0x3bf9*/
      }
      if ( (*(_BYTE *)v7 & 2) == 0 /*0x3c10*/
        || *(_BYTE *)(v7 + 12) == *(_BYTE *)(src + 12) && *(_BYTE *)(v7 + 13) == *(_BYTE *)(src + 13) )
      {
        v8 = *(_WORD *)(src + 6); /*0x3c16*/
        if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x3c1b*/
        {
          if ( *(_WORD *)(v7 + 6) != v8 /*0x3c35*/
            || *(_WORD *)(v7 + 8) != *(_WORD *)(src + 8)
            || *(_BYTE *)(v7 + 19) != *(_BYTE *)(src + 19) )
          {
            goto LABEL_20; /*0x3c35*/
          }
          v9 = *(_BYTE *)(v7 + 14) == *(_BYTE *)(src + 14); /*0x3c3b*/
        }
        else
        {
          if ( *(_WORD *)(v7 + 6) != v8 || *(_WORD *)(v7 + 8) != *(_WORD *)(src + 8) ) /*0x3c4f*/
            goto LABEL_20; /*0x3c4f*/
          v9 = *(_BYTE *)(v7 + 19) == *(_BYTE *)(src + 19); /*0x3c55*/
        }
        if ( v9 && *(_BYTE *)(v7 + 15) == a2 ) /*0x3c5e*/
          return v6 + UsbRtDispatchTable + 3056; /*0x3c75*/
      }
    }
LABEL_20:
    if ( ++v5 >= 0x37u ) /*0x3c67*/
      return v4; /*0x3c6d*/
  }
}


// Function: DebugLogPrint_24 @ 0x3c7c (0x23d bytes)

_DWORD *__fastcall DebugLogPrint_24(unsigned __int8 *UsbHcPtr, __int64 src)
{
  _BYTE *dst_1; // rax
  _DWORD *dst; // rbx
  __int64 UsbRtDispatchTable; // rsi
  int v8; // eax
  __int64 v9; // r14
  __int64 v10; // rax
  __int64 v11; // r10
  int v12; // r9d
  __int64 v13; // rax
  unsigned __int8 i; // al

  dst_1 = (_BYTE *)UsbFindDeviceEntry(src, 0); /*0x3c9f*/
  dst = dst_1; /*0x3ca7*/
  if ( !dst_1 ) /*0x3cad*/
    return 0; /*0x3cad*/
  if ( (*dst_1 & 1) != 0 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USB_ConfigureDevice: Existing device.\n");
    *(_DWORD *)src |= *dst; /*0x3cd1*/
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x3cda*/
    *(_QWORD *)(src + 312) = *((_QWORD *)dst + 39); /*0x3ce1*/
    v8 = *((unsigned __int8 *)dst + 11) - 1; /*0x3cec*/
    dst[14] = 0; /*0x3cee*/
    v9 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * v8); /*0x3cfc*/
    v10 = UsbFindDeviceByHcPtr(*((_QWORD *)dst + 15)); /*0x3d04*/
    v11 = v10; /*0x3d09*/
    if ( v10 && *(_QWORD *)(v10 + 32) ) /*0x3d11*/
    {
      if ( *((_BYTE *)dst + 4) == 3 && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 && (*dst & 0x100) == 0 ) /*0x3d2c*/
      {
        UsbCleanupDeviceEntry(dst); /*0x3d31*/
        *(_DWORD *)src |= v12; /*0x3d36*/
      }
      (*(void (__fastcall **)(_DWORD *))(v11 + 32))(dst); /*0x3d3c*/
      *((_QWORD *)dst + 15) = 0; /*0x3d40*/
    }
    else
    {
      if ( !*((_BYTE *)dst + 64) ) /*0x3d4a*/
        goto LABEL_14; /*0x3d4a*/
      (*(void (__fastcall **)(__int64, _DWORD *))(200LL * (((*(unsigned __int8 *)(v9 + 1) - 16) >> 4) + 4) /*0x3d69*/
                                                + UsbRtDispatchTable
                                                + 224))(
        v9,
        dst);
      *((_BYTE *)dst + 64) = 0; /*0x3d71*/
    }
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x3d75*/
LABEL_14:
    v13 = *((_QWORD *)dst + 27); /*0x3d7c*/
    if ( v13 && v13 != *(_QWORD *)(src + 216) ) /*0x3d8f*/
    {
      (*(void (__fastcall **)(__int64, _DWORD *))(200LL * (((*(unsigned __int8 *)(v9 + 1) - 16) >> 4) + 4) /*0x3dae*/
                                                + UsbRtDispatchTable
                                                + 272))(
        v9,
        dst);
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x3db6*/
    }
    if ( (*(_BYTE *)dst & 2) != 0 ) /*0x3dc0*/
    {
      i = *((_BYTE *)dst + 10); /*0x3dc2*/
      if ( i ) /*0x3dc7*/
      {
        *(_QWORD *)(UsbRtDispatchTable + 29864) |= Assert_0(1, i); /*0x3dd6*/
        *((_BYTE *)dst + 10) = 0; /*0x3ddd*/
      }
    }
    goto LABEL_21; /*0x3de1*/
  }
  if ( DebugLogPrint_26(*(_BYTE *)(src + 71)) == 1 ) /*0x3ded*/
    return 0; /*0x3cb1*/
LABEL_21:
  if ( (*(_BYTE *)dst & 4) != 0 ) /*0x3df6*/
  {
    *((_BYTE *)dst + 11) = *(_BYTE *)(src + 11); /*0x3e20*/
    *((_BYTE *)dst + 12) = *(_BYTE *)(src + 12); /*0x3e26*/
    *((_BYTE *)dst + 13) = *(_BYTE *)(src + 13); /*0x3e2c*/
    *((_BYTE *)dst + 14) = *(_BYTE *)(src + 14); /*0x3e32*/
    *((_WORD *)dst + 8) = *(_WORD *)(src + 16); /*0x3e39*/
    *((_QWORD *)dst + 27) = *(_QWORD *)(src + 216); /*0x3e44*/
    *((_BYTE *)dst + 10) = *(_BYTE *)(src + 10); /*0x3e4e*/
  }
  else
  {
    *(_BYTE *)(src + 288) = *((_BYTE *)dst + 288); /*0x3e07*/
    MemConfig((char *)dst, (char *)src, 0x1C0u); /*0x3e10*/
    *dst &= 0x347u; /*0x3e15*/
  }
  *dst |= 3u; /*0x3e51*/
  if ( (*(_BYTE *)src & 8) == 0 ) /*0x3e57*/
  {
    UsbControlTransferRead(UsbHcPtr, dst, *((_BYTE *)dst + 18)); /*0x3e63*/
    if ( (*(_DWORD *)src & 0x200) != 0 ) /*0x3e6e*/
      DebugLogPrint_12(UsbHcPtr, dst, *((_BYTE *)dst + 20)); /*0x3e7a*/
  }
  DebugPrint(
    0xFFFFFFFFFFFFFFFFuLL,
    "new dev: %x, flag: %x, addr %d\n",
    (_DWORD)dst,
    *dst,
    *((unsigned __int8 *)dst + 10));
  return dst; /*0x3eaf*/
}


// Function: DebugLogPrint_25 @ 0x3ebc (0x9e bytes)

char __fastcall DebugLogPrint_25(_BYTE *UsbHcPtr, _WORD *src, unsigned __int8 *p_n2047, unsigned __int16 n2047)
{
  __int16 v4; // ax
  __int16 *v5; // rbx
  __int16 v6; // cx
  unsigned __int8 *v8; // rdi
  __int16 v9; // ax
  unsigned __int8 v10; // al
  unsigned __int8 v11; // al

  v4 = word_1C160; /*0x3ecb*/
  v5 = &word_1C160; /*0x3ed2*/
  v6 = qword_1C162; /*0x3ed9*/
  v8 = &p_n2047[n2047]; /*0x3ee7*/
  while ( 1 )
  {
    v9 = v6 | v4; /*0x3eea*/
    if ( !v9 ) /*0x3eed*/
      break; /*0x3eed*/
    if ( v6 == src[4] && *v5 == src[3] )
    {
      DebugPrint(
        0xFFFFFFFFFFFFFFFFuLL,
        "Found non-compatible device: DID=%x, VID=%x\n",
        (unsigned __int16)v5[1],
        (unsigned __int16)*v5);
      src[54] = v5[4]; /*0x3f28*/
      v10 = *((_BYTE *)v5 + 4); /*0x3f2c*/
      if ( v10 ) /*0x3f31*/
        v8[5] = v10; /*0x3f33*/
      v11 = *((_BYTE *)v5 + 5); /*0x3f36*/
      if ( v11 ) /*0x3f3b*/
        v8[6] = v11; /*0x3f3d*/
      LOBYTE(v9) = *((_BYTE *)v5 + 6); /*0x3f40*/
      if ( (_BYTE)v9 ) /*0x3f45*/
        v8[7] = v9; /*0x3f47*/
      return v9; /*0x3f47*/
    }
    v6 = v5[6]; /*0x3efe*/
    v5 += 5; /*0x3f02*/
    v4 = *v5; /*0x3f06*/
  }
  return v9; /*0x3f54*/
}


// Function: DebugLogPrint_23 @ 0x3f5c (0x1ce bytes)

_BYTE *__fastcall DebugLogPrint_23(
        _BYTE *UsbHcPtr,
        __int64 src,
        unsigned __int8 *p_n2047,
        unsigned __int16 n2047,
        __int16 n2047a)
{
  __int64 TmpRdx; // rdx
  __int64 TmpRcx; // rcx
  const CHAR8 *not_compatible_device._n; // rdx
  char *v13; // rdi
  __int64 v14; // rdx
  __int64 v15; // r8
  __int64 v16; // r9
  char v17; // r14
  char v18; // si
  char v19; // r15
  unsigned __int8 n7; // bp
  char v21; // r12
  __int64 v22; // rdi
  __int64 (__fastcall *v23)(__int64, __int64, __int64, __int64); // rax
  _DWORD *dst; // rax
  _BYTE *dst_1; // rbx
  int v26; // r9d
  _BYTE *dst_2; // rax
  int v28; // [rsp+20h] [rbp-48h]

  DebugLogPrint_25(UsbHcPtr, (_WORD *)src, p_n2047, n2047); /*0x3f88*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBIdentifyAndConfigureDevice..."); /*0x3f9b*/
  if ( (*(_BYTE *)(src + 108) & 4) != 0 ) /*0x3fa4*/
  {
    not_compatible_device._n = "not compatible device.\n"; /*0x3fa6*/
    goto LABEL_3; /*0x3fa6*/
  }
  LOBYTE(TmpRdx) = *(_BYTE *)(src + 13); /*0x3fc1*/
  LOBYTE(TmpRcx) = *(_BYTE *)(src + 12); /*0x3fc4*/
  v13 = (char *)&p_n2047[n2047]; /*0x3fca*/
  if ( UsbHidMatchDeviceTopology(TmpRcx, TmpRdx, *((_WORD *)UsbHcPtr + 17), v13[5], 1) ) /*0x3fd6*/
  {
    not_compatible_device._n = "Match the skip table ; skipping this device.\n"; /*0x3fdf*/
    goto LABEL_3; /*0x3fe6*/
  }
  v17 = v13[5]; /*0x3fe8*/
  v18 = -1; /*0x3fec*/
  v19 = v13[6]; /*0x3fef*/
  n7 = 7; /*0x3ff3*/
  v21 = v13[7]; /*0x3ff6*/
  while ( 1 ) /*0x4014*/
  {
    v22 = 48LL * n7 + UsbRtDispatchTable + 1712; /*0x4014*/
    if ( !*(_BYTE *)v22 ) /*0x401a*/
      goto LABEL_14; /*0x401a*/
    v23 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int64))(v22 + 16); /*0x401c*/
    if ( !v23 ) /*0x4023*/
      break; /*0x4023*/
    LOBYTE(v16) = v21; /*0x4025*/
    LOBYTE(v15) = v19; /*0x4028*/
    LOBYTE(v14) = v17; /*0x402b*/
    v18 = v23(src, v14, v15, v16); /*0x4033*/
    if ( v18 != -1 ) /*0x4038*/
      goto LABEL_17; /*0x4038*/
LABEL_14:
    if ( ++n7 >= 0xEu ) /*0x4055*/
      goto LABEL_18; /*0x4055*/
  }
  if ( *(_BYTE *)(v22 + 1) != v17 && *(_BYTE *)(v22 + 2) != v19 && *(_BYTE *)(v22 + 3) != v21 ) /*0x404c*/
    goto LABEL_14; /*0x404c*/
  v18 = *(_BYTE *)v22; /*0x4059*/
  if ( *(_BYTE *)v22 == 0xFF ) /*0x4060*/
    goto LABEL_18; /*0x4060*/
LABEL_17:
  *(_BYTE *)(src + 4) = v18; /*0x4062*/
LABEL_18:
  *(_BYTE *)(src + 71) = v17; /*0x4066*/
  *(_BYTE *)(src + 73) = v21; /*0x4070*/
  *(_BYTE *)(src + 72) = v19; /*0x4074*/
  dst = DebugLogPrint_24(UsbHcPtr, src); /*0x4078*/
  dst_1 = dst; /*0x407d*/
  if ( v18 == -1 ) /*0x4084*/
    goto LABEL_27; /*0x4084*/
  if ( !dst )
  {
    not_compatible_device._n = "USB: Common configure failed.\n";
    goto LABEL_3; /*0x4096*/
  }
  if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 && (*dst & 0x100) == 0 ) /*0x40b1*/
  {
    UsbCleanupDeviceEntry(dst); /*0x40b6*/
    *(_DWORD *)dst_1 |= v26; /*0x40bb*/
  }
  LOWORD(v28) = n2047a; /*0x40dd*/
  *((_QWORD *)dst_1 + 15) = v22; /*0x40e2*/
  dst_2 = (_BYTE *)(*(__int64 (__fastcall **)(_BYTE *, _BYTE *, unsigned __int8 *, _QWORD, int))(v22 + 24))( /*0x40e6*/
                     UsbHcPtr,
                     dst_1,
                     p_n2047,
                     n2047,
                     v28);
  dst_1 = dst_2; /*0x40e9*/
  if ( dst_2 && (*dst_2 & 1) != 0 )
  {
LABEL_27:
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "%x\n", (_DWORD)dst_1); /*0x410d*/
    return dst_1; /*0x4112*/
  }
  else
  {
    not_compatible_device._n = "USB: Device specific configure failed.\n";
LABEL_3:
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, not_compatible_device._n); /*0x3fb0*/
    return 0; /*0x3fb5*/
  }
}


// Function: UsbServiceHcPolling @ 0x412c (0x137 bytes)

void __fastcall UsbServiceHcPolling(__int64 CtxPtr, unsigned __int8 OpCode)
{
  __int64 UsbRtDispatchTable; // r8
  char IsSet; // r9
  int OpMinus1; // edx
  int OpMinus2; // edx
  unsigned __int8 Idx; // cl
  __int64 CallersArray; // r11
  __int64 CallerEntry; // rax
  __int64 ActiveEntry; // rcx
  __int64 ResetEntry; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x4130*/
  IsSet = ::IsSet; /*0x413a*/
LABEL_2:
  if ( OpCode ) /*0x4146*/
  {
    OpMinus1 = OpCode - 1; /*0x414c*/
    if ( OpMinus1 ) /*0x414f*/
    {
      OpMinus2 = OpMinus1 - 1; /*0x4155*/
      if ( OpMinus2 ) /*0x4158*/
      {
        if ( OpMinus2 == 1 && *(_QWORD *)(UsbRtDispatchTable + 30152) == CtxPtr ) /*0x416e*/
        {
          *(_QWORD *)(UsbRtDispatchTable + 30152) = 0; /*0x4174*/
          for ( Idx = 0; Idx < *(_BYTE *)(UsbRtDispatchTable + 27704); ++Idx ) /*0x417c*/
          {
            CallersArray = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0x418b*/
            if ( *(_QWORD *)(CallersArray + 8LL * Idx) ) /*0x4195*/
            {
              if ( *(_QWORD *)(CallersArray + 8LL * Idx) != CtxPtr ) /*0x41a0*/
              {
                CallerEntry = *(_QWORD *)(CallersArray + 8LL * Idx); /*0x41a2*/
                if ( *(_QWORD *)(CallerEntry + 120) ) /*0x41a6*/
                {
                  if ( (*(_BYTE *)(CallerEntry + 64) & 1) != 0 ) /*0x41b1*/
                  {
                    *(_QWORD *)(UsbRtDispatchTable + 30152) = *(_QWORD *)(CallersArray + 8LL * Idx); /*0x41be*/
                    if ( !IsSet ) /*0x41c8*/
                      return; /*0x41c8*/
                    IsSet = 0; /*0x41ce*/
                    OpCode = 2; /*0x41d1*/
                    ::IsSet = 0; /*0x41d3*/
                    CtxPtr = 0; /*0x41da*/
                    goto LABEL_2; /*0x41dd*/
                  }
                }
              }
            }
          }
        }
      }
      else if ( !IsSet ) /*0x41e5*/
      {
        ActiveEntry = *(_QWORD *)(UsbRtDispatchTable + 30152); /*0x41e7*/
        if ( ActiveEntry ) /*0x41f1*/
          (*(void (**)(void))(200LL * (((*(unsigned __int8 *)(ActiveEntry + 1) - 16) >> 4) + 4) /*0x4209*/
                            + UsbRtDispatchTable
                            + 256))();
        ::IsSet = 1; /*0x4211*/
      }
    }
    else if ( IsSet ) /*0x421d*/
    {
      ResetEntry = *(_QWORD *)(UsbRtDispatchTable + 30152); /*0x421f*/
      if ( ResetEntry ) /*0x4229*/
        (*(void (**)(void))(200LL * (((*(unsigned __int8 *)(ResetEntry + 1) - 16) >> 4) + 4) + UsbRtDispatchTable + 248))(); /*0x4241*/
      ::IsSet = 0; /*0x4249*/
    }
  }
  else if ( !IsSet ) /*0x4255*/
  {
    *(_QWORD *)(UsbRtDispatchTable + 30152) = CtxPtr; /*0x4257*/
  }
}


// Function: UsbCleanupDeviceEntry @ 0x4c9c (0x8b bytes)

__int64 __fastcall UsbCleanupDeviceEntry(_DWORD *dst)
{
  __int64 i; // rdx
  __int64 result; // rax

  for ( i = UsbRtDispatchTable; /*0x4c9c*/
        *(_DWORD *)(i + 30540) >= *(_DWORD *)(i + 30536);
        *(_DWORD *)(i + 30540) -= *(_DWORD *)(i + 30536) )
  {
    ; /*0x4cae*/
  }
  *(_QWORD *)(*(_QWORD *)(i + 30528) + 8LL * (int)(*(_DWORD *)(i + 30540))++) = dst; /*0x4cd0*/
  if ( *(_DWORD *)(i + 30540) == *(_DWORD *)(i + 30536) ) /*0x4ce6*/
    *(_DWORD *)(i + 30540) -= *(_DWORD *)(i + 30536); /*0x4cee*/
  result = *(unsigned int *)(i + 30544); /*0x4cfa*/
  if ( *(_DWORD *)(i + 30540) == (_DWORD)result ) /*0x4d02*/
  {
    ++*(_DWORD *)(i + 30544); /*0x4d04*/
    while ( 1 ) /*0x4d18*/
    {
      result = *(unsigned int *)(i + 30544); /*0x4d18*/
      if ( (int)result < *(_DWORD *)(i + 30536) ) /*0x4d24*/
        break; /*0x4d24*/
      *(_DWORD *)(i + 30544) -= *(_DWORD *)(i + 30536); /*0x4d12*/
    }
  }
  return result; /*0x4d26*/
}


// Function: DebugLogPrint_26 @ 0x4d28 (0x9c bytes)

char __fastcall DebugLogPrint_26(unsigned __int8 n11)
{
  char n15; // al

  n15 = FwVolDriverEntry(49, 0, n11, 0); /*0x4d3a*/
  if ( n15 ) /*0x4d4d*/
  {
    switch ( n11 ) /*0x4d52*/
    {
      case 3u: /*0x4d52*/
        if ( n15 == 15 ) /*0x4d5d*/
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported HIDs (%d); skipping this device.\n"); /*0x4d6a*/
          return 1; /*0x4d71*/
        }
        break;
      case 9u: /*0x4d52*/
        if ( n15 == 12 ) /*0x4d81*/
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported HUBs (%d); skipping this device.\n"); /*0x4d8a*/
          return 1; /*0x4d8a*/
        }
        break;
      case 8u: /*0x4d52*/
        if ( n15 == 6 ) /*0x4d93*/
        {
          DebugPrint( /*0x4da2*/
            0xFFFFFFFFFFFFFFFFuLL,
            "Reached the limit of supported Mass Storage Devices (%d); skipping this device.\n");
          return 1; /*0x4da2*/
        }
        break;
      default:
        if ( n11 == 11 && n15 == 7 ) /*0x4dab*/
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Reached the limit of supported CCID Devices (%d); skipping this device.\n"); /*0x4dba*/
          return 1; /*0x4dba*/
        }
        break;
    }
  }
  return 0; /*0x4dbe*/
}


// Function: SataDriverEntry @ 0x4dc4 (0xac bytes)

__int64 __fastcall SataDriverEntry(
        __int64 UsbHcPtr,
        __int64 DevEntry,
        unsigned __int64 ReqData,
        __int16 InterfaceNum,
        __int64 ExtraArg)
{
  __int64 UsbRtDispatchTable; // r11
  __int16 SavedInterfaceNum; // si
  __int16 SubStatus; // dx
  __int64 result; // rax
  __int16 OrigHiWord; // [rsp+66h] [rbp+1Eh]

  OrigHiWord = HIWORD(ReqData); /*0x4dce*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x4dd8*/
  SavedInterfaceNum = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x4de9*/
  *(_WORD *)(UsbRtDispatchTable + 30470) = InterfaceNum; /*0x4df1*/
  SubStatus = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int64, unsigned __int64, _WORD, __int64, _WORD))(200LL * (((*(unsigned __int8 *)(UsbHcPtr + 1) - 16) >> 4) + 4) + UsbRtDispatchTable + 192))( /*0x4e43*/
                UsbHcPtr,
                DevEntry,
                ReqData,
                HIDWORD(ReqData),
                WORD1(ReqData),
                ExtraArg,
                HIWORD(ReqData));
  result = 0; /*0x4e46*/
  *(_WORD *)(UsbRtDispatchTable + 30470) = SavedInterfaceNum; /*0x4e48*/
  if ( OrigHiWord ) /*0x4e54*/
  {
    if ( !SubStatus ) /*0x4e59*/
      return 255; /*0x4e5b*/
  }
  return result; /*0x4e6a*/
}


// Function: FwVolDriverEntry_2 @ 0x4e74 (0x4f bytes)

char __fastcall FwVolDriverEntry_2(__int64 DevEntry, char BitField)
{
  char BitShift; // r11
  __int64 DevEntry_1; // r10
  __int64 DescOffset; // rax

  BitShift = (BitField & 0xF) - 1; /*0x4e87*/
  if ( *(_QWORD *)(DevEntry + 48) ) /*0x4e7a*/
  {
    if ( (UsbValidateDeviceEntry(*(_QWORD *)(DevEntry + 48)) & 0x8000000000000000uLL) != 0LL ) /*0x4e9a*/
      return 0; /*0x4e9e*/
  }
  else
  {
    DevEntry_1 = DevEntry; /*0x4ea0*/
  }
  DescOffset = 58; /*0x4ea3*/
  if ( BitField < 0 ) /*0x4ead*/
    DescOffset = 56; /*0x4ead*/
  return (*(_WORD *)(DescOffset + DevEntry_1) >> BitShift) & 1; /*0x4ebd*/
}


// Function: FwVolDriverEntry_1 @ 0x4ec4 (0x6d bytes)

__int64 __fastcall FwVolDriverEntry_1(__int64 DevEntry, char BitField, unsigned __int8 BitValue)
{
  unsigned __int8 BitShift; // r11
  __int64 result; // rax
  __int64 DevEntry_1; // r10
  __int64 DescOffset; // r8

  BitShift = (BitField & 0xF) - 1; /*0x4edc*/
  if ( *(_QWORD *)(DevEntry + 48) ) /*0x4ece*/
  {
    result = UsbValidateDeviceEntry(*(_QWORD *)(DevEntry + 48)); /*0x4ee9*/
    if ( result < 0 ) /*0x4ef1*/
      return result; /*0x4ef1*/
  }
  else
  {
    DevEntry_1 = DevEntry; /*0x4ef5*/
  }
  DescOffset = 58; /*0x4f06*/
  if ( BitField < 0 ) /*0x4f0a*/
    DescOffset = 56; /*0x4f0a*/
  *(_WORD *)(DescOffset + DevEntry_1) = *(_WORD *)(DescOffset + DevEntry_1) & ~(1 << (BitShift & 0xF)) /*0x4f21*/
                                      | (BitValue << BitShift);
  return BitShift; /*0x4f2b*/
}


// Function: UsbPointOutputData @ 0x4fdc (0x36 bytes)

__int64 __fastcall UsbPointOutputData(char n0x80)
{
  __int64 UsbRtDispatchTable; // rdx
  __int64 result; // rax

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x4fdc*/
  **(_BYTE **)(UsbRtDispatchTable + 30320) = n0x80; /*0x4fea*/
  result = UsbRtDispatchTable + 30316; /*0x4fec*/
  if ( ++*(_QWORD *)(UsbRtDispatchTable + 30320) == UsbRtDispatchTable + 30316 ) /*0x5001*/
  {
    *(_QWORD *)(UsbRtDispatchTable + 30320) = UsbRtDispatchTable + 30304; /*0x500a*/
    return UsbRtDispatchTable + 30304; /*0x5003*/
  }
  return result; /*0x5011*/
}


// Function: UsbKbParseHidReport @ 0x539c (0x2b9 bytes)

void __fastcall UsbKbParseHidReport(__int64 a1, unsigned __int8 *n44)
{
  __int64 UsbRtDispatchTable; // rbx
  char n0xE7; // al
  unsigned __int8 *v4; // rdi
  unsigned __int8 v5; // cl
  char *v6; // r8
  unsigned __int8 *v7; // rcx
  __int16 n6; // dx
  unsigned __int8 v9; // al
  __int64 v10; // rax
  char v11; // dl
  __int64 v12; // r8
  __int64 v13; // rbx
  __int64 v14; // r9
  __int16 v15; // r8
  _BYTE *v16; // rax
  unsigned __int8 n0x10; // si
  __int16 v18; // cx
  unsigned __int64 v19; // rax
  unsigned __int8 v20; // bp
  unsigned __int8 *v21; // rsi
  __int16 v22; // di
  unsigned __int8 v23; // dl
  _BYTE *v24; // rax
  __int16 v25; // cx
  unsigned __int8 v26; // al
  unsigned __int16 v27; // r8
  __int64 v28; // rbp
  bool v29; // zf
  char v30; // cl
  char *v31; // rcx
  char v32; // dl

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x53c2*/
  n0xE7 = -32; /*0x53cc*/
  *(_BYTE *)(UsbRtDispatchTable + 30093) = 1 << (*(_BYTE *)(a1 + 10) - 1); /*0x53d1*/
  v4 = (unsigned __int8 *)(UsbRtDispatchTable + 30130); /*0x53d7*/
  v5 = *n44; /*0x53de*/
  v6 = (char *)(UsbRtDispatchTable + 30130); /*0x53e0*/
  do /*0x53f7*/
  {
    if ( (v5 & 1) != 0 ) /*0x53e8*/
      *v6++ = n0xE7; /*0x53ea*/
    v5 >>= 1; /*0x53f0*/
    ++n0xE7; /*0x53f2*/
  }
  while ( (unsigned __int8)n0xE7 <= 0xE7u ); /*0x53f7*/
  v7 = n44 + 2; /*0x53f9*/
  n6 = 6; /*0x5400*/
  while ( 1 ) /*0x540b*/
  {
    v9 = *v7; /*0x540b*/
    if ( !*v7 ) /*0x540f*/
      goto LABEL_9; /*0x540f*/
    if ( v9 == 1 ) /*0x5414*/
      break; /*0x5414*/
    *v6++ = v9; /*0x5416*/
LABEL_9:
    if ( !--n6 ) /*0x5420*/
    {
      *v6 = 0; /*0x5469*/
      v15 = (_WORD)v6 - UsbRtDispatchTable - 30129; /*0x5475*/
      v16 = (_BYTE *)(UsbRtDispatchTable + 30130); /*0x5479*/
      if ( !v15 ) /*0x547c*/
        goto LABEL_21; /*0x547c*/
      do /*0x548a*/
      {
        if ( *v16 ) /*0x547e*/
          break; /*0x5481*/
        ++v16; /*0x5483*/
        --v15; /*0x5486*/
      }
      while ( v15 ); /*0x548a*/
      if ( !v15 ) /*0x5490*/
LABEL_21:
        *(_BYTE *)(UsbRtDispatchTable + 30092) |= *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5498*/
LABEL_27:
      while ( 1 ) /*0x5546*/
      {
        v20 = *v4++; /*0x5546*/
        if ( !v20 ) /*0x554f*/
          break; /*0x554f*/
        n0x10 = 0; /*0x54b0*/
        v18 = *(_WORD *)(UsbRtDispatchTable + 30120) - UsbRtDispatchTable - 29940; /*0x54b6*/
        if ( *(_WORD *)(UsbRtDispatchTable + 30120) - (_WORD)UsbRtDispatchTable != 29940 ) /*0x54ba*/
        {
          do /*0x54d5*/
          {
            if ( v20 == *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29940) ) /*0x54c8*/
            {
              *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29924) |= *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5576*/
              goto LABEL_27; /*0x557d*/
            }
            ++n0x10; /*0x54ce*/
            --v18; /*0x54d1*/
          }
          while ( v18 ); /*0x54d5*/
          if ( n0x10 >= 0x10u ) /*0x54db*/
            break; /*0x54db*/
        }
        UsbKbAppendScancode(32, v20, 0); /*0x54e5*/
        UsbRtDispatchTable = UsbRtDispatchTable; /*0x54ea*/
        *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29940) = v20; /*0x54f5*/
        *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29924) = *(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5503*/
        *(_BYTE *)(n0x10 + UsbRtDispatchTable + 29908) = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5510*/
        v19 = *(unsigned __int16 *)(UsbRtDispatchTable + 30094); /*0x551e*/
        ++*(_QWORD *)(UsbRtDispatchTable + 30120); /*0x5525*/
        *(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x5533*/
        *(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[(v19 >> 6) & 7]; /*0x553f*/
      }
      v21 = (unsigned __int8 *)(UsbRtDispatchTable + 29940); /*0x5555*/
      v22 = (_WORD)v4 - UsbRtDispatchTable - 30131; /*0x5564*/
      while ( (unsigned __int64)v21 < *(_QWORD *)(UsbRtDispatchTable + 30120) ) /*0x5624*/
      {
        v23 = *v21; /*0x557f*/
        v24 = (_BYTE *)(UsbRtDispatchTable + 30130); /*0x5581*/
        ++v21; /*0x5588*/
        v25 = v22; /*0x558b*/
        if ( v22 ) /*0x5591*/
        {
          while ( v23 != *v24 ) /*0x5595*/
          {
            ++v24; /*0x559b*/
            if ( !--v25 ) /*0x55a2*/
              goto LABEL_33; /*0x55a2*/
          }
        }
        else
        {
LABEL_33:
          --v21; /*0x55a4*/
          v26 = ~*(_BYTE *)(UsbRtDispatchTable + 30093); /*0x55b1*/
          v27 = (_WORD)v21 - UsbRtDispatchTable - 29940; /*0x55b7*/
          v28 = v27; /*0x55bb*/
          v29 = (v26 & *(_BYTE *)(UsbRtDispatchTable + v27 + 29924)) == 0; /*0x55bf*/
          *(_BYTE *)(UsbRtDispatchTable + v27 + 29924) &= v26; /*0x55bf*/
          if ( v29 ) /*0x55c6*/
          {
            v30 = *(_BYTE *)(UsbRtDispatchTable + v27 + 29908); /*0x55cd*/
            *(_BYTE *)(UsbRtDispatchTable + v27 + 29908) = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x55da*/
            *(_BYTE *)(UsbRtDispatchTable + 30085) = v30; /*0x55e1*/
            UsbKbAppendScancode(48, *v21, v27); /*0x55eb*/
            UsbRtDispatchTable = UsbRtDispatchTable; /*0x55f0*/
            v31 = (char *)(v28 + UsbRtDispatchTable + 29908); /*0x5604*/
            v32 = *v31; /*0x5607*/
            *v31 = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5609*/
            *(_BYTE *)(UsbRtDispatchTable + 30085) = v32; /*0x560b*/
            UsbKbLookupScancode((__int64)v31); /*0x5611*/
            --*(_QWORD *)(UsbRtDispatchTable + 30120); /*0x5616*/
          }
          else
          {
            ++v21; /*0x55c8*/
          }
        }
      }
      *(_BYTE *)(UsbRtDispatchTable + 30092) &= ~*(_BYTE *)(UsbRtDispatchTable + 30093); /*0x5632*/
      return; /*0x5632*/
    }
    ++v7; /*0x5422*/
  }
  v10 = *(_QWORD *)(UsbRtDispatchTable + 30104); /*0x5427*/
  v11 = 1; /*0x542e*/
  v12 = *(_QWORD *)(UsbRtDispatchTable + 30112); /*0x5431*/
  v13 = UsbRtDispatchTable + 29956; /*0x543a*/
  v14 = v10 + 128; /*0x5441*/
  while ( 1 ) /*0x5448*/
  {
    if ( ++v10 == v14 ) /*0x544e*/
      v10 = v13; /*0x544e*/
    if ( v10 == v12 ) /*0x5455*/
      break; /*0x5455*/
    if ( !--v11 ) /*0x545d*/
    {
      UsbKbOutputScancode(255); /*0x545f*/
      return; /*0x5464*/
    }
  }
}


// Function: UsbKbAppendScancode @ 0x5658 (0x68a bytes)

void __fastcall UsbKbAppendScancode(char n32, unsigned __int8 a2, unsigned __int16 a3)
{
  __int64 UsbRtDispatchTable; // r9
  __int16 v5; // di
  char n18; // dl
  __int16 n2; // ax
  __int16 n2_1; // cx
  __int16 n148; // r8
  __int16 n4; // ax
  __int16 n148_1; // r10
  __int16 n8; // cx
  unsigned __int16 v13; // r8
  __int64 v14; // rcx
  char v15; // r11
  unsigned __int16 v16; // cx
  bool v17; // zf
  _BYTE *v18; // rax
  _BYTE *v19; // r10
  char v20; // al
  unsigned __int8 v21; // cl
  unsigned __int8 v22; // cl
  char v23; // dl
  unsigned __int16 v24; // cx
  __int16 v25; // r14
  __int64 v26; // rdi
  __int16 v27; // bx
  __int64 v28; // rbp
  unsigned __int64 n6; // rcx
  _BYTE *v30; // rcx
  _BYTE *v31; // rcx
  _BYTE *v32; // rcx
  char v33; // al
  unsigned __int8 v34; // cl
  char v35; // bl
  char v36; // dl
  unsigned __int16 v37; // cx
  char v38; // bl
  _BYTE *v39; // rcx
  __int64 UsbRtDispatchTable_1; // rax
  _BYTE *v41; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable... [12098 chars total]


// Function: UsbHidConfigureProtocol @ 0x5ce4 (0xb8 bytes)

char __fastcall UsbHidConfigureProtocol(__int64 a1, __int64 n2047)
{
  __int64 UsbRtDispatchTable; // r8
  __int64 n1047; // rcx
  char n4; // al
  char n2047_1; // al
  unsigned __int8 n2047_2; // cl
  char n2047_3; // r9
  char v8; // cl

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x5ce8*/
  n1047 = 1047; /*0x5cef*/
  if ( (*(_BYTE *)(UsbRtDispatchTable + 30086) & 1) != 0 ) /*0x5cff*/
    n4 = 4; /*0x5d01*/
  else
    n4 = (unsigned __int8)(*(_BYTE *)(UsbRtDispatchTable + 30086) & 7) >> 1; /*0x5d05*/
  *(_BYTE *)(UsbRtDispatchTable + 30086) &= 0xF8u; /*0x5d07*/
  *(_BYTE *)(UsbRtDispatchTable + 30086) |= n4; /*0x5d0f*/
  if ( (*(_WORD *)(UsbRtDispatchTable + 30094) & 0x400) != 0 ) /*0x5d2a*/
  {
    LOBYTE(n2047) = 16 * (*(_BYTE *)(UsbRtDispatchTable + 30086) & 7); /*0x5d2f*/
LABEL_6:
    n2047_1 = *(_BYTE *)(UsbRtDispatchTable + 30085) & 0x70; /*0x5d32*/
    if ( n2047_1 == (_BYTE)n2047 ) /*0x5d3f*/
      return n2047_1; /*0x5d3f*/
    LOBYTE(n1047) = n2047 | *(_BYTE *)(UsbRtDispatchTable + 30085) & 0x8F; /*0x5d44*/
    goto LABEL_14; /*0x5d46*/
  }
  if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 0x10) != 0 ) /*0x5d4d*/
  {
    LOBYTE(n2047) = *(_BYTE *)(UsbRtDispatchTable + 30087) & 0x70; /*0x5d56*/
    goto LABEL_6; /*0x5d59*/
  }
  n2047_2 = (*(&loc_416 + 1) >> 1) & 0x38; /*0x5d66*/
  n2047 = n2047_2; /*0x5d61*/
  n2047_3 = n2047_2 ^ 0x48; /*0x5d6d*/
  v8 = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5d71*/
  if ( ((*(&loc_416 + 1) >> 1) & 8) == 0 ) /*0x5d78*/
    n2047_3 = n2047; /*0x5d78*/
  n2047_1 = v8 & 0x70; /*0x5d7e*/
  if ( n2047_3 != (v8 & 0x70) ) /*0x5d83*/
  {
    LOBYTE(n1047) = n2047_3 | v8 & 0x8F; /*0x5d88*/
LABEL_14:
    *(_BYTE *)(UsbRtDispatchTable + 30085) = n1047; /*0x5d8b*/
    return FwVolDriverEntry_0(n1047, n2047); /*0x5d92*/
  }
  return n2047_1; /*0x5d97*/
}


// Function: FwVolDriverEntry_0 @ 0x5d9c (0x6f bytes)

__int64 __fastcall FwVolDriverEntry_0(__int64 n1047, __int64 HcType)
{
  __int64 UsbRtDispatchTable; // rax
  __int64 EntryOffset; // rbx
  __int64 EntryCount; // rsi
  unsigned __int8 PortStatusFlags; // di
  char HcTypeVal; // di
  __int64 DevEntry; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x5dab*/
  EntryOffset = 30168; /*0x5db2*/
  EntryCount = 15; /*0x5db7*/
  PortStatusFlags = *(_BYTE *)(UsbRtDispatchTable + 30085); /*0x5dbc*/
  *(_BYTE *)(UsbRtDispatchTable + 30088) |= 1u; /*0x5dc3*/
  HcTypeVal = (PortStatusFlags >> 4) & 7; /*0x5dce*/
  do /*0x5df2*/
  {
    DevEntry = *(_QWORD *)(EntryOffset + UsbRtDispatchTable); /*0x5dd2*/
    if ( DevEntry ) /*0x5dd9*/
    {
      LOBYTE(HcType) = HcTypeVal; /*0x5ddb*/
      EhciCtrlAsync(DevEntry, HcType); /*0x5dde*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x5de3*/
    }
    EntryOffset += 8; /*0x5dea*/
    --EntryCount; /*0x5dee*/
  }
  while ( EntryCount ); /*0x5df2*/
  *(_BYTE *)(UsbRtDispatchTable + 30088) &= ~1u; /*0x5df4*/
  return UsbRtDispatchTable; /*0x5e05*/
}


// Function: UsbKbSendModifiers @ 0x5e0c (0x35 bytes)

void __fastcall UsbKbSendModifiers(_BYTE *a1)
{
  if ( (*(_BYTE *)(UsbRtDispatchTable + 30146) & 0x40) != 0 ) /*0x5e1a*/
    UsbKbOutputScancode(~__ROL1__(__ROL1__(byte_1C0D0[*(unsigned __int8 *)(UsbRtDispatchTable + 30090)], 4), 1)); /*0x5e3c*/
  else
    UsbKbOutputScancode(*(_BYTE *)(UsbRtDispatchTable + 30090)); /*0x5e22*/
}


// Function: UsbKbSendExtendedModifiers @ 0x5e44 (0x4e bytes)

void __fastcall UsbKbSendExtendedModifiers()
{
  if ( (*(_BYTE *)(UsbRtDispatchTable + 30146) & 0x40) != 0 ) /*0x5e56*/
  {
    UsbKbOutputScancode(~__ROL1__(__ROL1__(byte_1C0D0[*(unsigned __int8 *)(UsbRtDispatchTable + 30090)], 4), 1) | 0x80); /*0x5e8d*/
  }
  else
  {
    UsbKbOutputScancode(240); /*0x5e5a*/
    UsbKbOutputScancode(*(_BYTE *)(UsbRtDispatchTable + 30090)); /*0x5e6c*/
  }
}


// Function: UsbKbLookupScancode @ 0x5e94 (0x8b bytes)

char __fastcall UsbKbLookupScancode(__int64 a1)
{
  __int64 UsbRtDispatchTable; // r10
  __int64 v3; // rcx
  char v4; // r8
  char v5; // r11
  char v6; // bl
  __int64 v7; // rdx
  unsigned int v8; // r9d
  __int64 v9; // r11
  char v10; // al
  __int64 v11; // rcx
  __int64 v12; // r9
  char result; // al

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x5e99*/
  v3 = 0; /*0x5ea3*/
  v4 = UsbRtDispatchTable - 28 - a1 - 1; /*0x5eaf*/
  v5 = v4; /*0x5eb2*/
  do /*0x5ec6*/
  {
    *(_BYTE *)(v3 + a1) = *(_BYTE *)((unsigned int)(v3 + 1) + a1); /*0x5ebc*/
    v3 = (unsigned int)(v3 + 1); /*0x5ec0*/
    --v5; /*0x5ec2*/
  }
  while ( v5 ); /*0x5ec6*/
  v6 = v4; /*0x5ecb*/
  v7 = (unsigned int)(a1 - UsbRtDispatchTable - 29908); /*0x5ece*/
  v8 = v7; /*0x5ed5*/
  v9 = (unsigned int)(v7 + 1); /*0x5ed8*/
  do /*0x5ef8*/
  {
    v10 = *(_BYTE *)(v9 + UsbRtDispatchTable + 29924); /*0x5edc*/
    v9 = (unsigned int)(v9 + 1); /*0x5ee4*/
    v11 = v8++; /*0x5ee7*/
    *(_BYTE *)(v11 + UsbRtDispatchTable + 29924) = v10; /*0x5eed*/
    --v6; /*0x5ef5*/
  }
  while ( v6 ); /*0x5ef8*/
  v12 = (unsigned int)(v7 + 1); /*0x5efa*/
  do /*0x5f17*/
  {
    result = *(_BYTE *)(v12 + UsbRtDispatchTable + 29940); /*0x5efe*/
    v12 = (unsigned int)(v12 + 1); /*0x5f06*/
    *(_BYTE *)(v7 + UsbRtDispatchTable + 29940) = result; /*0x5f09*/
    v7 = (unsigned int)(v7 + 1); /*0x5f11*/
    --v4; /*0x5f13*/
  }
  while ( v4 ); /*0x5f17*/
  return result; /*0x5f1e*/
}


// Function: UsbKbOutputScancode @ 0x5f20 (0x36 bytes)

void __fastcall UsbKbOutputScancode(char a1)
{
  __int64 UsbRtDispatchTable; // r8
  _BYTE *v2; // rdx
  __int64 v3; // rax
  _BYTE *v4; // rdx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x5f20*/
  v2 = *(_BYTE **)(UsbRtDispatchTable + 30104); /*0x5f27*/
  v3 = UsbRtDispatchTable + 30084; /*0x5f2e*/
  *v2 = a1; /*0x5f35*/
  v4 = v2 + 1; /*0x5f37*/
  if ( v4 == (_BYTE *)v3 ) /*0x5f3d*/
    v4 = (_BYTE *)(UsbRtDispatchTable + 29956); /*0x5f3f*/
  *(_QWORD *)(UsbRtDispatchTable + 30104) = v4; /*0x5f46*/
  UsbServiceHcPolling(0, 2u); /*0x5f51*/
}


// Function: SataConfig @ 0x61d0 (0x95 bytes)

char __fastcall SataConfig(__int64 QueuePtr, __int64 a2, int MaxTransferSize)
{
  char *Buffer; // rax
  UINT8 Value; // r8
  char *Buffer_1; // rsi
  unsigned int TotalBufferSize; // edi
  __int64 EndpointCount; // rax
  __int64 TdIdx; // rdx
  char *TdDataPtr; // r8

  Buffer = (char *)UsbConfig_1(((unsigned __int64)(unsigned __int16)(32 * (MaxTransferSize + 8)) + 31) >> 5); /*0x61f8*/
  Buffer_1 = Buffer; /*0x61fd*/
  if ( !Buffer ) /*0x6203*/
    return -1; /*0x6205*/
  *(_DWORD *)(QueuePtr + 12) = MaxTransferSize; /*0x6209*/
  TotalBufferSize = 32 * MaxTransferSize; /*0x620c*/
  *(_QWORD *)QueuePtr = Buffer; /*0x6211*/
  *(_BYTE *)(QueuePtr + 10) = 32; /*0x6214*/
  if ( TotalBufferSize != -256 ) /*0x621f*/
    SetMem(Buffer, TotalBufferSize + 256LL, Value); /*0x6224*/
  EndpointCount = *(unsigned __int8 *)(QueuePtr + 10); /*0x6229*/
  TdIdx = 0; /*0x622d*/
  TdDataPtr = &Buffer_1[8 * EndpointCount]; /*0x622f*/
  if ( (_BYTE)EndpointCount ) /*0x6235*/
  {
    do /*0x624c*/
    {
      *(_QWORD *)(*(_QWORD *)QueuePtr + 8 * TdIdx) = TdDataPtr; /*0x623a*/
      TdIdx = (unsigned int)(TdIdx + 1); /*0x623e*/
      TdDataPtr += *(unsigned int *)(QueuePtr + 12); /*0x6243*/
    }
    while ( (unsigned int)TdIdx < *(unsigned __int8 *)(QueuePtr + 10) ); /*0x624c*/
  }
  *(_WORD *)(QueuePtr + 8) = 0; /*0x624e*/
  return 0; /*0x625f*/
}


// Function: DebugLogPrint_16 @ 0x6268 (0x4c bytes)

__int64 __fastcall sub_6268(_BYTE *DevEntry)
{
  unsigned __int16 Idx; // dx

  for ( Idx = 0; Idx < 0xFu; ++Idx ) /*0x6276*/
  {
    if ( *(_BYTE **)(UsbRtDispatchTable + 8LL * Idx + 30168) == DevEntry ) /*0x6285*/
      return Idx; /*0x62ac*/
  }
  if ( !DevEntry ) /*0x6293*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "No Free KBD DevInfo Entry\n", UsbRtDispatchTable); /*0x62a0*/
  return 0xFFFF; /*0x62af*/
}


// Function: DebugLogPrint_17 @ 0x62b4 (0x16a bytes)

char __fastcall DebugLogPrint_17(_BYTE *DevEntry)
{
  unsigned __int8 WalkIdx; // si
  unsigned __int8 WalkIdx_1; // di
  unsigned __int16 DevInfoIdx; // r15
  __int64 UsbRtDispatchTable; // rcx
  __int64 UsbRtDispatchTable_1; // rbx
  unsigned __int8 BitMask; // r14
  bool v9; // zf
  unsigned __int64 *TransferBufPtr; // rdi
  UINT8 Value; // r8
  unsigned __int64 *IntrBufPtr; // rdi
  UINT8 Value_1; // r8

  WalkIdx = 0; /*0x62d6*/
  WalkIdx_1 = *(_BYTE *)(UsbRtDispatchTable + 30120) - UsbRtDispatchTable + 12; /*0x62e3*/
  DevInfoIdx = DebugLogPrint_16(DevEntry); /*0x62ec*/
  if ( DevInfoIdx == 0xFFFF ) /*0x62f9*/
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x62fb*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0x6306*/
    {
      *(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 35; /*0x6311*/
      ++*(_BYTE *)(UsbRtDispatchTable + 104); /*0x6316*/
    }
    return -1; /*0x6319*/
  }
  else
  {
    UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x632a*/
    BitMask = 1 << (DevEntry[10] - 1); /*0x6333*/
    if ( WalkIdx_1 ) /*0x6339*/
    {
      do /*0x6392*/
      {
        if ( !WalkIdx_1 ) /*0x633e*/
          break; /*0x633e*/
        if ( (BitMask & *(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924)) != 0 /*0x635a*/
          && (v9 = ((unsigned __int8)~BitMask & *(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924)) == 0,
              *(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29924) &= ~BitMask,
              v9) )
        {
          if ( ((*(_BYTE *)(WalkIdx + UsbRtDispatchTable_1 + 29940) + 31) & 0xFB) == 0 ) /*0x6367*/
            *(_BYTE *)(UsbRtDispatchTable_1 + 30085) &= 0xFCu; /*0x6369*/
          UsbKbLookupScancode(UsbRtDispatchTable_1 + WalkIdx + 29908LL); /*0x637a*/
          --*(_QWORD *)(UsbRtDispatchTable_1 + 30120); /*0x637f*/
          --WalkIdx_1; /*0x6386*/
        }
        else
        {
          ++WalkIdx; /*0x638c*/
        }
      }
      while ( WalkIdx < WalkIdx_1 ); /*0x6392*/
    }
    TransferBufPtr = (unsigned __int64 *)(DevEntry + 328); /*0x6394*/
    if ( DevEntry != (_BYTE *)-328LL && *TransferBufPtr ) /*0x63a5*/
    {
      FwVolConfig(*TransferBufPtr, 9u); /*0x63b0*/
      SetMem(DevEntry + 328, 0x10u, Value); /*0x63ba*/
      UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x63bf*/
    }
    IntrBufPtr = (unsigned __int64 *)(DevEntry + 344); /*0x63c6*/
    if ( DevEntry != (_BYTE *)-344LL && *IntrBufPtr ) /*0x63d2*/
    {
      FwVolConfig(*IntrBufPtr, 0xAu); /*0x63df*/
      SetMem(DevEntry + 344, 0x10u, Value_1); /*0x63ea*/
      UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x63ef*/
    }
    *(_QWORD *)(UsbRtDispatchTable_1 + 8LL * DevInfoIdx + 30168) = 0; /*0x63fa*/
    return 0; /*0x6403*/
  }
}


// Function: UsbHidProcessReport @ 0x6420 (0x401 bytes)

char __fastcall UsbHidProcessReport(__int64 a1, __int64 a2, __int64 a3, unsigned __int8 *n44, int a5)
{
  unsigned __int8 *n44_1; // rbx
  __int64 v6; // rsi
  unsigned __int8 *v7; // r8
  __int64 n6; // rbp
  char v9; // r13
  unsigned __int16 n0x20; // di
  unsigned __int8 v11; // al
  _BYTE **v12; // r14
  __int64 v13; // r12
  _BYTE *v14; // rdx
  char v15; // r9
  unsigned __int16 v16; // r11
  __int16 v17; // r15
  unsigned __int16 v18; // bp
  unsigned __int8 v19; // r10
  __int64 v20; // rcx
  char v21; // r10
  __int64 v22; // rax
  unsigned __int8 n6_1; // dl
  __int64 n0x20_1; // r10
  unsigned __int8 v25; // r9
  __int64 v26; // rax
  __int64 v27; // rdi
  __int64 *v28; // rax
  __int64 UsbRtDispatchTable; // rdx
  unsigned __int8 n8; // cl
  int v31; // r10d
  __int64 n2047; // rdx
  __int64 v33; // rcx
  __int64 UsbRtDispatchTable_1; // rax
  _BYTE *v35; // rbx
  char v37; // [rsp+20h] [rbp-48h] BYREF
  __int64 v38; // [rsp+21h] [rbp-47h]
  __int64 v39; // [rsp+29h] [rbp-3Fh]
  __int64 v40; // [rsp+31h] [rbp-37h]
  int v41; // [rsp+39h] [rbp-2Fh]
  __int16 v42; // [rsp+3Dh] [rbp-2Bh]
  char v43; // [rsp+3Fh] [rbp-29h]

  v37 = 0; /*0x6445*/
  n44_1 = n44; /*0x6449*/
  v38 = 0; /*0x644c*/
  v6 = a2; /*0x6450*/
  v39 = 0; /*0x6453*/
  v7 = 0; /*0x6457*/
  v40 = 0; /*0x645a*/
  n6 = 6; /*0x6462*/
  v9 = 0; /*0x6465*/
  n0x20 = 0; /*0x6468*/
  v41 = 0; /*0x646c*/
  v42 = 0; /*0x6470*/
  v43 = 0; /*0x6475*/
  if ( (*(_BYTE *)(a2 + 288) & 1) != 0 ) /*0x6480*/
  {
    v11 = *(_BYTE *)(a2 + 296); /*0x6486*/
    if ( !v11 ) /*0x648e*/
      return 0; /*0x648e*/
    v12 = *(_BYTE ***)(a2 + 304); /*0x6494*/
    v13 = v11; /*0x649f*/
    do /*0x65a3*/
    {
      v14 = *v12; /*0x64a6*/
      if ( (**v12 & 0x10) != 0 ) /*0x64ac*/
      {
        v15 = v14[1]; /*0x64b2*/
        if ( !v15 || v15 == *n44_1 ) /*0x64be*/
        {
          if ( (*v14 & 1) == 0 && *((_WORD *)v14 + 1) == 7 ) /*0x64d0*/
          {
            v9 = 1; /*0x64d6*/
            if ( v15 ) /*0x64dc*/
              LODWORD(v7) = (_DWORD)v7 + 8; /*0x64de*/
            v16 = 0; /*0x64e2*/
            if ( *((_DWORD *)v14 + 1) ) /*0x64e6*/
            {
              v17 = (unsigned __int8)v14[8]; /*0x64f0*/
              v18 = (unsigned __int16)v7; /*0x64fa*/
              while ( 1 ) /*0x6523*/
              {
                v19 = ((1 << v17) - 1) & (*(_DWORD *)&n44_1[(unsigned __int64)v18 >> 3] >> (v18 & 7)); /*0x6523*/
                if ( (unsigned int)v19 >= *((_DWORD *)v14 + 3) && (unsigned int)v19 <= *((_DWORD *)v14 + 4) ) /*0x6532*/
                {
                  if ( (*v14 & 2) == 0 ) /*0x6537*/
                  {
                    v20 = (unsigned int)v19 - *((_DWORD *)v14 + 3); /*0x6547*/
                    goto LABEL_19; /*0x6547*/
                  }
                  if ( v19 ) /*0x653c*/
                  {
                    v20 = v16; /*0x653e*/
LABEL_19:
                    v21 = *(_BYTE *)(*((_QWORD *)v14 + 4) + 2 * v20); /*0x6549*/
                    if ( v21 && n0x20 < 0x20u ) /*0x655a*/
                    {
                      v22 = n0x20++; /*0x655c*/
                      *(&v37 + v22) = v21; /*0x6562*/
                    }
                  }
                }
                ++v16; /*0x6567*/
                v18 += v17; /*0x656b*/
                if ( (unsigned int)v16 >= *((_DWORD *)v14 + 1) ) /*0x6576*/
                {
                  v15 = v14[1]; /*0x6578*/
                  break; /*0x6578*/
                }
              }
            }
            if ( v15 ) /*0x6586*/
              LODWORD(v7) = (_DWORD)v7 - 8; /*0x6588*/
          }
          LODWORD(v7) = *((_DWORD *)v14 + 1) * (unsigned __int8)v14[8] + (_DWORD)v7; /*0x6594*/
        }
      }
      ++v12; /*0x659c*/
      --v13; /*0x65a0*/
    }
    while ( v13 ); /*0x65a3*/
    v6 = a2; /*0x65a9*/
    if ( !v9 ) /*0x65b1*/
      return 0; /*0x65b1*/
    MemGetInfo((__int64)n44_1, 8u); /*0x65bf*/
    n6_1 = 0; /*0x65c9*/
    if ( n0x20 ) /*0x65d0*/
    {
      v7 = (unsigned __int8 *)&v37; /*0x65d2*/
      n0x20_1 = n0x20; /*0x65d7*/
      do /*0x6610*/
      {
        v25 = *v7; /*0x65db*/
        if ( (unsigned __int8)(*v7 + 32) > 7u ) /*0x65e5*/
        {
          if ( n6_1 < 6u ) /*0x65fd*/
          {
            v26 = n6_1++; /*0x65ff*/
            n44_1[v26 + 2] = v25; /*0x6605*/
          }
        }
        else
        {
          *n44_1 |= 1 << (v25 + 32); /*0x65f6*/
        }
        ++v7; /*0x660a*/
        --n0x20_1; /*0x660d*/
      }
      while ( n0x20_1 ); /*0x6610*/
      v6 = a2; /*0x6612*/
    }
    n6 = 6; /*0x6617*/
  }
  v27 = 0; /*0x6623*/
  if ( qword_1C3C8[0] )
  {
    v28 = qword_1C3C8; /*0x662f*/
    while ( !((unsigned __int8 (__fastcall *)(__int64, unsigned __int8 *, unsigned __int8 *))*v28)(v6, n44_1, v7) ) /*0x663c*/
    {
      v28 = &qword_1C3C8[++v27]; /*0x6645*/
      if ( !*v28 ) /*0x6649*/
        goto LABEL_42; /*0x664c*/
    }
  }
  else
  {
LABEL_42:
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x664e*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 31458) ) /*0x6655*/
    {
      if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 || !*(_BYTE *)(UsbRtDispatchTable + 31456) ) /*0x6668*/
        return 0; /*0x666f*/
      MemGetInfo((__int64)n44_1, 8u); /*0x667d*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x6682*/
    }
    *(_QWORD *)(UsbRtDispatchTable + 30160) = v6; /*0x6689*/
    n8 = 0; /*0x6690*/
    LOBYTE(v7) = 8; /*0x6693*/
    do /*0x66a9*/
    {
      if ( n44_1[n8] ) /*0x6699*/
        break; /*0x669d*/
      ++n8; /*0x669f*/
      LOBYTE(v7) = (_BYTE)v7 - 1; /*0x66a2*/
    }
    while ( n8 < 8u ); /*0x66a9*/
    v31 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0x66ab*/
    if ( (v31 & 2) != 0 ) /*0x66b6*/
    {
      if ( (_BYTE)v7 ) /*0x66bb*/
        *(_WORD *)(UsbRtDispatchTable + 31456) = 1; /*0x66c6*/
      else
        *(_BYTE *)(UsbRtDispatchTable + 31456) = 0; /*0x66bd*/
    }
    else if ( (_BYTE)v7 ) /*0x66d4*/
    {
      *(_WORD *)(UsbRtDispatchTable + 31456) = 256; /*0x66df*/
    }
    else
    {
      *(_BYTE *)(UsbRtDispatchTable + 31457) = 0; /*0x66d6*/
    }
    LOBYTE(n44) = 0; /*0x66e8*/
    do /*0x6705*/
    {
      if ( n44_1[(unsigned __int8)n44] != *((_BYTE *)&qword_1C3C0 + (unsigned __int8)n44) ) /*0x66fc*/
        break; /*0x66fc*/
      LOBYTE(n44) = (_BYTE)n44 + 1; /*0x66fe*/
    }
    while ( (unsigned __int8)n44 < 8u ); /*0x6705*/
    qword_1C3C0 = *(_QWORD *)n44_1; /*0x670a*/
    if ( (v31 & 2) != 0 && !*(_BYTE *)(UsbRtDispatchTable + 31457) || *(_BYTE *)(UsbRtDispatchTable + 31456) )
    {
      if ( !(_BYTE)v7 ) /*0x67ed*/
        *(_BYTE *)(UsbRtDispatchTable + 31456) = 0; /*0x67ef*/
      UsbHidParseReportDescriptorItem(v6, n44_1, (__int64)v7, n44); /*0x67fc*/
    }
    else
    {
      if ( !(_BYTE)v7 ) /*0x6733*/
        *(_BYTE *)(UsbRtDispatchTable + 31457) = 0; /*0x6735*/
      if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (v31 & 0x108) == 0x108 )
      {
        if ( qword_1C3A0 )
        {
          (*(void (__fastcall **)(__int64, int *))(qword_1C3A0 + 8))(qword_1C3A0, &a5); /*0x6776*/
          *(_BYTE *)(UsbRtDispatchTable + 30146) = a5 != 1 ? 0 : 0x40;
        }
        UsbKbParseHidReport(v6, n44_1); /*0x679d*/
        UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x67a2*/
        if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 0x10) != 0 ) /*0x67ad*/
        {
          v35 = n44_1 + 2; /*0x67af*/
          do /*0x67e1*/
          {
            switch ( *v35 ) /*0x67b6*/
            {
              case '9': /*0x67b6*/
                *(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x20u; /*0x67d4*/
                break;
              case 'G': /*0x67b6*/
                *(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x40u; /*0x67cb*/
                break;
              case 'S': /*0x67b6*/
                *(_BYTE *)(UsbRtDispatchTable_1 + 30087) ^= 0x10u; /*0x67c2*/
                break;
            }
            ++v35; /*0x67db*/
            --n6; /*0x67de*/
          }
          while ( n6 ); /*0x67e1*/
        }
        UsbHidConfigureProtocol(v33, n2047); /*0x67e3*/
      }
      else
      {
        UsbPointProcessHidReport((__int64)n44_1); /*0x6755*/
      }
    }
  }
  return 0; /*0x6814*/
}


// Function: UsbGetInfo_15 @ 0x6824 (0x34 bytes)

void __fastcall UsbGetInfo_15(_BYTE *UsbHcPtr)
{
  if ( (*(_DWORD *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x6830*/
  {
    UsbServiceHcPolling(0, 1u); /*0x6853*/
  }
  else
  {
    if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x108) == 0x108 ) /*0x6844*/
      JUMPOUT(0x600C); /*0x600c*/
    UsbPointProcessAxis((__int64)UsbHcPtr, 264); /*0x6844*/
  }
}


// Function: EhciCtrlAsync @ 0x6858 (0x1c3 bytes)

char __fastcall EhciCtrlAsync(__int64 DevEntry, __int64 n2047)
{
  char n2047_1; // bl
  unsigned __int8 v4; // bp
  __int64 v5; // r14
  _BYTE *v7; // rax
  _BYTE *v8; // rsi
  __int64 v9; // r8
  char v10; // bl
  unsigned __int8 i; // dl
  __int64 v12; // rax
  char v13; // cl
  __int64 UsbRtDispatchTable; // r11
  __int64 v15; // r9
  __int16 v16; // bx
  __int16 v17; // ax
  __int16 v18; // [rsp+28h] [rbp-30h]
  unsigned __int64 v19; // [rsp+60h] [rbp+8h]

  n2047_1 = n2047; /*0x6884*/
  v4 = 0; /*0x6893*/
  v5 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(DevEntry + 11) - 1)); /*0x68ae*/
  if ( (*(_BYTE *)(DevEntry + 288) & 9) == 1 ) /*0x68b7*/
    return -1; /*0x68b7*/
  v7 = (_BYTE *)UsbConfig_1(1u); /*0x68c3*/
  v8 = v7; /*0x68c8*/
  if ( !v7 ) /*0x68ce*/
    return -1; /*0x68bb*/
  v9 = 1; /*0x68d3*/
  *v7 = n2047_1 & 7; /*0x68d7*/
  if ( (*(_BYTE *)(DevEntry + 288) & 1) == 0 ) /*0x68e0*/
    goto LABEL_13; /*0x68e0*/
  if ( *(_QWORD *)(DevEntry + 304) ) /*0x68e2*/
  {
    for ( i = 0; i < *(_BYTE *)(DevEntry + 296); ++i ) /*0x68f5*/
    {
      v12 = *(_QWORD *)(*(_QWORD *)(DevEntry + 304) + 8LL * i); /*0x6908*/
      if ( *(_WORD *)(v12 + 2) == 8 ) /*0x6911*/
      {
        v13 = *(_BYTE *)(v12 + 1); /*0x6913*/
        if ( v13 ) /*0x6918*/
        {
          if ( **(_WORD **)(v12 + 32) == 1 ) /*0x6922*/
          {
            v4 = *(_BYTE *)(v12 + 1); /*0x6926*/
            v8[1] = *v8; /*0x6929*/
            LOWORD(v9) = v9 + 1; /*0x692c*/
            *v8 = v13; /*0x6930*/
          }
        }
      }
    }
LABEL_13:
    if ( *(_BYTE *)(DevEntry + 68) ) /*0x693d*/
    {
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x698d*/
      v15 = *(unsigned __int16 *)(DevEntry + 66); /*0x6999*/
      v18 = v9; /*0x699e*/
      LOBYTE(v9) = *(_BYTE *)(DevEntry + 68); /*0x69a4*/
      v16 = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x69af*/
      *(_WORD *)(UsbRtDispatchTable + 30470) = 100; /*0x69b7*/
      v17 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64, _BYTE *, __int16))(200LL /*0x69d6*/
                                                                                            * (((*(unsigned __int8 *)(v5 + 1)
                                                                                               - 16) >> 4)
                                                                                             + 4)
                                                                                            + UsbRtDispatchTable
                                                                                            + 216))(
              v5,
              DevEntry,
              v9,
              v15,
              v8,
              v18);
      *(_WORD *)(UsbRtDispatchTable + 30470) = v16; /*0x69e8*/
      v10 = -(v17 == 0); /*0x69f5*/
    }
    else
    {
      HIWORD(v19) = v9; /*0x694c*/
      LOWORD(v19) = 2337; /*0x6952*/
      WORD1(v19) = v4 | 0x200; /*0x696e*/
      WORD2(v19) = *(unsigned __int8 *)(DevEntry + 19); /*0x697a*/
      v10 = SataDriverEntry(v5, DevEntry, v19, 100, (__int64)v8); /*0x6989*/
    }
    goto LABEL_16; /*0x698b*/
  }
  v10 = -1; /*0x68eb*/
LABEL_16:
  FwVolConfig((unsigned __int64)v8, 1u); /*0x69f7*/
  return v10; /*0x6a0e*/
}


// Function: UsbRingBufferAdvance @ 0x6a1c (0x53 bytes)

__int64 __fastcall UsbRingBufferAdvance(__int64 *a1, __int64 a2)
{
  __int64 result; // rax
  int v4; // ecx
  int v5; // edx

  result = *a1; /*0x6a22*/
  if ( *a1 && a2 ) /*0x6a30*/
  {
    if ( *((_DWORD *)a1 + 3) ) /*0x6a32*/
      MemConfig(*(_QWORD *)(result + 8LL * *((unsigned __int8 *)a1 + 8)), a2, *((unsigned int *)a1 + 3)); /*0x6a43*/
    v4 = *((unsigned __int8 *)a1 + 10); /*0x6a4c*/
    v5 = (*((unsigned __int8 *)a1 + 8) + 1) % v4; /*0x6a53*/
    result = (unsigned int)((*((unsigned __int8 *)a1 + 8) + 1) / v4); /*0x6a53*/
    *((_BYTE *)a1 + 8) = v5; /*0x6a55*/
    if ( (_BYTE)v5 == *((_BYTE *)a1 + 9) ) /*0x6a5b*/
    {
      result = (unsigned int)((*((unsigned __int8 *)a1 + 9) + 1) / v4); /*0x6a64*/
      *((_BYTE *)a1 + 9) = (*((unsigned __int8 *)a1 + 9) + 1) % v4; /*0x6a66*/
    }
  }
  return result; /*0x6a69*/
}


// Function: UsbHidParseReportDescriptorItem @ 0x6a70 (0x3fe bytes)

char __fastcall UsbHidParseReportDescriptorItem(__int64 a1, unsigned __int8 *n44, __int64 a3, unsigned __int8 *a4)
{
  unsigned __int8 j_1; // si
  unsigned __int8 *v6; // r14
  __int64 *v7; // r13
  unsigned __int64 v8; // rdx
  unsigned __int64 v9; // rax
  __int64 v10; // rbx
  unsigned __int8 v11; // dl
  char i; // cl
  __int64 v13; // rax
  unsigned __int8 n2; // cl
  unsigned __int8 v15; // dl
  __int64 j_2; // rax
  bool v17; // r9
  __int64 v18; // r8
  unsigned int v19; // edx
  char v20; // r10
  __int64 v21; // rax
  unsigned __int8 v23; // r15
  unsigned __int8 j; // cl
  unsigned __int8 v25; // di
  unsigned __int8 v26; // r15
  unsigned __int64 v27; // rdi
  unsigned __int8 v28; // r14
  __int64 v29; // rdx
  __int64 v30; // rax
  _BYTE *v31; // r12
  unsigned __int64 v32; // rcx
  unsigned __int64 v33; // rax
  __int64 v34; // rdx
  char v35; // [rsp+20h] [rbp-10h] BYREF
  __int64 v36; // [rsp+21h] [rbp-Fh]
  int v37; // [rsp+29h] [rbp-7h]
  __int16 v38; // [rsp+2Dh] [rbp-3h]
  char v39; // [... [9589 chars total]


// Function: UsbHidValidateReportSize @ 0x6ec4 (0x29 bytes)

char __fastcall UsbHidValidateReportSize(__int64 a1, char n8, __int64 a3, unsigned __int8 n80)
{
  char result; // al

  if ( n8 != 8 || !*(_BYTE *)(UsbRtDispatchTable + 31445) ) /*0x6ed3*/
    return -1; /*0x6ec9*/
  if ( n80 <= 1u ) /*0x6ee0*/
    return 4; /*0x6ee0*/
  result = -1; /*0x6ee2*/
  if ( n80 == 80 ) /*0x6ee8*/
    return 4; /*0x6eea*/
  return result; /*0x6ecb*/
}


// Function: UhciInitController @ 0x98e8 (0x284 bytes)

char __fastcall UhciInitController(__int64 UsbHcPtr)
{
  unsigned int n787200; // eax
  __int16 Config; // ax
  __int64 v5; // r8
  __int64 v6; // r8
  __int64 v7; // r8
  __int64 v8; // r8
  __int64 v9; // r8
  __int64 v10; // r8
  __int64 v11; // r8
  unsigned __int16 i; // di
  __int64 v13; // r8
  __int64 v14; // r8
  __int64 v15; // r8
  __int64 v16; // rdx
  unsigned __int16 j; // cx
  __int64 v18; // rax
  __int64 v19; // rax
  int v20; // eax
  int v21; // [rsp+58h] [rbp+10h] BYREF

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x9907*/
    return -1; /*0x9907*/
  n787200 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0x991d*/
  if ( n787200 != 787200 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI HC Class Code is wrong: %x\n", n787200);
    return -1; /*0x990b*/
  }
  *(_BYTE *)(UsbHcPtr + 32) = 2; /*0x9945*/
  *(_QWORD *)(UsbHcPtr + 16) = HcPciReadConfig(UsbHcPtr, 0x20u) & 0xFFFC; /*0x995c*/
  *(_WORD *)(UsbHcPtr + 48) = 1024; /*0x996a*/
  Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0x996e*/
  HcPciWriteConfig16(UsbHcPtr, 0xC0u, Config & 0xFFEF); /*0x9982*/
  UhciResetHc(UsbHcPtr); /*0x998a*/
  LOBYTE(v6) = ElibRead32(UsbHcPtr, 0x10u, v5) & 0xFB; /*0x99a1*/
  ElibWrite8(UsbHcPtr, 0x10u, v6); /*0x99a7*/
  LOBYTE(v8) = ElibRead32(UsbHcPtr, 0x12u, v7) & 0xFB; /*0x99be*/
  ElibWrite8(UsbHcPtr, 0x12u, v8); /*0x99c4*/
  if ( (ElibRead32(UsbHcPtr, 2u, v9) & 0x20) == 0 ) /*0x99d9*/
  {
    LOBYTE(v11) = ElibRead32(UsbHcPtr, 0, v10) & 0xFE; /*0x99e9*/
    ElibWrite8(UsbHcPtr, 0, v11); /*0x99ef*/
    for ( i = 0; i < 0x1F4u; ++i ) /*0x99f4*/
    {
      if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) != 0 ) /*0x9a04*/
        break; /*0x9a04*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x9a12*/
    }
  }
  if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) == 0 ) /*0x9a32*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 302, (__int64)"(HcByteReadHcIo(HcStruc, 0x02)) & 0x00000020"); /*0x9a47*/
  if ( (ElibRead32(UsbHcPtr, 2u, v13) & 0x20) == 0 ) /*0x9a59*/
    return -1; /*0x9a59*/
  LOBYTE(v14) = 4; /*0x9a66*/
  ElibWrite8(UsbHcPtr, 0, v14); /*0x9a6c*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x9a7d*/
  ElibWrite8(UsbHcPtr, 0, 0); /*0x9a8b*/
  v16 = *(_QWORD *)(UsbHcPtr + 8); /*0x9a90*/
  if ( !v16 ) /*0x9a97*/
    return -1; /*0x9a97*/
  for ( j = 0; j < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v16 + 4 * v18) = 1 ) /*0x9aa0*/
    v18 = j++; /*0x9aa6*/
  v21 = *(_DWORD *)(UsbHcPtr + 8); /*0x9ac8*/
  LOBYTE(v15) = 4; /*0x9acc*/
  v19 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, int *))(*(_QWORD *)(UsbHcPtr + 104) + 40LL))( /*0x9ade*/
          *(_QWORD *)(UsbHcPtr + 104),
          2,
          v15,
          8,
          1,
          &v21);
  if ( v19 < 0 ) /*0x9ae4*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v19); /*0x9af5*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 952, (__int64)"!EFI_ERROR (Status)"); /*0x9b0d*/
  }
  if ( UhciCreateRootHubQh(UsbHcPtr) ) /*0x9b15*/
    return -1; /*0x9b1c*/
  ElibWrite16Direct(UsbHcPtr, 0, 193); /*0x9b2d*/
  ElibWrite16Direct(UsbHcPtr, 4u, 4); /*0x9b3a*/
  *(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0x9b3f*/
  v20 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0x9b49*/
  if ( (v20 & 0x80u) == 0 ) /*0x9b4e*/
    *(_DWORD *)(UsbRtDispatchTable + 4) = v20 | 0x80; /*0x9b54*/
  return 0; /*0x9b63*/
}


// Function: UhciStartHc @ 0x9b6c (0x175 bytes)

char __fastcall UhciStartHc(__int64 UsbHcPtr)
{
  unsigned __int16 v2; // di
  __int16 Config; // ax
  __int64 TmpR8; // r8
  __int64 TmpRdx; // rdx
  __int64 TmpR8_1; // r8
  __int64 TmpRdx_1; // rdx
  __int64 v9; // r8
  __int64 v10; // r8
  __int64 v11; // r8
  unsigned __int16 i; // si
  __int64 v13; // r8
  __int64 v14; // rcx
  __int64 v15; // rax

  v2 = 0; /*0x9b88*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x9b9f*/
    return -1; /*0x9b8f*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0x9ba5*/
  {
    Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0x9bb1*/
    HcPciWriteConfig16(UsbHcPtr, 0xC0u, Config & 0xFFEF); /*0x9bc5*/
  }
  UhciResetHc(UsbHcPtr); /*0x9bcd*/
  LOBYTE(TmpR8) = 1; /*0x9bd4*/
  LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0x9bd7*/
  UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0x9bdd*/
  LOBYTE(TmpR8_1) = 2; /*0x9be4*/
  LOBYTE(TmpRdx_1) = *(_BYTE *)UsbHcPtr | 0x80; /*0x9be7*/
  UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx_1, TmpR8_1); /*0x9bed*/
  if ( (ElibRead32(UsbHcPtr, 2u, v9) & 0x20) == 0 ) /*0x9c01*/
  {
    LOBYTE(v11) = ElibRead32(UsbHcPtr, 0, v10) & 0xFE; /*0x9c11*/
    ElibWrite8(UsbHcPtr, 0, v11); /*0x9c17*/
    for ( i = 0; i < 0x1F4u; ++i ) /*0x9c1c*/
    {
      if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) != 0 ) /*0x9c2e*/
        break; /*0x9c2e*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x9c3c*/
    }
  }
  if ( (ElibRead32(UsbHcPtr, 2u, v10) & 0x20) == 0 ) /*0x9c5e*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 449, (__int64)"(HcByteReadHcIo(HcStruc, 0x02)) & 0x00000020"); /*0x9c73*/
  LOBYTE(v13) = 4; /*0x9c78*/
  ElibWrite8(UsbHcPtr, 0, v13); /*0x9c80*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x9c91*/
  ElibWrite8(UsbHcPtr, 0, 0); /*0x9c9f*/
  v14 = *(_QWORD *)(UsbHcPtr + 8); /*0x9ca4*/
  while ( v2 < *(_WORD *)(UsbHcPtr + 48) ) /*0x9cb7*/
  {
    v15 = v2++; /*0x9caa*/
    *(_DWORD *)(v14 + 4 * v15) = 1; /*0x9cb0*/
  }
  UsbConfig_0(UsbHcPtr); /*0x9cbc*/
  *(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0x9cc1*/
  UsbFindActiveHc(); /*0x9cc5*/
  return 0; /*0x9cdb*/
}


// Function: UhciStopHc @ 0x9ce4 (0x11c bytes)

char __fastcall UhciStopHc(_BYTE *a1)
{
  __int64 v2; // r8
  __int64 v4; // r8
  __int64 v5; // r8
  char v6; // di
  __int64 v7; // rdx
  __int64 v8; // r8
  __int64 v9; // r9
  __int64 v10; // r8
  unsigned __int16 v11; // ax
  __int64 v12; // r8
  __int64 v13; // rdx
  __int64 v14; // r8
  __int64 v15; // r9
  __int64 v16; // r8
  unsigned __int16 v17; // ax

  if ( (HcCheckInit((__int64)a1) & 0x8000000000000000uLL) != 0LL /*0x9d2a*/
    || (a1[64] & 1) == 0
    || (ElibRead32((__int64)a1, 2u, v2) & 0x20) != 0
    || ElibRead32((__int64)a1, 0, v4) == -1 )
  {
    return -1; /*0x9d00*/
  }
  if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x9d3a*/
  {
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x9d40*/
    v6 = *a1 | 0x80; /*0x9d54*/
    if ( (AssertCpuDeadLoop_1((__int64)a1, 0x10u, v5) & 3) == 2 ) /*0x9d61*/
      ElibWrite16Direct((__int64)a1, 0x10u, 2); /*0x9d6c*/
    LOBYTE(v8) = 1; /*0x9d71*/
    LOBYTE(v7) = v6; /*0x9d74*/
    DebugLogPrint_3((__int64)a1, v7, v8, v9); /*0x9d7a*/
    v11 = AssertCpuDeadLoop_1((__int64)a1, 0x10u, v10); /*0x9d84*/
    ElibWrite16Direct((__int64)a1, 0x10u, v11); /*0x9d92*/
    if ( (AssertCpuDeadLoop_1((__int64)a1, 0x12u, v12) & 3) == 2 ) /*0x9daa*/
      ElibWrite16Direct((__int64)a1, 0x12u, 2); /*0x9db5*/
    LOBYTE(v14) = 2; /*0x9dba*/
    LOBYTE(v13) = v6; /*0x9dbd*/
    DebugLogPrint_3((__int64)a1, v13, v14, v15); /*0x9dc3*/
    v17 = AssertCpuDeadLoop_1((__int64)a1, 0x12u, v16); /*0x9dcd*/
    ElibWrite16Direct((__int64)a1, 0x12u, v17); /*0x9ddb*/
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x9de7*/
  }
  return 0; /*0x9dfa*/
}


// Function: UhciResetHc @ 0x9e00 (0x3e bytes)

char __fastcall UhciResetHc(__int64 UsbHcPtr)
{
  __int64 v2; // r8
  __int64 v4; // r8

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x9e11*/
    return -1; /*0x9e13*/
  LOBYTE(v4) = ElibRead32(UsbHcPtr, 4u, v2) & 0xFB; /*0x9e2b*/
  ElibWrite8(UsbHcPtr, 4u, v4); /*0x9e31*/
  return 0; /*0x9e38*/
}


// Function: UhciTransfer @ 0x9e40 (0x8f bytes)

char __fastcall UhciTransfer(__int64 a1)
{
  __int64 n2047; // rdx
  __int64 v3; // r8
  __int64 v5; // r8
  unsigned __int16 v6; // ax

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9e57*/
    return -1; /*0x9e57*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x9e61*/
    return -1; /*0x9e61*/
  if ( (AssertCpuDeadLoop_0(a1, n2047, v3) & 0xFFFFF000LL) != *(_QWORD *)(a1 + 8) ) /*0x9e77*/
    return -1; /*0x9e77*/
  v6 = AssertCpuDeadLoop_1(a1, 2u, v5); /*0x9e81*/
  if ( (v6 & 0x20) != 0 ) /*0x9e88*/
    return -1; /*0x9e59*/
  if ( (v6 & 1) != 0 ) /*0x9e8c*/
  {
    ElibWrite16Direct(a1, 2u, v6); /*0x9e9a*/
    UhciWalkTransferList((_BYTE *)a1); /*0x9ea2*/
  }
  if ( (*(_BYTE *)(a1 + 64) & 0x10) != 0 ) /*0x9eab*/
    UhciCreateFrameList(a1, 0, 0); /*0x9ebd*/
  return 0; /*0x9ec9*/
}


// Function: UhciPortStatus @ 0x9ed0 (0x106 bytes)

__int64 __fastcall UhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
  int v3; // ebp
  __int64 v6; // r8
  unsigned __int16 v7; // r9
  __int64 result; // rax
  unsigned int v9; // r14d
  int n64; // ebx
  int v11; // edi
  int n64_1; // edx
  unsigned int n64_2; // ecx

  v3 = a2; /*0x9eed*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9f06*/
    return 255; /*0x9f08*/
  v9 = v7; /*0x9f12*/
  n64 = 64; /*0x9f1c*/
  v11 = (unsigned __int16)AssertCpuDeadLoop_1(a1, v7, v6); /*0x9f26*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI port[%d] status: %04x\n", v3, v11);
  if ( (v11 & 1) != 0 )
  {
    n64 = (v11 & 0x100) != 0 ? 67 : 69;
    if ( (v11 & 4) != 0 ) /*0x9f5f*/
      n64 |= 0x20u; /*0x9f61*/
  }
  if ( (v11 & 2) != 0 ) /*0x9f6d*/
  {
    n64 |= 0x10u; /*0x9f6f*/
    if ( a3 == 1 ) /*0x9f76*/
      ElibWrite16Direct(a1, v9, 2); /*0x9f7e*/
  }
  n64_1 = n64 | 0x400; /*0x9f93*/
  if ( (v11 & 0x200) == 0 ) /*0x9f9d*/
    n64_1 = n64; /*0x9f9d*/
  n64_2 = n64_1 | 0x100; /*0x9fa2*/
  if ( (v11 & 0x1000) == 0 ) /*0x9fa8*/
    n64_2 = n64_1; /*0x9fa8*/
  result = n64_2 | 0x1000; /*0x9fad*/
  if ( (v11 & 8) == 0 ) /*0x9fb4*/
    return n64_2; /*0x9fb4*/
  return result; /*0x9fcb*/
}


// Function: UhciPortReset @ 0x9fd8 (0x56 bytes)

char __fastcall UhciPortReset(__int64 a1)
{
  __int64 v2; // r8
  unsigned __int8 v3; // r9
  unsigned int v5; // ebx
  __int16 v6; // ax

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x9ff0*/
    return -1; /*0x9ff2*/
  v5 = 2 * v3 + 14; /*0x9ffd*/
  v6 = AssertCpuDeadLoop_1(a1, v5, v2); /*0xa006*/
  ElibWrite16Direct(a1, v5, v6 & 0xFFFB); /*0xa01c*/
  return 0; /*0xa028*/
}


// Function: UhciPortDisconnect @ 0xa030 (0xe5 bytes)

char __fastcall UhciPortDisconnect(__int64 a1)
{
  __int64 v2; // r8
  unsigned __int8 v3; // r9
  unsigned int v5; // ebx
  __int16 v6; // ax
  __int64 v7; // r8
  __int16 v8; // ax
  __int64 v9; // r8
  unsigned __int16 v10; // ax
  __int64 v11; // r8
  __int16 v12; // ax

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xa04d*/
    return -1; /*0xa04f*/
  v5 = 2 * v3 + 14; /*0xa05d*/
  v6 = AssertCpuDeadLoop_1(a1, v5, v2); /*0xa066*/
  ElibWrite16Direct(a1, v5, v6 & 0xFDF5 | 0x200u); /*0xa082*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0xa093*/
  v8 = AssertCpuDeadLoop_1(a1, v5, v7); /*0xa09e*/
  ElibWrite16Direct(a1, v5, v8 & 0xFDF5); /*0xa0b5*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xa0c6*/
  v10 = AssertCpuDeadLoop_1(a1, v5, v9); /*0xa0d1*/
  ElibWrite16Direct(a1, v5, v10); /*0xa0df*/
  v12 = AssertCpuDeadLoop_1(a1, v5, v11); /*0xa0e9*/
  ElibWrite16Direct(a1, v5, v12 & 0xFFF1 | 4u); /*0xa0fe*/
  return 0; /*0xa10f*/
}


// Function: UhciBulkTransfer @ 0xa118 (0xfd bytes)

char __fastcall UhciBulkTransfer(__int64 a1)
{
  __int64 v2; // r8
  unsigned int n0x400; // edi
  __int64 v5; // r8
  __int16 v6; // ax
  __int64 v7; // r8
  __int64 v8; // r8
  unsigned __int16 v9; // ax
  __int64 v10; // r8
  unsigned __int16 v11; // ax

  n0x400 = 0; /*0xa12f*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xa154*/
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (ElibRead32(a1, 2u, v2) & 0x20) != 0 )
  {
    return -1; /*0xa136*/
  }
  v6 = AssertCpuDeadLoop_1(a1, 0, v5); /*0xa15b*/
  ElibWrite16Direct(a1, 0, v6 & 0xFFFE); /*0xa16f*/
  do /*0xa19c*/
  {
    if ( (AssertCpuDeadLoop_1(a1, 2u, v7) & 0x20) != 0 ) /*0xa180*/
      break; /*0xa180*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xa18e*/
    ++n0x400; /*0xa194*/
  }
  while ( n0x400 < 0x400 ); /*0xa19c*/
  ElibWrite16Direct(a1, 4u, 2); /*0xa1a9*/
  v9 = AssertCpuDeadLoop_1(a1, 2u, v8); /*0xa1b3*/
  ElibWrite16Direct(a1, 2u, v9 | 0x1Fu); /*0xa1c5*/
  v11 = AssertCpuDeadLoop_1(a1, 0, v10); /*0xa1cf*/
  ElibWrite16Direct(a1, 0, v11 | 8u); /*0xa1e1*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(50000); /*0xa1f2*/
  *(_DWORD *)(a1 + 64) = *(_DWORD *)(a1 + 64) & 0xFFFFFFFC | 2; /*0xa200*/
  return 0; /*0xa20f*/
}


// Function: UhciInterruptTransfer @ 0xa218 (0x72 bytes)

char __fastcall UhciInterruptTransfer(__int64 UsbHcPtr, char a2)
{
  __int16 Config; // ax
  __int16 n6; // ax

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xa23a*/
    return -1; /*0xa232*/
  if ( *(_QWORD *)(UsbHcPtr + 120) ) /*0xa23c*/
  {
    Config = HcPciReadConfig(UsbHcPtr, 0xC0u); /*0xa24b*/
    if ( a2 == 1 ) /*0xa259*/
      n6 = Config & 0xDFEF | 0x10; /*0xa263*/
    else
      n6 = Config & 0xFFEF; /*0xa26e*/
    HcPciWriteConfig16(UsbHcPtr, 0xC0u, n6); /*0xa278*/
  }
  return 0; /*0xa284*/
}


// Function: DebugLogPrint_11 @ 0xa28c (0xad bytes)

__int64 __fastcall sub_A28C(__int64 a1, __int64 a2)
{
  int v4; // ebp
  int v5; // esi

  v4 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xa2b5*/
  *(_BYTE *)(a2 + 36) = 1; /*0xa2b9*/
  v5 = v4; /*0xa2bd*/
  UsbConfig_8(a1, a2); /*0xa2bf*/
  while ( 1 ) /*0xa2c6*/
  {
    if ( v4 ) /*0xa2c6*/
    {
      if ( !v5-- ) /*0xa2c8*/
        break; /*0xa2ce*/
    }
    UhciWalkQueueHead(a1, a2); /*0xa2d6*/
    if ( !*(_BYTE *)(a2 + 36) ) /*0xa2db*/
      break; /*0xa2db*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xa2ed*/
  }
  UsbConfig_12(a1, a2); /*0xa2fb*/
  UhciWalkQueueHead(a1, a2); /*0xa306*/
  if ( *(_BYTE *)(a2 + 36) ) /*0xa30b*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "UHCI Time-Out\n"); /*0xa31c*/
  return *(unsigned int *)(a2 + 17); /*0xa333*/
}


// Function: SysKbcDriverEntry @ 0xa33c (0x3de bytes)

__int64 __fastcall SysKbcDriverEntry(
        __int64 a1,
        __int64 a2,
        __int16 a3,
        __int16 a4,
        __int16 a5,
        __int64 a6,
        unsigned __int16 a7)
{
  unsigned __int64 v8; // r15
  unsigned __int16 v9; // r12
  __int64 v12; // r14
  __int64 result; // rax
  __int64 v14; // r8
  __int64 UsbRtDispatchTable; // rax
  __int64 v16; // rax
  unsigned __int64 v17; // rdi
  int v18; // ebx
  __int64 v19; // r15
  int v20; // r11d
  __int64 v21; // r8
  char v22; // r9
  __int16 v23; // si
  unsigned __int16 v24; // r10
  int v25; // ecx
  int v26; // ecx
  int v27; // eax
  unsigned __int16 v28; // cx
  unsigned int v29; // edx
  int v30; // ecx
  _DWORD *v31; // rcx
  int v32; // eax
  unsigned __int64 v33; // rsi
  unsigned int v34; // ebx
  unsigned __int16 v35; // bp
  __int64 v36; // rbx
  __int64 UsbRtDispatchTable_1; // rcx
  _DWORD *v38; // [rsp+38h] [rbp-60h]
  __int64 v39; // [rsp+40h] [rbp-58h] BYREF
  __int64 v40; // [rsp+48h] [rbp-50h] BYREF
  unsigned __int64 v41; // [rsp+50h] [rbp-48h]
  __int64 v42; // [rsp+58h] [rbp-40h]
  char v44; // [rsp+B0h] [rbp+18h]

  v44 = a3; /*0xa343*/
  v8 = 0; /*0xa362*/
  v39 = 0; /*0xa365*/
  v9 = 0; /*0xa369*/
  v40 = 0; /*0xa36d*/
  v12 = a1; /*0xa378*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xa383*/
    return 0; /*0xa383*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xa399*/
    return 0; /*0xa399*/
  if ( (*(_BYTE *)(v12 + 64) & 1) == 0 ) /*0xa3a4*/
    return 0; /*0xa3a4*/
  if ( (ElibRead32(v12, 2u, v14) & 0x20) != 0 ) /*0xa3b3*/
    return 0; /*0xa3b3*/
  if ( (*(_BYTE *)a2 & 3) == 0 ) /*0xa3b9*/
    return 0; /*0xa3b9*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xa3bb*/
  *(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xa3c4*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xa3cb*/
  v16 = UsbConfig_1(1u); /*0xa3d2*/
  v41 = v16; /*0xa3d7*/
  v17 = v16; /*0xa3dc*/
  if ( !v16 ) /*0xa3e2*/
    return 0; /*0xa389*/
  *(_WORD *)(v16 + 24) = a3; /*0xa3f3*/
  *(_WORD *)(v16 + 26) = a5; /*0xa402*/
  *(_WORD *)(v16 + 28) = a4; /*0xa406*/
  *(_WORD *)(v16 + 30) = a7; /*0xa40a*/
  v18 = *(unsigned __int8 *)(a2 + 10) << 8; /*0xa422*/
  *(_DWORD *)(v16 + 4) = ((*(_BYTE *)(a2 + 14) & 1) << 26) | 0x18800000; /*0xa425*/
  *(_DWORD *)(v16 + 16) = 0; /*0xa42f*/
  *(_DWORD *)(v16 + 8) = v18 | 0xE0002D; /*0xa433*/
  *(_DWORD *)(v16 + 12) = v16 + 24; /*0xa439*/
  *(_BYTE *)(v16 + 21) = 1; /*0xa43c*/
  v38 = (_DWORD *)v16; /*0xa440*/
  if ( a7 ) /*0xa449*/
  {
    v9 = a7 / *(_WORD *)(a2 + 16); /*0xa45b*/
    if ( a7 % (unsigned int)*(unsigned __int16 *)(a2 + 16) ) /*0xa459*/
      ++v9; /*0xa462*/
    v42 = UsbConfig_1((32 * (unsigned __int64)v9 + 31) >> 5); /*0xa47b*/
    v19 = v42; /*0xa480*/
    if ( !v42 ) /*0xa486*/
    {
      FwVolConfig(v17, 1u); /*0xa48e*/
      return 0; /*0xa495*/
    }
    ElibReadNvStore(v12, a3 & 0x80, a6, a7, &v39, (__int64)&v40); /*0xa4cd*/
    v20 = v39; /*0xa4d2*/
    v21 = v19 + 12; /*0xa4d7*/
    v22 = 1; /*0xa4db*/
    v23 = a3 & 0x80; /*0xa4e0*/
    v24 = a7; /*0xa4eb*/
    do /*0xa582*/
    {
      v25 = *(_BYTE *)(a2 + 14) & 1; /*0xa4f7*/
      *(_DWORD *)v21 = v20; /*0xa4fa*/
      v26 = (v25 << 26) | 0x18800000; /*0xa500*/
      v27 = v26 | 0x20000000; /*0xa508*/
      if ( !v23 ) /*0xa50f*/
        v27 = v26; /*0xa50f*/
      v28 = v24; /*0xa512*/
      *(_DWORD *)(v21 - 8) = v27; /*0xa516*/
      if ( v24 > *(_WORD *)(a2 + 16) ) /*0xa51f*/
        v28 = *(_WORD *)(a2 + 16); /*0xa51f*/
      v24 -= v28; /*0xa524*/
      v20 += v28; /*0xa52f*/
      v29 = v18 | ((unsigned __int16)(v28 - 1) << 21) | 0xE1; /*0xa53a*/
      if ( v23 ) /*0xa543*/
        v29 = v18 & 0xFFFFFF00 | ((unsigned __int16)(v28 - 1) << 21) | 0x69; /*0xa54b*/
      *(_DWORD *)(v21 + 4) = 0; /*0xa551*/
      *(_BYTE *)(v21 + 9) = 1; /*0xa557*/
      v30 = v29 | 0x80000; /*0xa55b*/
      if ( (v22 & 1) == 0 ) /*0xa562*/
        v30 = v29; /*0xa562*/
      v22 ^= 1u; /*0xa565*/
      *(_DWORD *)(v21 - 4) = v30; /*0xa568*/
      v31 = (_DWORD *)(v21 - 12); /*0xa56c*/
      v32 = v21 - 12; /*0xa570*/
      v21 += 32; /*0xa572*/
      *(_DWORD *)v17 = v32 | 4; /*0xa579*/
      v17 = (unsigned __int64)v31; /*0xa57b*/
    }
    while ( v24 ); /*0xa582*/
    v17 = v41; /*0xa588*/
    v12 = a1; /*0xa593*/
    v8 = v42; /*0xa59b*/
    v38 = v31; /*0xa5a0*/
  }
  v33 = UsbConfig_1(1u); /*0xa5ad*/
  result = 0; /*0xa5b0*/
  if ( v33 ) /*0xa5b5*/
  {
    v34 = v18 | 0xE1; /*0xa5c5*/
    *v38 = v33 | 4; /*0xa5cb*/
    *(_DWORD *)v33 = 1; /*0xa5d2*/
    *(_DWORD *)(v33 + 4) = ((*(_BYTE *)(a2 + 14) & 1) << 26) | 0x18800000; /*0xa5ea*/
    if ( v44 >= 0 ) /*0xa5ed*/
      v34 = v34 & 0xFFFFFF00 | 0x69; /*0xa5f5*/
    v35 = 0; /*0xa5f8*/
    *(_BYTE *)(v33 + 21) = 1; /*0xa5fa*/
    *(_DWORD *)(v33 + 16) = 0; /*0xa600*/
    *(_DWORD *)(v33 + 12) = v33 + 24; /*0xa609*/
    *(_DWORD *)(v33 + 8) = v34 | 0xFFE80000; /*0xa60c*/
    v36 = UsbConfig_1(2u); /*0xa617*/
    if ( v36 ) /*0xa61d*/
    {
      *(_BYTE *)(v36 + 16) = 0; /*0xa626*/
      *(_DWORD *)v36 = 1; /*0xa62d*/
      *(_DWORD *)(v36 + 22) = 1; /*0xa632*/
      *(_DWORD *)(v36 + 17) = 0; /*0xa635*/
      *(_BYTE *)(v36 + 21) = 0; /*0xa638*/
      *(_WORD *)(v36 + 34) = 0; /*0xa63c*/
      *(_BYTE *)(v36 + 36) = 0; /*0xa640*/
      *(_QWORD *)(v36 + 37) = 0; /*0xa644*/
      *(_DWORD *)(v36 + 4) = v17; /*0xa648*/
      *(_QWORD *)(v36 + 8) = v17; /*0xa64b*/
      *(_QWORD *)(v36 + 26) = v17; /*0xa64f*/
      v35 = DebugLogPrint_11(v12, v36) - ((*(_WORD *)(v17 + 4) + 1) & 0x7FF); /*0xa669*/
      UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xa673*/
      *(_DWORD *)(UsbRtDispatchTable + 30476) = (*(_DWORD *)(*(_QWORD *)(v36 + 8) + 4LL) >> 17) & 0x7F; /*0xa680*/
      if ( (*(_DWORD *)(*(_QWORD *)(v36 + 8) + 4LL) & 0x400000) != 0 ) /*0xa691*/
      {
        *(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 4u; /*0xa693*/
        v35 = 0; /*0xa69c*/
      }
      if ( a7 ) /*0xa6a3*/
        (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(v12 + 104) + 80LL))(*(_QWORD *)(v12 + 104), v40); /*0xa6b1*/
      FwVolConfig(v17, 1u); /*0xa6c0*/
      if ( v8 ) /*0xa6ca*/
        FwVolConfig(v8, (32 * (unsigned __int64)v9 + 31) >> 5); /*0xa6e2*/
      FwVolConfig(v33, 1u); /*0xa6ed*/
      FwVolConfig(v36, 2u); /*0xa6fa*/
    }
    return v35; /*0xa6ff*/
  }
  return result; /*0xa70a*/
}


// Function: XhciBuildTrbSgList @ 0xa71c (0xf2 bytes)

_DWORD *__fastcall XhciBuildTrbSgList(
        _DWORD *a1,
        unsigned __int16 a2,
        int a3,
        int *a4,
        char *a5,
        unsigned int *a6,
        unsigned __int16 a7)
{
  int v7; // r10d
  char v9; // r12
  unsigned __int16 v10; // si
  char v11; // r11
  int v12; // ebx
  unsigned int v13; // edi
  unsigned int v14; // r8d
  unsigned int v15; // r9d
  int v16; // edx
  bool v17; // zf

  v7 = *a4; /*0xa73d*/
  v9 = 0; /*0xa746*/
  v10 = 0; /*0xa749*/
  v11 = *a5; /*0xa74d*/
  if ( a7 ) /*0xa75b*/
  {
    v12 = a3 | 0x18800000; /*0xa766*/
    v13 = a2; /*0xa76c*/
    do /*0xa7e3*/
    {
      v14 = *a6; /*0xa76f*/
      v15 = *a6; /*0xa772*/
      if ( *a6 <= v13 ) /*0xa778*/
        v9 = 1; /*0xa77f*/
      else
        v15 = v13; /*0xa77a*/
      v16 = a1[2] & 0x17FFFF | ((v15 - 1) << 21); /*0xa798*/
      a1[2] = v16; /*0xa79c*/
      if ( v11 == 1 ) /*0xa7a2*/
        a1[2] = v16 | 0x80000; /*0xa7a8*/
      v17 = *((_BYTE *)a1 + 8) == 105; /*0xa7ab*/
      a1[1] = v12; /*0xa7af*/
      if ( v17 ) /*0xa7b2*/
        a1[1] = v12 | 0x20000000; /*0xa7ba*/
      a1[3] = v7; /*0xa7c2*/
      v7 += v13; /*0xa7c9*/
      *a6 = v14 - v15; /*0xa7cc*/
      a1 += 8; /*0xa7cf*/
      v11 ^= 1u; /*0xa7d3*/
      if ( v9 ) /*0xa7d9*/
        break; /*0xa7d9*/
      ++v10; /*0xa7db*/
    }
    while ( v10 < a7 ); /*0xa7e3*/
  }
  *(a1 - 8) = 1; /*0xa7f4*/
  *a5 = v11; /*0xa7fb*/
  *a4 = v7; /*0xa804*/
  return a1 - 8; /*0xa807*/
}


// Function: SysKbcDataHandler @ 0xa810 (0x362 bytes)

__int64 __fastcall SysKbcDataHandler(__int64 a1, __int64 a2, signed __int8 a3, __int64 a4, unsigned int a5)
{
  __int64 v9; // r8
  __int64 UsbRtDispatchTable; // rax
  unsigned __int16 v11; // r14
  unsigned __int8 v12; // si
  int v13; // eax
  int v14; // esi
  int v15; // eax
  __int64 v16; // rax
  unsigned __int64 v17; // rbx
  unsigned int v18; // r14d
  unsigned __int16 v19; // r15
  unsigned __int64 n0x80; // r14
  unsigned int *v21; // r12
  unsigned int *v22; // rdx
  __int64 v23; // r8
  unsigned int *v24; // rcx
  unsigned int *v25; // r15
  int v26; // eax
  unsigned __int16 v27; // si
  int v28; // eax
  __int64 v29; // rcx
  int v30; // edx
  unsigned __int8 v31; // r8
  unsigned int *v32; // rax
  unsigned int v33; // ecx
  __int64 UsbRtDispatchTable_1; // rcx
  char v35; // [rsp+40h] [rbp-40h] BYREF
  char v36; // [rsp+41h] [rbp-3Fh]
  int v37; // [rsp+44h] [rbp-3Ch]
  unsigned int v38; // [rsp+48h] [rbp-38h] BYREF
  unsigned int v39; // [rsp+4Ch] [rbp-34h]
  unsigned int v40; // [rsp+50h] [rbp-30h]
  int v41; // [rsp+54h] [rbp-2Ch] BYREF
  __int64 v42; // [rsp+58h] [rbp-28h] BYREF
  unsigned int *v43; // [rsp+60h] [rbp-20h]
  __int64 v44; // [rsp+68h] [rbp-18h] BYREF
  unsigned int *v45; // [rsp+70h] [rbp-10h]

  v42 = 0; /*0xa83a*/
  v44 = 0; /*0xa841*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xa887*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (ElibRead32(a1, 2u, v9) & 0x20) != 0
    || (*(_BYTE *)a2 & 3) == 0
    || !a5 )
  {
    return 0; /*0xa887*/
  }
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xa889*/
  *(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0xa890*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xa897*/
  v11 = a3 >= 0 ? *(_WORD *)(a2 + 106) : *(_WORD *)(a2 + 104);
  LOWORD(v37) = v11; /*0xa8af*/
  if ( !v11 ) /*0xa8b8*/
    return 0; /*0xa8b8*/
  if ( a3 >= 0 ) /*0xa8c0*/
    v12 = *(_BYTE *)(a2 + 70); /*0xa8c8*/
  else
    v12 = *(_BYTE *)(a2 + 69); /*0xa8c2*/
  v36 = a3 | v12; /*0xa8d7*/
  v35 = FwVolDriverEntry_2(a2, a3 | v12); /*0xa8eb*/
  v13 = (*(unsigned __int8 *)(a2 + 10) | (v12 << 7)) << 8; /*0xa8f7*/
  v14 = v13 | 0xE1; /*0xa8f9*/
  v15 = v13 | 0x69; /*0xa8ff*/
  if ( a3 < 0 ) /*0xa904*/
    v14 = v15; /*0xa904*/
  v16 = UsbConfig_1(2u); /*0xa907*/
  v17 = v16; /*0xa90c*/
  if ( !v16 ) /*0xa912*/
    return 0; /*0xa852*/
  *(_DWORD *)(v16 + 22) = 0; /*0xa918*/
  v18 = 0x380u / v11; /*0xa92c*/
  v40 = v18; /*0xa929*/
  if ( !(_WORD)v18 ) /*0xa932*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 1631, (__int64)"NumBulkTDs != 0"); /*0xa947*/
  v19 = 2 * v18; /*0xa950*/
  n0x80 = (32 * (unsigned __int64)(unsigned __int16)(2 * v18) + 31) >> 5; /*0xa960*/
  v21 = (unsigned int *)UsbConfig_1(n0x80); /*0xa96d*/
  if ( !v21 ) /*0xa975*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 1636, (__int64)"BulkDataTd0 != ((void *) 0)"); /*0xa98a*/
  v22 = v21; /*0xa991*/
  if ( v19 ) /*0xa998*/
  {
    v23 = v19; /*0xa99a*/
    do /*0xa9b3*/
    {
      v24 = v22; /*0xa99e*/
      v22[2] = v14; /*0xa9a1*/
      v22 += 8; /*0xa9a4*/
      *v24 = (unsigned int)v22 | 4; /*0xa9ad*/
      --v23; /*0xa9af*/
    }
    while ( v23 ); /*0xa9b3*/
  }
  ElibReadNvStore(a1, a3, a4, a5, &v42, (__int64)&v44); /*0xa9d7*/
  v25 = v21; /*0xa9e8*/
  v45 = &v21[8 * (unsigned __int16)v40]; /*0xa9fe*/
  v43 = v45; /*0xaa06*/
  v39 = 0; /*0xaa0c*/
  v41 = v42; /*0xaa12*/
  v26 = *(_BYTE *)(a2 + 14) & 1; /*0xaa19*/
  v38 = a5; /*0xaa1c*/
  v27 = v37; /*0xaa1f*/
  LODWORD(v42) = v26 << 26; /*0xaa34*/
  XhciBuildTrbSgList(v21, v37, v26 << 26, &v41, &v35, &v38, v40); /*0xaa37*/
  do /*0xaae3*/
  {
    *(_WORD *)(v17 + 34) = 0; /*0xaa3e*/
    *(_DWORD *)v17 = 1; /*0xaa43*/
    *(_BYTE *)(v17 + 16) = 0; /*0xaa49*/
    *(_DWORD *)(v17 + 17) = 0; /*0xaa4c*/
    *(_BYTE *)(v17 + 21) = 0; /*0xaa4f*/
    *(_BYTE *)(v17 + 36) = 0; /*0xaa52*/
    *(_QWORD *)(v17 + 37) = 0; /*0xaa55*/
    *(_DWORD *)(v17 + 4) = (_DWORD)v25; /*0xaa59*/
    *(_QWORD *)(v17 + 8) = v25; /*0xaa5d*/
    *(_QWORD *)(v17 + 26) = v25; /*0xaa61*/
    if ( v38 ) /*0xaa68*/
      XhciBuildTrbSgList(v43, v27, v42, &v41, &v35, &v38, v40); /*0xaa93*/
    v28 = DebugLogPrint_11(a1, v17); /*0xaa9e*/
    v29 = *(_QWORD *)(v17 + 8); /*0xaaa3*/
    v30 = v28; /*0xaaa7*/
    v31 = *(_BYTE *)(v17 + 16); /*0xaaa9*/
    v35 = v31; /*0xaaad*/
    v37 = (*(_DWORD *)(v29 + 4) >> 17) & 0x7F; /*0xaaba*/
    if ( v37 ) /*0xaabd*/
      break; /*0xaabd*/
    v32 = v21; /*0xaac2*/
    v33 = v30 + v39; /*0xaac5*/
    v43 = v25; /*0xaac7*/
    v39 += v30; /*0xaace*/
    if ( v25 == v21 ) /*0xaad1*/
      v32 = v45; /*0xaad1*/
    v25 = v32; /*0xaad6*/
    if ( v33 >= a5 ) /*0xaadc*/
      break; /*0xaadc*/
  }
  while ( !*(_BYTE *)(v17 + 21) ); /*0xaae3*/
  FwVolDriverEntry_1(a2, v36, v31); /*0xaaef*/
  UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xaaf7*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = v37; /*0xaafe*/
  if ( (*(_DWORD *)(*(_QWORD *)(v17 + 8) + 4LL) & 0x400000) != 0 ) /*0xab0f*/
    *(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 1u; /*0xab11*/
  if ( (*(_DWORD *)(*(_QWORD *)(v17 + 8) + 4LL) & 0x800000) != 0 ) /*0xab23*/
    *(_BYTE *)(UsbRtDispatchTable_1 + 30472) |= 2u; /*0xab25*/
  (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 104) + 80LL))(*(_QWORD *)(a1 + 104), v44); /*0xab37*/
  FwVolConfig((unsigned __int64)v21, n0x80); /*0xab42*/
  FwVolConfig(v17, 2u); /*0xab4f*/
  return v39; /*0xab5f*/
}


// Function: SysKbcDecodeKey @ 0xab74 (0x20a bytes)

__int64 __fastcall SysKbcDecodeKey(__int64 a1, _BYTE *a2, char a3, __int64 a4, __int64 a5, unsigned __int16 a6)
{
  __int64 v10; // r8
  _DWORD *v11; // rax
  unsigned __int64 v12; // r15
  char v13; // bp
  int v14; // esi
  unsigned __int16 v15; // bx
  int v16; // eax
  __int64 v17; // rax
  unsigned __int64 v18; // rdi
  __int64 v19; // [rsp+30h] [rbp-38h] BYREF
  __int64 v20; // [rsp+38h] [rbp-30h] BYREF

  v19 = 0; /*0xab95*/
  v20 = 0; /*0xab9c*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xabab*/
    return 0; /*0xabab*/
  if ( (UsbValidateDeviceEntry((__int64)a2) & 0x8000000000000000uLL) != 0LL ) /*0xabc0*/
    return 0; /*0xabc0*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xabcb*/
    return 0; /*0xabcb*/
  if ( (ElibRead32(a1, 2u, v10) & 0x20) != 0 ) /*0xabda*/
    return 0; /*0xabda*/
  if ( (*a2 & 3) == 0 ) /*0xabe1*/
    return 0; /*0xabe1*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xabf2*/
  if ( !a6 ) /*0xabfb*/
    return 0; /*0xabfb*/
  v11 = (_DWORD *)UsbConfig_1(1u); /*0xabff*/
  v12 = (unsigned __int64)v11; /*0xac04*/
  if ( !v11 ) /*0xac0a*/
    return 0; /*0xabad*/
  *v11 = 1; /*0xac0f*/
  v13 = FwVolDriverEntry_2((__int64)a2, a3); /*0xac1e*/
  v14 = ((unsigned __int8)a2[10] | ((a3 & 0xF) << 7)) << 8; /*0xac5f*/
  *(_DWORD *)(v12 + 4) = ((a2[14] & 1) << 26) | 0x18800000; /*0xac6b*/
  ElibReadNvStore(a1, a3 & 0x80, a5, a6, &v19, (__int64)&v20); /*0xac72*/
  *(_DWORD *)(v12 + 12) = v19; /*0xac7d*/
  v15 = 0; /*0xac8c*/
  *(_DWORD *)(v12 + 16) = 0; /*0xac94*/
  *(_BYTE *)(v12 + 21) = 1; /*0xaca3*/
  v16 = v14 | ((a6 - 1) << 21) | (a3 < 0 ? 105 : 225) | 0x80000;
  if ( (v13 & 1) == 0 )
    v16 = v14 | ((a6 - 1) << 21) | (a3 < 0 ? 105 : 225);
  *(_DWORD *)(v12 + 8) = v16; /*0xacb6*/
  v17 = UsbConfig_1(2u); /*0xacba*/
  v18 = v17; /*0xacbf*/
  if ( v17 ) /*0xacc5*/
  {
    *(_DWORD *)v17 = 1; /*0xaccb*/
    *(_BYTE *)(v17 + 16) = 0; /*0xaccd*/
    *(_DWORD *)(v17 + 17) = 0; /*0xacd0*/
    *(_BYTE *)(v17 + 21) = 0; /*0xacd3*/
    *(_WORD *)(v17 + 34) = 0; /*0xacd6*/
    *(_BYTE *)(v17 + 36) = 0; /*0xacda*/
    *(_QWORD *)(v17 + 37) = 0; /*0xacdd*/
    *(_DWORD *)(v17 + 4) = v12; /*0xace1*/
    *(_QWORD *)(v17 + 8) = v12; /*0xace5*/
    *(_DWORD *)(v17 + 22) = 2; /*0xace9*/
    *(_QWORD *)(v17 + 26) = v12; /*0xacec*/
    *(_BYTE *)(v17 + 34) = UsbGetInfo_9(a2[320]); /*0xacff*/
    v15 = DebugLogPrint_11(a1, v18); /*0xad11*/
    *(_DWORD *)(UsbRtDispatchTable + 30476) = (*(_DWORD *)(*(_QWORD *)(v18 + 8) + 4LL) >> 17) & 0x7F; /*0xad26*/
    FwVolDriverEntry_1((__int64)a2, a3, *(_BYTE *)(v18 + 16)); /*0xad34*/
    (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 104) + 80LL))(*(_QWORD *)(a1 + 104), v20); /*0xad45*/
    FwVolConfig(v12, 1u); /*0xad4e*/
    FwVolConfig(v18, 2u); /*0xad58*/
  }
  return v15; /*0xad71*/
}


// Function: SysKbcBuildKeyCode @ 0xad80 (0x11a bytes)

char __fastcall SysKbcBuildKeyCode(__int64 a1, __int64 a2)
{
  __int64 v5; // r8
  unsigned __int64 v6; // rsi
  __int64 v7; // rax
  unsigned __int64 v8; // rcx
  unsigned __int16 v9; // r8
  int *v10; // rax
  int v11; // eax
  unsigned __int64 v12; // rcx

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xada4*/
    return -1; /*0xada4*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xadb8*/
    return -1; /*0xadb8*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xadbe*/
    return -1; /*0xadbe*/
  if ( (ElibRead32(a1, 2u, v5) & 0x20) != 0 ) /*0xadcf*/
    return -1; /*0xadcf*/
  v6 = *(_QWORD *)(a2 + 24); /*0xadd1*/
  if ( !v6 ) /*0xadd8*/
    return -1; /*0xada6*/
  UsbConfig_12(a1, *(_QWORD *)(a2 + 24)); /*0xade0*/
  v7 = *(_QWORD *)(v6 + 26); /*0xade5*/
  if ( (*(_DWORD *)(v7 + 4) & 0xFE0000) == 0 ) /*0xadf0*/
    FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), (*(_DWORD *)(v7 + 8) & 0x80000) == 0); /*0xae07*/
  v8 = *(_QWORD *)(v6 + 26); /*0xae0c*/
  v9 = 0; /*0xae10*/
  v10 = (int *)v8; /*0xae14*/
  if ( v8 ) /*0xae1a*/
  {
    do /*0xae2e*/
    {
      v11 = *v10; /*0xae1c*/
      ++v9; /*0xae1e*/
      if ( (v11 & 1) != 0 ) /*0xae24*/
        break; /*0xae24*/
      v10 = (int *)(v11 & 0xFFFFFFF0); /*0xae2b*/
    }
    while ( v10 ); /*0xae2e*/
    FwVolConfig(v8, (32 * (unsigned __int64)v9 + 31) >> 5); /*0xae43*/
  }
  FwVolConfig(v6, 2u); /*0xae50*/
  v12 = *(_QWORD *)(a2 + 232); /*0xae55*/
  *(_QWORD *)(a2 + 24) = 0; /*0xae5c*/
  if ( v12 ) /*0xae63*/
  {
    FwVolConfig(v12, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xae77*/
    *(_QWORD *)(a2 + 232) = 0; /*0xae7c*/
  }
  return 0; /*0xae94*/
}


// Function: SysKbcCheckStatus @ 0xae9c (0x219 bytes)

char __fastcall SysKbcCheckStatus(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int16 v4; // di
  __int64 v5; // r8
  __int64 v6; // rax
  __int64 v7; // rsi
  char v8; // r14
  unsigned int v9; // r12d
  char v10; // r15
  char v11; // al
  unsigned __int16 v12; // dx
  __int64 v13; // r14
  __int64 v14; // rax
  __int64 v15; // rsi
  int *v16; // rax
  int v17; // eax
  unsigned __int64 v18; // rcx
  __int64 v19; // rax
  __int64 v21[9]; // [rsp+60h] [rbp-48h] BYREF
  char v22; // [rsp+C0h] [rbp+18h] BYREF
  unsigned int v23; // [rsp+C8h] [rbp+20h] BYREF

  v4 = 0; /*0xaebb*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL /*0xaefb*/
    && (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) == 0LL
    && (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0
    && (ElibRead32(UsbHcPtr, 2u, v5) & 0x20) == 0
    && (*(_BYTE *)a2 & 3) != 0 )
  {
    v6 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xaf10*/
    *(_QWORD *)(a2 + 232) = v6; /*0xaf15*/
    v7 = v6; /*0xaf1c*/
    if ( v6 ) /*0xaf22*/
    {
      v8 = *(_BYTE *)(a2 + 64); /*0xaf28*/
      v9 = *(unsigned __int16 *)(a2 + 322); /*0xaf36*/
      v10 = *(_BYTE *)(a2 + 14) & 1; /*0xaf3e*/
      v21[0] = v6; /*0xaf41*/
      v23 = v9; /*0xaf46*/
      v11 = FwVolDriverEntry_2(a2, v8); /*0xaf4e*/
      v12 = *(_WORD *)(a2 + 62); /*0xaf53*/
      v22 = v11; /*0xaf5e*/
      if ( v9 /*0xafc2*/
        && (v13 = UhciBuildTransferDescriptors(
                    *(_BYTE *)(a2 + 10),
                    v10,
                    ((v8 >> 7) & 0x88u) - 31,
                    v8 & 0xF,
                    v12,
                    v21,
                    &v23,
                    &v22,
                    v7,
                    v9,
                    v11)) != 0 )
      {
        v14 = UsbConfig_1(2u); /*0xafcf*/
        v15 = v14; /*0xafd4*/
        if ( v14 ) /*0xafda*/
        {
          *(_QWORD *)(a2 + 24) = v14; /*0xb01b*/
          *(_DWORD *)v14 = 1; /*0xb01f*/
          *(_BYTE *)(v14 + 16) = 0; /*0xb022*/
          *(_DWORD *)(v14 + 17) = 0; /*0xb026*/
          *(_BYTE *)(v14 + 21) = 0; /*0xb029*/
          *(_WORD *)(v14 + 34) = 0; /*0xb02d*/
          *(_BYTE *)(v14 + 36) = 0; /*0xb031*/
          *(_QWORD *)(v14 + 37) = 0; /*0xb035*/
          *(_DWORD *)(v14 + 4) = v13; /*0xb039*/
          *(_QWORD *)(v14 + 8) = v13; /*0xb03d*/
          *(_DWORD *)(v14 + 22) = 2; /*0xb041*/
          *(_QWORD *)(v14 + 26) = v13; /*0xb045*/
          *(_BYTE *)(v14 + 34) = UsbGetInfo_9(*(_BYTE *)(a2 + 320)); /*0xb05b*/
          *(_BYTE *)(v15 + 35) = UsbRegisterNotifyFunc((__int64)UhciNullSub2); /*0xb066*/
          *(_QWORD *)(v15 + 37) = a2; /*0xb06c*/
          *(_BYTE *)(v15 + 36) = 1; /*0xb070*/
          UsbConfig_8(UsbHcPtr, v15); /*0xb074*/
          return 0; /*0xb07b*/
        }
        FwVolConfig(*(_QWORD *)(a2 + 232), ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xaff2*/
        v16 = (int *)v13; /*0xaff7*/
        do /*0xb00d*/
        {
          v17 = *v16; /*0xaffa*/
          ++v4; /*0xaffc*/
          if ( (v17 & 1) != 0 ) /*0xb003*/
            break; /*0xb003*/
          v16 = (int *)(v17 & 0xFFFFFFF0); /*0xb00a*/
        }
        while ( v16 ); /*0xb00d*/
        v18 = v13; /*0xb012*/
        v19 = 32LL * v4; /*0xb015*/
      }
      else
      {
        v19 = *(unsigned __int16 *)(a2 + 322); /*0xb07d*/
        v18 = *(_QWORD *)(a2 + 232); /*0xb084*/
      }
      FwVolConfig(v18, (unsigned __int64)(v19 + 31) >> 5); /*0xb096*/
    }
  }
  return -1; /*0xb0a5*/
}


// Function: SysKbcReadData @ 0xb0b8 (0xcf bytes)

char __fastcall SysKbcReadData(__int64 a1)
{
  unsigned __int64 v2; // rdi
  __int64 v3; // r8
  unsigned __int64 v4; // rcx
  unsigned __int64 v5; // rdx
  unsigned __int64 v6; // rcx
  unsigned __int64 v7; // r8

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb0d5*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xb0e4*/
    return -1; /*0xb0e4*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xb0ee*/
    return -1; /*0xb0ee*/
  if ( (ElibRead32(a1, 2u, v3) & 0x20) != 0 ) /*0xb103*/
    return -1; /*0xb103*/
  v4 = *(_QWORD *)(a1 + 40); /*0xb105*/
  if ( !v4 ) /*0xb10c*/
    return -1; /*0xb10c*/
  v5 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb115*/
  if ( v4 < v5 ) /*0xb11f*/
    return -1; /*0xb11f*/
  if ( v4 + 24 > v2 ) /*0xb128*/
    return -1; /*0xb128*/
  v6 = *(_QWORD *)(v4 + 16); /*0xb12a*/
  if ( !v6 ) /*0xb131*/
    return -1; /*0xb131*/
  if ( v6 < v5 ) /*0xb136*/
    return -1; /*0xb136*/
  if ( v6 + 24 > v2 ) /*0xb13f*/
    return -1; /*0xb13f*/
  v7 = *(_QWORD *)(v6 + 26); /*0xb141*/
  if ( v7 < v5 || v7 + 32 > v2 ) /*0xb151*/
    return -1; /*0xb17a*/
  *(_DWORD *)(v7 + 16) = 0x8000000; /*0xb158*/
  *(_DWORD *)(*(_QWORD *)(v6 + 26) + 4LL) = 0x8000000; /*0xb160*/
  *(_BYTE *)(*(_QWORD *)(v6 + 26) + 21LL) = 0; /*0xb167*/
  *(_BYTE *)(v6 + 36) = 0; /*0xb16d*/
  *(_DWORD *)(v6 + 4) = 1; /*0xb171*/
  return 0; /*0xb181*/
}


// Function: SysKbcSendData @ 0xb188 (0xd3 bytes)

char __fastcall SysKbcSendData(__int64 a1)
{
  unsigned __int64 v2; // rbx
  __int64 v3; // r8
  unsigned __int64 v4; // rdx
  unsigned __int64 v5; // rcx
  unsigned __int64 v6; // rdx
  unsigned __int64 v7; // r8

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb1a5*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xb1b4*/
    return -1; /*0xb1b4*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xb1be*/
    return -1; /*0xb1be*/
  if ( (ElibRead32(a1, 2u, v3) & 0x20) != 0 ) /*0xb1d3*/
    return -1; /*0xb1d3*/
  v4 = *(_QWORD *)(a1 + 40); /*0xb1d5*/
  if ( !v4 ) /*0xb1dc*/
    return -1; /*0xb1dc*/
  v5 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb1e5*/
  if ( v4 < v5 ) /*0xb1ef*/
    return -1; /*0xb1ef*/
  if ( v4 + 24 > v2 ) /*0xb1f8*/
    return -1; /*0xb1f8*/
  v6 = *(_QWORD *)(v4 + 16); /*0xb1fa*/
  if ( v6 < v5 ) /*0xb201*/
    return -1; /*0xb201*/
  if ( v6 + 24 > v2 ) /*0xb20a*/
    return -1; /*0xb20a*/
  v7 = *(_QWORD *)(v6 + 26); /*0xb20c*/
  if ( v7 < v5 || v7 + 32 > v2 ) /*0xb21c*/
    return -1; /*0xb24e*/
  *(_DWORD *)(v7 + 16) = 159383552; /*0xb21e*/
  *(_DWORD *)(*(_QWORD *)(v6 + 26) + 4LL) = *(_DWORD *)(*(_QWORD *)(v6 + 26) + 16LL); /*0xb22d*/
  *(_BYTE *)(*(_QWORD *)(v6 + 26) + 21LL) = 1; /*0xb234*/
  *(_DWORD *)(v6 + 4) = *(_DWORD *)(v6 + 26); /*0xb23b*/
  *(_QWORD *)(v6 + 8) = *(_QWORD *)(v6 + 26); /*0xb242*/
  *(_BYTE *)(v6 + 36) = 1; /*0xb248*/
  return 0; /*0xb255*/
}


// Function: UsbConfig_8 @ 0xb25c (0xdf bytes)

char __fastcall UsbConfig_8(__int64 UsbHcPtr, __int64 a2)
{
  int n3; // eax
  char v4; // r9
  unsigned __int16 v5; // r11
  int *v6; // r8
  int *v7; // r10
  int v8; // eax
  __int16 v9; // ax
  int *v10; // [rsp+38h] [rbp+10h]

  if ( !a2 ) /*0xb26e*/
    return -1; /*0xb26e*/
  n3 = *(_DWORD *)(a2 + 22); /*0xb270*/
  if ( n3 < 0 ) /*0xb275*/
    return -1; /*0xb275*/
  if ( n3 <= 1 ) /*0xb27a*/
  {
    v4 = 0; /*0xb2b6*/
  }
  else
  {
    if ( n3 != 2 ) /*0xb27f*/
    {
      if ( n3 == 3 ) /*0xb284*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2254, (__int64)"((BOOLEAN)(0==1))"); /*0xb299*/
      return -1; /*0xb299*/
    }
    v4 = 1; /*0xb2ab*/
    if ( !*(_BYTE *)(a2 + 34) ) /*0xb2ae*/
      return -1; /*0xb2aa*/
  }
  v5 = 0; /*0xb2b9*/
  if ( *(_WORD *)(UsbHcPtr + 48) ) /*0xb2bd*/
  {
    v6 = v10; /*0xb2c3*/
    do /*0xb332*/
    {
      v7 = (int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * v5); /*0xb2d0*/
      v8 = *v7; /*0xb2d4*/
      if ( (*v7 & 1) == 0 ) /*0xb2d9*/
      {
        do /*0xb305*/
        {
          v6 = (int *)(v8 & 0xFFFFFFF0); /*0xb2e6*/
          if ( *(_DWORD *)((char *)&word_16 + (_QWORD)v6) <= *(_DWORD *)(a2 + 22) /*0xb2fb*/
            && (!v4 || *((_BYTE *)&word_1C[3] + (v8 & 0xFFFFFFF0)) <= *(_BYTE *)(a2 + 34)) )
          {
            break; /*0xb2fb*/
          }
          v8 = *v6; /*0xb2fd*/
          v7 = v6; /*0xb300*/
        }
        while ( (*v6 & 1) == 0 ); /*0xb305*/
      }
      if ( v6 != (int *)a2 ) /*0xb30a*/
      {
        *(_DWORD *)a2 = *v7; /*0xb30f*/
        *v7 = a2 | 2; /*0xb316*/
      }
      if ( v4 ) /*0xb31c*/
        v9 = *(unsigned __int8 *)(a2 + 34); /*0xb31e*/
      else
        v9 = 1; /*0xb324*/
      v5 += v9; /*0xb329*/
    }
    while ( v5 < *(_WORD *)(UsbHcPtr + 48) ); /*0xb332*/
  }
  return 0; /*0xb2a5*/
}


// Function: UsbConfig_12 @ 0xb33c (0xca bytes)

char __fastcall UsbConfig_12(__int64 a1, __int64 a2)
{
  int n3; // eax
  char v5; // r9
  unsigned __int16 i; // r8
  int *v7; // r10
  int v8; // ecx
  int *v9; // rax
  __int16 v10; // ax

  if ( !a2 ) /*0xb34e*/
    return -1; /*0xb34e*/
  n3 = *(_DWORD *)(a2 + 22); /*0xb350*/
  if ( n3 < 0 ) /*0xb355*/
    return -1; /*0xb355*/
  if ( n3 <= 1 ) /*0xb35a*/
  {
    v5 = 0; /*0xb396*/
  }
  else
  {
    if ( n3 != 2 ) /*0xb35f*/
    {
      if ( n3 == 3 ) /*0xb364*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2339, (__int64)"((BOOLEAN)(0==1))"); /*0xb379*/
      return -1; /*0xb379*/
    }
    v5 = 1; /*0xb38b*/
    if ( !*(_BYTE *)(a2 + 34) ) /*0xb38e*/
      return -1; /*0xb37e*/
  }
  *(_DWORD *)(a2 + 4) = 1; /*0xb399*/
  for ( i = 0; i < *(_WORD *)(a1 + 48); i += v10 ) /*0xb3a4*/
  {
    v7 = (int *)(*(_QWORD *)(a1 + 8) + 4LL * i); /*0xb3b2*/
    v8 = *v7; /*0xb3b6*/
    while ( (v8 & 1) == 0 ) /*0xb3cf*/
    {
      v9 = (int *)(v8 & 0xFFFFFFF0); /*0xb3c2*/
      if ( v9 == (int *)a2 ) /*0xb3c8*/
        break; /*0xb3c8*/
      v8 = *v9; /*0xb3ca*/
      v7 = v9; /*0xb3cc*/
    }
    if ( (v8 & 1) == 0 ) /*0xb3d7*/
      *v7 = *(_DWORD *)a2; /*0xb3db*/
    if ( v5 ) /*0xb3e1*/
      v10 = *(unsigned __int8 *)(a2 + 34); /*0xb3e3*/
    else
      v10 = 1; /*0xb3e9*/
  }
  *(_DWORD *)a2 = 1; /*0xb3f9*/
  return 0; /*0xb385*/
}


// Function: UhciCreateRootHubQh @ 0xb408 (0x261 bytes)

char __fastcall UhciCreateRootHubQh(__int64 UsbHcPtr)
{
  __int64 v2; // rax
  __int64 *v3; // rbx
  __int64 v5; // rax
  __int64 v6; // rax
  __int64 v7; // rcx
  __int64 v8; // rax
  __int64 v9; // rax
  __int64 v10; // rdi
  __int64 v11; // rdi
  __int64 v12; // rax
  __int64 UsbRtDispatchTable; // rcx

  v2 = UsbConfig_1(1u); /*0xb42d*/
  v3 = (__int64 *)v2; /*0xb434*/
  if ( !v2 ) /*0xb43a*/
    return -1; /*0xb43a*/
  *(_QWORD *)(UsbHcPtr + 40) = v2; /*0xb448*/
  v5 = UsbConfig_1(2u); /*0xb44c*/
  *v3 = v5; /*0xb451*/
  if ( !v5 ) /*0xb457*/
    return -1; /*0xb457*/
  *(_DWORD *)v5 = 1; /*0xb459*/
  *(_DWORD *)(v5 + 4) = 1; /*0xb45f*/
  *(_QWORD *)(v5 + 8) = 0; /*0xb463*/
  *(_BYTE *)(v5 + 16) = 0; /*0xb467*/
  *(_DWORD *)(v5 + 17) = 0; /*0xb46b*/
  *(_BYTE *)(v5 + 21) = 0; /*0xb46e*/
  *(_QWORD *)(v5 + 26) = 0; /*0xb472*/
  *(_WORD *)(v5 + 34) = 0; /*0xb476*/
  *(_BYTE *)(v5 + 36) = 0; /*0xb47a*/
  *(_QWORD *)(v5 + 37) = 0; /*0xb47e*/
  *(_DWORD *)(*v3 + 22) = 2; /*0xb485*/
  *(_BYTE *)(*v3 + 34) = 1; /*0xb48f*/
  UsbConfig_8(UsbHcPtr, *v3); /*0xb496*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0xb49f*/
  {
    v6 = UsbConfig_1(3u); /*0xb4ac*/
    v3[2] = v6; /*0xb4b1*/
    if ( v6 ) /*0xb4b8*/
    {
      v7 = v6 + 64; /*0xb4ba*/
      *(_DWORD *)(v6 + 64) = 1; /*0xb4c3*/
      *(_DWORD *)(v6 + 76) = v6 + 88; /*0xb4c9*/
      *(_DWORD *)(v6 + 68) = 0x8000000; /*0xb4cc*/
      *(_DWORD *)(v6 + 72) = 14694505; /*0xb4cf*/
      *(_DWORD *)(v6 + 80) = 0x8000000; /*0xb4d6*/
      *(_BYTE *)(v6 + 85) = 0; /*0xb4d9*/
      v8 = v3[2]; /*0xb4dd*/
      *(_DWORD *)v8 = 1; /*0xb4e1*/
      *(_DWORD *)(v8 + 4) = 1; /*0xb4e4*/
      *(_QWORD *)(v8 + 8) = 0; /*0xb4e8*/
      *(_BYTE *)(v8 + 16) = 0; /*0xb4ec*/
      *(_DWORD *)(v8 + 17) = 0; /*0xb4f0*/
      *(_BYTE *)(v8 + 21) = 0; /*0xb4f3*/
      *(_QWORD *)(v8 + 26) = 0; /*0xb4f7*/
      *(_WORD *)(v8 + 34) = 0; /*0xb4fb*/
      *(_BYTE *)(v8 + 36) = 0; /*0xb4ff*/
      *(_QWORD *)(v8 + 37) = 0; /*0xb503*/
      *(_DWORD *)(v3[2] + 22) = 2; /*0xb50b*/
      *(_QWORD *)(v3[2] + 26) = v7; /*0xb516*/
      *(_BYTE *)(v3[2] + 34) = 8; /*0xb525*/
      *(_BYTE *)(v3[2] + 35) = UsbRegisterNotifyFunc((__int64)UhciNullSub1); /*0xb535*/
      *(_BYTE *)(v3[2] + 36) = 0; /*0xb53c*/
      UsbConfig_8(UsbHcPtr, v3[2]); /*0xb544*/
      UsbServiceHcPolling(UsbHcPtr, 0); /*0xb54e*/
      v9 = UsbConfig_1(3u); /*0xb555*/
      v3[1] = v9; /*0xb55a*/
      if ( !v9 ) /*0xb561*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 2487, (__int64)"DescPtr->RootHubQh != ((void *) 0)"); /*0xb576*/
      v10 = v3[1]; /*0xb57b*/
      if ( v10 ) /*0xb582*/
      {
        *(_DWORD *)(v10 + 72) = 14694505; /*0xb588*/
        *(_DWORD *)(v10 + 80) = 0; /*0xb596*/
        v11 = v10 + 64; /*0xb599*/
        *(_QWORD *)v11 = 1; /*0xb59d*/
        *(_DWORD *)(v11 + 12) = v11 + 24; /*0xb5a3*/
        *(_BYTE *)(v11 + 21) = 0; /*0xb5a6*/
        v12 = v3[1]; /*0xb5aa*/
        *(_DWORD *)v12 = 1; /*0xb5ae*/
        *(_DWORD *)(v12 + 4) = 1; /*0xb5b1*/
        *(_QWORD *)(v12 + 8) = 0; /*0xb5b5*/
        *(_BYTE *)(v12 + 16) = 0; /*0xb5b9*/
        *(_DWORD *)(v12 + 17) = 0; /*0xb5bd*/
        *(_BYTE *)(v12 + 21) = 0; /*0xb5c0*/
        *(_QWORD *)(v12 + 26) = 0; /*0xb5c4*/
        *(_WORD *)(v12 + 34) = 0; /*0xb5c8*/
        *(_BYTE *)(v12 + 36) = 0; /*0xb5cc*/
        *(_QWORD *)(v12 + 37) = 0; /*0xb5d0*/
        *(_DWORD *)(v3[1] + 22) = 2; /*0xb5d8*/
        *(_QWORD *)(v3[1] + 26) = v11; /*0xb5e3*/
        *(_BYTE *)(v3[1] + 34) = 0x80; /*0xb5eb*/
        *(_BYTE *)(v3[1] + 35) = UsbRegisterNotifyFunc((__int64)UhciCreateFrameList); /*0xb5f8*/
        *(_BYTE *)(v3[1] + 36) = 0; /*0xb602*/
        UsbConfig_8(UsbHcPtr, v3[1]); /*0xb60a*/
        UsbRtDispatchTable = UsbRtDispatchTable; /*0xb60f*/
        if ( !*(_QWORD *)(UsbRtDispatchTable + 30488) ) /*0xb616*/
        {
          *(_BYTE *)(v11 + 21) = 1; /*0xb61f*/
          *(_DWORD *)(v11 + 16) = 159383552; /*0xb628*/
          *(_DWORD *)(v11 + 4) = 159383552; /*0xb62b*/
          *(_DWORD *)(v3[1] + 4) = v11; /*0xb632*/
          *(_QWORD *)(v3[1] + 8) = v11; /*0xb639*/
          *(_BYTE *)(v3[1] + 36) = 1; /*0xb641*/
          *(_QWORD *)(UsbRtDispatchTable + 30488) = UsbHcPtr; /*0xb645*/
        }
        return 0; /*0xb645*/
      }
    }
    return -1; /*0xb43e*/
  }
  return 0; /*0xb662*/
}


// Function: UsbConfig_0 @ 0xb66c (0x228 bytes)

char __fastcall UsbConfig_0(__int64 UsbHcPtr)
{
  unsigned __int64 *v2; // rbx
  unsigned __int64 v3; // r8
  unsigned __int64 v4; // rdi
  unsigned __int64 v5; // rcx
  unsigned __int64 v6; // rax
  unsigned __int64 v7; // rax
  unsigned __int64 v8; // rcx
  unsigned __int64 v9; // rcx
  __int64 UsbRtDispatchTable; // rdx
  unsigned __int8 v11; // r10
  __int64 v12; // rcx
  __int64 UsbHcPtr_1; // rax
  unsigned __int64 v14; // r8
  unsigned __int64 v15; // r9
  unsigned __int64 v16; // rcx
  unsigned __int64 v17; // r11
  unsigned __int64 v18; // rax

  v2 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xb685*/
  v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb68f*/
  v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xb699*/
  if ( !v2 ) /*0xb69f*/
    return -1; /*0xb69f*/
  if ( (unsigned __int64)v2 < v3 ) /*0xb6a8*/
    return -1; /*0xb6a8*/
  if ( (unsigned __int64)(v2 + 3) > v4 ) /*0xb6b5*/
    return -1; /*0xb6b5*/
  v5 = *v2; /*0xb6bb*/
  if ( *v2 < v3 ) /*0xb6c1*/
    return -1; /*0xb6c1*/
  if ( v5 + 64 > v4 ) /*0xb6ce*/
    return -1; /*0xb6ce*/
  v6 = v2[1]; /*0xb6d4*/
  if ( v6 < v3 ) /*0xb6db*/
    return -1; /*0xb6db*/
  if ( v6 + 64 > v4 ) /*0xb6e8*/
    return -1; /*0xb6e8*/
  v7 = v2[2]; /*0xb6ee*/
  if ( v7 < v3 || v7 + 64 > v4 ) /*0xb702*/
    return -1; /*0xb882*/
  FwVolConfig(v5, 2u); /*0xb70d*/
  v8 = v2[1]; /*0xb712*/
  if ( v8 ) /*0xb719*/
    FwVolConfig(v8, 3u); /*0xb720*/
  v9 = v2[2]; /*0xb725*/
  if ( v9 ) /*0xb72c*/
    FwVolConfig(v9, 3u); /*0xb733*/
  FwVolConfig((unsigned __int64)v2, 1u); /*0xb740*/
  UsbServiceHcPolling(UsbHcPtr, 3u); /*0xb74a*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xb74f*/
  if ( *(_QWORD *)(UsbRtDispatchTable + 30488) == UsbHcPtr ) /*0xb75d*/
  {
    *(_QWORD *)(UsbRtDispatchTable + 30488) = 0; /*0xb763*/
    v11 = 0; /*0xb76b*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0xb76e*/
    {
      v12 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0xb77b*/
      do /*0xb786*/
      {
        UsbHcPtr_1 = *(_QWORD *)(v12 + 8LL * v11); /*0xb786*/
        if ( UsbHcPtr_1 /*0xb7b3*/
          && *(_BYTE *)UsbHcPtr_1
          && *(_BYTE *)(UsbHcPtr_1 + 1) == 16
          && (*(_BYTE *)(UsbHcPtr_1 + 64) & 1) != 0
          && UsbHcPtr != UsbHcPtr_1 )
        {
          v14 = *(_QWORD *)(UsbHcPtr_1 + 40); /*0xb7b9*/
          v15 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xb7bd*/
          if ( v14 < v15 ) /*0xb7c7*/
            return -1; /*0xb7c7*/
          if ( v14 + 24 > v4 ) /*0xb7d4*/
            return -1; /*0xb7d4*/
          v16 = *(_QWORD *)(v14 + 8); /*0xb7da*/
          if ( v16 < v15 ) /*0xb7e1*/
            return -1; /*0xb7e1*/
          if ( v16 + 64 > v4 ) /*0xb7ee*/
            return -1; /*0xb7ee*/
          v17 = *(_QWORD *)(v16 + 26); /*0xb7f4*/
          if ( v17 < v15 ) /*0xb7fb*/
            return -1; /*0xb7fb*/
          if ( v17 + 32 > v4 ) /*0xb808*/
            return -1; /*0xb808*/
          v18 = *(_QWORD *)(v16 + 8); /*0xb80a*/
          if ( v18 < v15 || v18 + 32 > v4 ) /*0xb81a*/
            return -1; /*0xb81a*/
          *(_DWORD *)(v17 + 16) = 159383552; /*0xb81c*/
          *(_BYTE *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL) + 21LL) = 1; /*0xb82c*/
          *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL) + 4LL) = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(v14 + 8) /*0xb83b*/
                                                                                              + 26LL)
                                                                                  + 16LL);
          *(_DWORD *)(*(_QWORD *)(v14 + 8) + 4LL) = *(_DWORD *)(*(_QWORD *)(v14 + 8) + 26LL); /*0xb845*/
          *(_QWORD *)(*(_QWORD *)(v14 + 8) + 8LL) = *(_QWORD *)(*(_QWORD *)(v14 + 8) + 26LL); /*0xb850*/
          *(_BYTE *)(*(_QWORD *)(v14 + 8) + 36LL) = 1; /*0xb858*/
          v12 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0xb85c*/
          *(_QWORD *)(UsbRtDispatchTable + 30488) = *(_QWORD *)(v12 + 8LL * v11); /*0xb867*/
        }
        ++v11; /*0xb86e*/
      }
      while ( v11 < *(_BYTE *)(UsbRtDispatchTable + 27704) ); /*0xb786*/
    }
  }
  return 0; /*0xb88e*/
}


// Function: UhciWalkQueueHead @ 0xb894 (0x14e bytes)

char __fastcall UhciWalkQueueHead(__int64 a1, __int64 a2)
{
  __int64 v2; // r10
  __int64 v5; // rax
  _DWORD *v6; // rcx
  unsigned int v7; // edx
  bool v8; // al
  int v9; // ecx
  unsigned __int8 n0x32; // al
  char (__fastcall *UhciNullSub1_1)(_BYTE *, __int64, __int64); // r11

  v2 = a2; /*0xb8a0*/
  if ( !a2 ) /*0xb8a9*/
    return -1; /*0xb8a9*/
  if ( *(_BYTE *)(a2 + 36) ) /*0xb8b2*/
  {
    v5 = *(_QWORD *)(a2 + 26); /*0xb8bc*/
    if ( v5 ) /*0xb8c3*/
    {
      if ( !*(_QWORD *)(a2 + 8) ) /*0xb8c9*/
        *(_QWORD *)(a2 + 8) = v5; /*0xb8cf*/
      v6 = *(_DWORD **)(a2 + 8); /*0xb8d3*/
      while ( v6 ) /*0xb8da*/
      {
        *(_QWORD *)(v2 + 8) = v6; /*0xb8f2*/
        *(_BYTE *)(v2 + 16) = (v6[2] & 0x80000) != 0; /*0xb8ff*/
        if ( (v6[1] & 0x800000) != 0 ) /*0xb90a*/
          return -1; /*0xb90a*/
        v7 = (*((_WORD *)v6 + 2) + 1) & 0x7FF; /*0xb918*/
        *(_DWORD *)(v2 + 17) += v7; /*0xb91b*/
        if ( (v6[1] & 0xFE0000) != 0 ) /*0xb926*/
          break; /*0xb926*/
        *(_BYTE *)(v2 + 16) ^= 1u; /*0xb928*/
        v8 = v7 < (((v6[2] >> 21) + 1) & 0x7FFu); /*0xb93a*/
        *(_BYTE *)(v2 + 21) = v8; /*0xb93d*/
        if ( v8 ) /*0xb943*/
        {
          if ( *(_DWORD *)(v2 + 22) != 1 ) /*0xb949*/
            break; /*0xb949*/
          while ( (*v6 & 1) == 0 ) /*0xb958*/
            v6 = (_DWORD *)(*v6 & 0xFFFFFFF0); /*0xb950*/
          *(_DWORD *)(v2 + 4) = (_DWORD)v6; /*0xb95a*/
        }
        else
        {
          v9 = *v6; /*0xb960*/
          if ( (v9 & 1) != 0 ) /*0xb965*/
            break; /*0xb965*/
          v6 = (_DWORD *)(v9 & 0xFFFFFFF0); /*0xb967*/
        }
      }
      n0x32 = *(_BYTE *)(v2 + 35); /*0xb96f*/
      *(_BYTE *)(v2 + 36) = 0; /*0xb973*/
      if ( n0x32 ) /*0xb979*/
      {
        if ( n0x32 <= 0x32u ) /*0xb97d*/
        {
          UhciNullSub1_1 = *(char (__fastcall **)(_BYTE *, __int64, __int64))(UsbRtDispatchTable + 8LL * n0x32 + 29456); /*0xb989*/
          if ( UhciNullSub1_1 ) /*0xb994*/
          {
            if ( UhciNullSub1_1 != UhciNullSub1 /*0xb9ba*/
              && (char *)UhciNullSub1_1 != (char *)UhciCreateFrameList
              && (UsbValidateDeviceEntry(*(_QWORD *)(v2 + 37)) & 0x8000000000000000uLL) != 0LL )
            {
              return -1; /*0xb8ad*/
            }
            ((void (__fastcall *)(__int64, _QWORD, __int64, _QWORD, _WORD))UhciNullSub1_1)( /*0xb9d2*/
              a1,
              *(_QWORD *)(v2 + 37),
              v2,
              0,
              0);
          }
        }
      }
    }
  }
  return 0; /*0xb9dc*/
}


// Function: UhciWalkTransferList @ 0xb9e4 (0xd6 bytes)

char __fastcall UhciWalkTransferList(_BYTE *a1)
{
  int v2; // edx
  __int64 v3; // rbx
  unsigned __int8 n0x31; // al
  void (__fastcall *v5)(_BYTE *, __int64, __int64, _QWORD, int); // rsi
  __int64 v6; // rax
  int v8; // [rsp+20h] [rbp-18h]

  v2 = **((_DWORD **)a1 + 1); /*0xba04*/
  if ( (v2 & 1) == 0 ) /*0xba09*/
  {
    do /*0xba97*/
    {
      if ( (v2 & 2) != 0 ) /*0xba1c*/
      {
        v3 = v2 & 0xFFFFFFF0; /*0xba1e*/
        UhciWalkQueueHead((__int64)a1, v3); /*0xba27*/
      }
      else
      {
        v3 = v2 & 0xFFFFFFF0; /*0xba2e*/
        if ( (v2 & 0xFFFFFFF0) != 0 ) /*0xba31*/
        {
          if ( *((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0) + 1) ) /*0xba33*/
          {
            if ( (*(_DWORD *)((_BYTE *)word_4 + (v2 & 0xFFFFFFF0)) & 0x800000) == 0 ) /*0xba40*/
            {
              n0x31 = *((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0)) - 1; /*0xba45*/
              *((_BYTE *)&word_14 + (v2 & 0xFFFFFFF0) + 1) = 0; /*0xba47*/
              if ( n0x31 <= 0x31u ) /*0xba4d*/
              {
                v5 = *(void (__fastcall **)(_BYTE *, __int64, __int64, _QWORD, int))(UsbRtDispatchTable /*0xba5a*/
                                                                                   + 8LL
                                                                                   * *((unsigned __int8 *)&word_14
                                                                                     + (v2 & 0xFFFFFFF0))
                                                                                   + 29456);
                if ( v5 ) /*0xba65*/
                {
                  v6 = FwVolDriverEntry(16, 0, BYTE1(*(_DWORD *)((char *)&word_8 + (v2 & 0xFFFFFFF0))) & 0x7F, a1); /*0xba7a*/
                  LOWORD(v8) = 0; /*0xba82*/
                  v5(a1, v6, v3, 0, v8); /*0xba90*/
                }
              }
            }
          }
        }
      }
      v2 = *(_DWORD *)v3; /*0xba92*/
    }
    while ( (*(_DWORD *)v3 & 1) == 0 ); /*0xba97*/
  }
  return 0; /*0xbab3*/
}


// Function: UhciCreateFrameList @ 0xbabc (0x1ec bytes)

char __fastcall UhciCreateFrameList(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 v5; // rbx
  __int64 UsbRtDispatchTable; // rdx
  unsigned __int8 i; // bp
  __int64 UsbHcPtr; // r14
  __int64 v9; // r8
  char v10; // al
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8
  __int64 v13; // r8
  unsigned __int16 v14; // ax
  char v15; // al
  __int64 PortNum_1; // rdx
  __int64 EndpointAddr_1; // r8
  __int64 v18; // r8
  unsigned __int16 v19; // ax
  __int64 v21; // [rsp+50h] [rbp+18h]

  if ( a3 ) /*0xbad7*/
  {
    v5 = a3; /*0xbadd*/
    *(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 0; /*0xbae0*/
  }
  else
  {
    v5 = v21; /*0xbae6*/
  }
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xbaeb*/
  for ( i = 0; i < *(_BYTE *)(UsbRtDispatchTable + 27704); ++i ) /*0xbaf5*/
  {
    UsbHcPtr = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * i); /*0xbb0d*/
    if ( UsbHcPtr && *(_BYTE *)(UsbHcPtr + 1) == 16 && (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xbb2a*/
    {
      if ( (AssertCpuDeadLoop_0(a1, UsbRtDispatchTable, a3) & 0xFFFFF000) != *(_DWORD *)(UsbHcPtr + 8) /*0xbb53*/
        || ElibRead32(a1, 0, a3) == -1 )
      {
        UsbRtDispatchTable = UsbRtDispatchTable; /*0xbc53*/
      }
      else
      {
        UsbRtDispatchTable = UsbRtDispatchTable; /*0xbb59*/
        if ( !*(_BYTE *)(UsbRtDispatchTable + 29872) ) /*0xbb60*/
        {
          *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xbb70*/
          ElibWrite16Direct(a1, 4u, 0); /*0xbb7e*/
          v10 = AssertCpuDeadLoop_1(a1, 0x10u, v9); /*0xbb8b*/
          if ( (v10 & 2) != 0 ) /*0xbb92*/
          {
            if ( (v10 & 1) != 0 ) /*0xbb96*/
              (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xbba4*/
            LOBYTE(EndpointAddr) = 1; /*0xbbad*/
            LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0xbbb0*/
            DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0xbbb6*/
            v14 = AssertCpuDeadLoop_1(a1, 0x10u, v13); /*0xbbc3*/
            ElibWrite16Direct(a1, 0x10u, v14); /*0xbbd4*/
          }
          v15 = AssertCpuDeadLoop_1(a1, 0x12u, EndpointAddr); /*0xbbe1*/
          if ( (v15 & 2) != 0 ) /*0xbbe8*/
          {
            if ( (v15 & 1) != 0 ) /*0xbbec*/
              (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xbbfa*/
            LOBYTE(EndpointAddr_1) = 2; /*0xbc03*/
            LOBYTE(PortNum_1) = *(_BYTE *)UsbHcPtr | 0x80; /*0xbc06*/
            DebugLogPrint_3(UsbHcPtr, PortNum_1, EndpointAddr_1); /*0xbc0c*/
            v19 = AssertCpuDeadLoop_1(a1, 0x12u, v18); /*0xbc1d*/
            ElibWrite16Direct(a1, 0x12u, v19); /*0xbc2c*/
          }
          ElibWrite16Direct(a1, 4u, 4); /*0xbc3e*/
          UsbRtDispatchTable = UsbRtDispatchTable; /*0xbc43*/
          *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xbc4a*/
        }
      }
    }
  }
  if ( a3 ) /*0xbc6d*/
  {
    *(_DWORD *)(*(_QWORD *)(v5 + 26) + 4LL) = *(_DWORD *)(*(_QWORD *)(v5 + 26) + 16LL); /*0xbc76*/
    *(_BYTE *)(*(_QWORD *)(v5 + 26) + 21LL) = 1; /*0xbc7d*/
    *(_DWORD *)(v5 + 4) = *(_DWORD *)(v5 + 26); /*0xbc84*/
    *(_QWORD *)(v5 + 8) = *(_QWORD *)(v5 + 26); /*0xbc8b*/
    *(_BYTE *)(v5 + 36) = 1; /*0xbc8f*/
  }
  return 0; /*0xbc9f*/
}


// Function: UhciNullSub1 @ 0xbca8 (0x48 bytes)

char __fastcall UhciNullSub1(_BYTE *a1, __int64 a2, __int64 a3)
{
  __int64 v4; // rax
  int v5; // ecx

  *(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 0; /*0xbcb5*/
  UsbGetInfo_15(a1); /*0xbcb9*/
  v4 = *(_QWORD *)(a3 + 26); /*0xbcbe*/
  v5 = *(_DWORD *)(v4 + 16); /*0xbcc2*/
  if ( (v5 & 0x800000) != 0 ) /*0xbcc9*/
  {
    *(_DWORD *)(v4 + 4) = v5; /*0xbccb*/
    *(_BYTE *)(*(_QWORD *)(a3 + 26) + 21LL) = 1; /*0xbcd2*/
    *(_DWORD *)(a3 + 4) = *(_DWORD *)(a3 + 26); /*0xbcd9*/
    *(_QWORD *)(a3 + 8) = *(_QWORD *)(a3 + 26); /*0xbce0*/
    *(_BYTE *)(a3 + 36) = 1; /*0xbce4*/
  }
  return 0; /*0xbcea*/
}


// Function: UhciNullSub2 @ 0xbcf0 (0xd1 bytes)

char __fastcall UhciNullSub2(__int64 a1, __int64 a2, __int64 a3)
{
  void (__fastcall *v6)(__int64, __int64, __int64, _QWORD, _WORD); // r10
  __int64 v7; // rcx
  char i; // dl
  int v9; // ecx
  int v10; // eax

  FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(_BYTE *)(a3 + 16)); /*0xbd12*/
  if ( (*(_DWORD *)(*(_QWORD *)(a3 + 8) + 4LL) & 0xFE0000) == 0 && (unsigned __int8)(*(_BYTE *)(a2 + 21) - 1) <= 0x31u ) /*0xbd2b*/
  {
    v6 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, _WORD))(UsbRtDispatchTable /*0xbd38*/
                                                                         + 8LL * *(unsigned __int8 *)(a2 + 21)
                                                                         + 29456);
    if ( v6 ) /*0xbd43*/
      v6(a1, a2, a3, *(_QWORD *)(a2 + 232), *(_WORD *)(a3 + 17)); /*0xbd5e*/
  }
  v7 = *(_QWORD *)(a3 + 26); /*0xbd61*/
  for ( i = *(_BYTE *)(a3 + 16); v7; v7 = v9 & 0xFFFFFFF0 ) /*0xbd6b*/
  {
    *(_DWORD *)(v7 + 8) &= ~0x80000u; /*0xbd6d*/
    if ( i ) /*0xbd74*/
      *(_DWORD *)(v7 + 8) |= 0x80000u; /*0xbd76*/
    i ^= 1u; /*0xbd7e*/
    *(_DWORD *)(v7 + 4) = *(_DWORD *)(v7 + 16); /*0xbd81*/
    *(_BYTE *)(v7 + 21) = 1; /*0xbd84*/
    v9 = *(_DWORD *)v7; /*0xbd88*/
    if ( (v9 & 1) != 0 ) /*0xbd8d*/
      break; /*0xbd8d*/
  }
  v10 = *(_DWORD *)(a3 + 26); /*0xbd99*/
  *(_DWORD *)(a3 + 17) = 0; /*0xbd9c*/
  *(_DWORD *)(a3 + 4) = v10; /*0xbda5*/
  *(_QWORD *)(a3 + 8) = *(_QWORD *)(a3 + 26); /*0xbdac*/
  *(_BYTE *)(a3 + 36) = 1; /*0xbdb2*/
  return 0; /*0xbdbb*/
}


// Function: UsbGetInfo_9 @ 0xbdc4 (0x50 bytes)

char __fastcall sub_BDC4(unsigned __int8 a1)
{
  unsigned __int8 v1; // di
  char i; // al

  v1 = a1; /*0xbdd3*/
  if ( !a1 ) /*0xbdd8*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Uhci.c", 3156, (__int64)"Interval >= 1 && Interval <= 255"); /*0xbded*/
  for ( i = 0; v1; v1 >>= 1 ) /*0xbdf7*/
    ++i; /*0xbdf9*/
  return 1 << (i - 1); /*0xbe0e*/
}


// Function: UhciBuildTransferDescriptors @ 0xbe14 (0x155 bytes)

__int64 __fastcall UhciBuildTransferDescriptors(
        unsigned __int8 a1,
        char a2,
        unsigned __int8 a3,
        unsigned __int8 a4,
        unsigned __int16 a5,
        _QWORD *a6,
        _DWORD *a7,
        _BYTE *a8,
        __int64 a9,
        unsigned int a10,
        char a11)
{
  unsigned int v11; // ebx
  unsigned int v14; // eax
  __int64 result; // rax
  __int64 v18; // r11
  __int64 v20; // rdx
  int v22; // r8d
  unsigned __int16 v23; // di
  int v24; // eax
  int n478150656; // eax
  int v26; // ecx
  int v27; // ecx

  v11 = a10; /*0xbe31*/
  v14 = a10 / a5; /*0xbe48*/
  if ( a10 % a5 ) /*0xbe48*/
    LOWORD(v14) = v14 + 1; /*0xbe5b*/
  result = UsbConfig_1((32 * (unsigned __int64)(unsigned __int16)v14 + 31) >> 5); /*0xbe6e*/
  v18 = result; /*0xbe73*/
  if ( result ) /*0xbe79*/
  {
    v20 = result; /*0xbe87*/
    v22 = (a1 | (a4 << 7)) << 8; /*0xbea5*/
    while ( 1 ) /*0xbeac*/
    {
      *(_DWORD *)v20 = 1; /*0xbeac*/
      v23 = v11; /*0xbeaf*/
      if ( v11 > a5 ) /*0xbeb2*/
        v23 = a5; /*0xbeb2*/
      v24 = v22 | a3 | ((v23 << 21) - 0x200000); /*0xbec7*/
      *(_DWORD *)(v20 + 8) = v24; /*0xbeca*/
      if ( a11 ) /*0xbed0*/
        *(_DWORD *)(v20 + 8) = v24 | 0x80000; /*0xbed6*/
      *(_DWORD *)(v20 + 16) = 411041792; /*0xbed9*/
      n478150656 = *(_DWORD *)(v20 + 16); /*0xbee3*/
      if ( a2 ) /*0xbeeb*/
        n478150656 = 478150656; /*0xbeeb*/
      *(_DWORD *)(v20 + 12) = a9; /*0xbeee*/
      *(_DWORD *)(v20 + 16) = n478150656; /*0xbef2*/
      a11 ^= 1u; /*0xbef5*/
      *(_DWORD *)(v20 + 16) |= 0x20000000u; /*0xbef8*/
      v26 = *(_DWORD *)(v20 + 16); /*0xbefd*/
      a9 += v23; /*0xbf03*/
      *(_DWORD *)(v20 + 4) = v26; /*0xbf06*/
      *(_BYTE *)(v20 + 21) = 1; /*0xbf09*/
      v11 -= v23; /*0xbf0d*/
      if ( !v11 ) /*0xbf0f*/
        break; /*0xbf0f*/
      *(_DWORD *)v20 = (v20 + 32) | 4; /*0xbf1c*/
      v20 = ((_DWORD)v20 + 32) & 0xFFFFFFF0; /*0xbf20*/
    }
    v27 = v26 | 0x1000000; /*0xbf2a*/
    *(_DWORD *)(v20 + 16) = v27; /*0xbf2e*/
    *(_DWORD *)(v20 + 4) = v27; /*0xbf31*/
    *a7 = 0; /*0xbf34*/
    *a6 = a9; /*0xbf3c*/
    *a8 = a11; /*0xbf44*/
    return v18; /*0xbf47*/
  }
  return result; /*0xbf5e*/
}


// Function: DebugLogPrint_5 @ 0xbf6c (0x149 bytes)

void __fastcall DebugLogPrint_5(__int64 UsbHcPtr)
{
  unsigned int v1; // esi
  unsigned __int8 v3; // bl
  unsigned int i; // eax
  __int64 n0x1FFF; // r8
  unsigned __int8 n5; // dl
  unsigned __int16 v7; // ax
  unsigned int v8; // esi
  __int64 v9; // rax
  int v10; // eax
  int v11; // [rsp+40h] [rbp+8h] BYREF

  v1 = *(_DWORD *)(UsbHcPtr + 56); /*0xbf7b*/
  *(_BYTE *)(UsbHcPtr + 69) = 0; /*0xbf83*/
  v3 = (v1 >> 20) & 0xF; /*0xbf8a*/
  if ( v3 )
  {
    if ( v3 <= (unsigned __int8)(v1 & 0xF) )
    {
      if ( (HcPciReadConfig(UsbHcPtr, 4u) & 0x100000) != 0 )
      {
        for ( i = HcPciReadConfig(UsbHcPtr, 0x34u); (_BYTE)i; i >>= 8 ) /*0xbfdc*/
        {
          i = HcPciReadConfig(UsbHcPtr, (unsigned __int8)i); /*0xbfe9*/
          if ( (_BYTE)i == 10 ) /*0xbff0*/
            break; /*0xbff0*/
        }
        if ( (_BYTE)i )
        {
          n0x1FFF = 0x1FFF; /*0xc003*/
          n5 = (i >> 29) - 1; /*0xc00f*/
          v7 = HIWORD(i) & 0x1FFF; /*0xc011*/
          if ( n5 <= 5u )
          {
            v11 = 0; /*0xc034*/
            v8 = v7; /*0xc03e*/
            LOBYTE(n0x1FFF) = n5; /*0xc041*/
            v9 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, _QWORD, __int64, int *))(*(_QWORD *)(UsbHcPtr + 104) /*0xc061*/
                                                                                             + 16LL))(
                   *(_QWORD *)(UsbHcPtr + 104),
                   2,
                   n0x1FFF,
                   v7,
                   1,
                   &v11);
            if ( v9 >= 0 )
            {
              v10 = v11; /*0xc084*/
            }
            else
            {
              DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ehci: Read Debug Reg error: %r at %x\n", v9, v8);
              v10 = -1; /*0xc07f*/
            }
            if ( (v10 & 0x10000000) != 0 ) /*0xc08c*/
            {
              *(_BYTE *)(UsbHcPtr + 69) = v3; /*0xc09d*/
              DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Debug Port #%d enabled.\n", v3); /*0xc0a0*/
            }
          }
          else
          {
            Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 240, (__int64)"DebugPortBarIndex <= 5"); /*0xc02d*/
          }
        }
      }
    }
    else
    {
      Assert( /*0xbfaf*/
        (UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c",
        212,
        (__int64)"DebugPortNo <= (UINT8)(HcsParams & (0x00000001+0x00000002+0x00000004+0x00000008))");
    }
  }
}


// Function: EhciDriverEntry @ 0xc0b8 (0x36b bytes)

char __fastcall EhciDriverEntry(__int64 UsbHcPtr, __int64 n2047, __int64 n65528)
{
  unsigned int n0x32; // edi
  char v5; // r15
  unsigned int n787232; // eax
  __int64 v8; // r8
  int v9; // eax
  unsigned __int8 v10; // al
  int v11; // eax
  unsigned int v12; // edx
  unsigned int i; // esi
  unsigned int v14; // eax
  unsigned int v15; // eax
  unsigned __int16 n256; // ax
  unsigned __int16 v17; // cx
  __int64 v18; // rdx
  __int64 v19; // rax
  unsigned int j; // esi
  unsigned int v21; // esi
  unsigned __int16 n68; // bp
  int v23; // eax

  n0x32 = 0; /*0xc0d4*/
  v5 = 0; /*0xc0d9*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc0e4*/
    return -1; /*0xc0e4*/
  n787232 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0xc0fc*/
  if ( n787232 != 787232 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Class Code is wrong: %x\n", n787232);
    return -1; /*0xc0e8*/
  }
  v8 = HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFFF0LL; /*0xc13b*/
  *(_QWORD *)(UsbHcPtr + 16) = v8; /*0xc141*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Mem Addr: %X\n", v8);
  v9 = DebugLogPrint_13(UsbHcPtr, 4u); /*0xc154*/
  *(_DWORD *)(UsbHcPtr + 56) = v9; /*0xc159*/
  LOBYTE(v9) = v9 & 0xF; /*0xc163*/
  *(_BYTE *)(UsbHcPtr + 32) = v9; /*0xc16c*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Number of ports: %d\n", (unsigned __int8)v9);
  DebugLogPrint_5(UsbHcPtr); /*0xc178*/
  v10 = DebugLogPrint_13(UsbHcPtr, 0); /*0xc182*/
  *(_BYTE *)(UsbHcPtr + 50) = v10; /*0xc195*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI HC Operational Registers Offset: %d\n", v10);
  v11 = DebugLogPrint_13(UsbHcPtr, 8u); /*0xc1a2*/
  v12 = *(unsigned __int8 *)(UsbHcPtr + 50) + 4; /*0xc1ae*/
  *(_DWORD *)(UsbHcPtr + 60) = v11; /*0xc1b1*/
  *(_BYTE *)(UsbHcPtr + 68) = 0; /*0xc1b4*/
  if ( (DebugLogPrint_13(UsbHcPtr, v12) & 0x1000) == 0 ) /*0xc1ca*/
  {
    DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xc1d4*/
    for ( i = 0; i < 0x10; ++i ) /*0xc1d9*/
    {
      if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xc1ed*/
        break; /*0xc1ed*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xc1fb*/
    }
  }
  if ( UsbConfig_17(UsbHcPtr) == -1 ) /*0xc213*/
    return -1; /*0xc213*/
  v14 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) >> 2) & 3; /*0xc228*/
  if ( v14 ) /*0xc22b*/
  {
    v15 = v14 - 1; /*0xc22d*/
    if ( v15 ) /*0xc230*/
    {
      if ( v15 != 1 ) /*0xc235*/
        return -1; /*0xc235*/
      n256 = 256; /*0xc23b*/
    }
    else
    {
      n256 = 512; /*0xc242*/
    }
  }
  else
  {
    n256 = 1024; /*0xc249*/
  }
  *(_WORD *)(UsbHcPtr + 48) = n256; /*0xc25c*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI AsyncListSize: %d\n", n256);
  v17 = 0; /*0xc265*/
  v18 = *(_QWORD *)(UsbHcPtr + 8); /*0xc268*/
  for ( *(_DWORD *)(UsbHcPtr + 52) = 0x4000; v17 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v18 + 4 * v19) = 1 ) /*0xc273*/
    v19 = v17++; /*0xc279*/
  DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 20, *(_DWORD *)(UsbHcPtr + 8)); /*0xc298*/
  DebugLogPrint_6(UsbHcPtr); /*0xc2a0*/
  DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 63); /*0xc2b5*/
  if ( *(_BYTE *)(UsbHcPtr + 68) ) /*0xc2ba*/
  {
    UsbGetInfo_4(UsbHcPtr); /*0xc2c6*/
    DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc2db*/
  }
  DebugLogPrint_21(UsbHcPtr, 0, 17); /*0xc2e9*/
  for ( j = 0; j < 0x14; ++j ) /*0xc2ee*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) == 0 ) /*0xc302*/
      break; /*0xc302*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc310*/
  }
  if ( (*(_BYTE *)(UsbHcPtr + 56) & 0x10) != 0 ) /*0xc322*/
  {
    v21 = 1; /*0xc324*/
    n68 = 68; /*0xc327*/
    if ( *(_BYTE *)(UsbHcPtr + 32) ) /*0xc32c*/
    {
      do /*0xc37a*/
      {
        if ( (!*(_BYTE *)(UsbHcPtr + 69) || *(unsigned __int8 *)(UsbHcPtr + 69) != v21) /*0xc35a*/
          && (DebugLogPrint_13(UsbHcPtr, n68 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 0x1000) == 0 )
        {
          DebugLogPrint_21(UsbHcPtr, n68, 4096); /*0xc365*/
          v5 = 1; /*0xc36a*/
        }
        ++v21; /*0xc371*/
        n68 += 4; /*0xc374*/
      }
      while ( v21 <= *(unsigned __int8 *)(UsbHcPtr + 32) ); /*0xc37a*/
      if ( v5 ) /*0xc37f*/
        (*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0xc38d*/
    }
  }
  *(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0xc393*/
  v23 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0xc39e*/
  if ( (v23 & 0x80u) == 0 ) /*0xc3a3*/
    *(_DWORD *)(UsbRtDispatchTable + 4) = v23 | 0x80; /*0xc3a9*/
  DebugLogPrint_21(UsbHcPtr, 64, 1); /*0xc3b7*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x40) != 0 ) /*0xc3c0*/
  {
    do /*0xc3ee*/
    {
      if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 4) != 0 ) /*0xc3d4*/
        break; /*0xc3d4*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc3e2*/
      ++n0x32; /*0xc3e8*/
    }
    while ( n0x32 < 0x32 ); /*0xc3ee*/
  }
  else
  {
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xc3fe*/
  }
  return 0; /*0xc415*/
}


// Function: UsbGetInfo_4 @ 0xc424 (0x77 bytes)

unsigned __int8 __fastcall UsbGetInfo_4(__int64 UsbHcPtr)
{
  unsigned __int8 result; // al

  result = *(_BYTE *)(UsbHcPtr + 68); /*0xc42e*/
  if ( result ) /*0xc439*/
  {
    HcPciReadConfig(UsbHcPtr, result); /*0xc43e*/
    DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68)); /*0xc473*/
    DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc488*/
    return *(_BYTE *)(UsbHcPtr + 68); /*0xc48d*/
  }
  return result; /*0xc495*/
}


// Function: EhciProcessPeriodicList @ 0xc49c (0xf4 bytes)

char __fastcall EhciProcessPeriodicList(_BYTE *UsbHcPtr)
{
  __int64 UsbRtDispatchTable; // rax
  char v4; // si
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8
  unsigned __int8 i; // di
  char i_1; // al
  __int64 UsbRtDispatchTable_1; // rax

  if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xc4d9*/
    || (UsbHcPtr[64] & 1) == 0
    || (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 )
  {
    return -1; /*0xc4b8*/
  }
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xc4db*/
  v4 = *UsbHcPtr | 0x80; /*0xc4e5*/
  if ( !*(_BYTE *)(UsbRtDispatchTable + 29872) ) /*0xc4e9*/
  {
    *(_BYTE *)(UsbRtDispatchTable + 30480) = 1; /*0xc4f2*/
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xc4f9*/
    do /*0xc552*/
    {
      DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 4, 4); /*0xc510*/
      for ( i = 1; i <= UsbHcPtr[32]; ++i ) /*0xc518*/
      {
        i_1 = UsbHcPtr[69]; /*0xc51e*/
        if ( !i_1 || i_1 != i ) /*0xc528*/
        {
          LOBYTE(EndpointAddr) = i; /*0xc52a*/
          LOBYTE(PortNum) = v4; /*0xc52d*/
          DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0xc533*/
        }
      }
    }
    while ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 4) != 0 ); /*0xc552*/
    UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xc554*/
    *(_BYTE *)(UsbRtDispatchTable + 30480) = 0; /*0xc55b*/
    *(_BYTE *)(UsbRtDispatchTable_1 + 29872) = 0; /*0xc562*/
  }
  DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 8, 5); /*0xc579*/
  return 0; /*0xc58a*/
}


// Function: UsbGetInfo_7 @ 0xc590 (0x66 bytes)

char __fastcall UsbGetInfo_7(__int64 UsbHcPtr)
{
  char v2; // bl
  __int16 v3; // ax

  v2 = DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)); /*0xc5b0*/
  v3 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xc5b2*/
  if ( (v2 & 0x10) == 0 || (v3 & 0x4000) != 0 ) /*0xc5c0*/
    return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 20) & 0xFFFFF000LL) != *(_QWORD *)(UsbHcPtr + 8)); /*0xc5e9*/
  else
    return 0; /*0xc5c2*/
}


// Function: EhciStopHc @ 0xc5f8 (0x19e bytes)

char __fastcall EhciStopHc(__int64 UsbHcPtr)
{
  unsigned __int64 *v2; // rsi
  unsigned __int64 v3; // rdx
  __int64 TmpRdx; // rdx
  __int64 TmpR8; // r8
  unsigned __int8 i; // di
  unsigned __int8 j; // di
  unsigned __int16 v8; // cx
  __int64 k; // r8
  __int64 v10; // rax
  unsigned __int64 v11; // rcx

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc61f*/
    return -1; /*0xc61f*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xc62d*/
    return -1; /*0xc62d*/
  v2 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xc63a*/
  v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xc63e*/
  if ( (unsigned __int64)v2 < v3 /*0xc661*/
    || (unsigned __int64)(v2 + 3) > v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12) )
  {
    return -1; /*0xc779*/
  }
  if ( UsbGetInfo_7(UsbHcPtr) ) /*0xc66a*/
  {
    UsbGetInfo_4(UsbHcPtr); /*0xc767*/
  }
  else
  {
    for ( i = 1; i <= *(_BYTE *)(UsbHcPtr + 32); ++i ) /*0xc67a*/
    {
      LOBYTE(TmpR8) = i; /*0xc682*/
      LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0xc685*/
      UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0xc68b*/
    }
    if ( !*(_BYTE *)(UsbHcPtr + 69) ) /*0xc699*/
    {
      DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xc6a7*/
      for ( j = 0; j < 0x10u; ++j ) /*0xc6ac*/
      {
        if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xc6c2*/
          break; /*0xc6c2*/
        (*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xc6d0*/
      }
      if ( UsbConfig_17(UsbHcPtr) ) /*0xc6e2*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 1155, (__int64)"Status == 0x000"); /*0xc6fe*/
    }
    UsbGetInfo_4(UsbHcPtr); /*0xc708*/
    v8 = 0; /*0xc70d*/
    for ( k = *(_QWORD *)(UsbHcPtr + 8); v8 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(k + 4 * v10) = 1 ) /*0xc715*/
      v10 = v8++; /*0xc71c*/
    v11 = v2[1]; /*0xc72c*/
    if ( v11 ) /*0xc733*/
      FwVolConfig(v11, 6u); /*0xc73a*/
    FwVolConfig(*v2, 4u); /*0xc747*/
    FwVolConfig((unsigned __int64)v2, 1u); /*0xc751*/
    UsbServiceHcPolling(UsbHcPtr, 3u); /*0xc75b*/
  }
  *(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0xc76c*/
  UsbFindActiveHc(); /*0xc770*/
  return 0; /*0xc78f*/
}


// Function: EhciResetHc1 @ 0xc798 (0x40 bytes)

char __fastcall EhciResetHc1(__int64 UsbHcPtr)
{
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc7a9*/
    return -1; /*0xc7ab*/
  DebugLogPrint_19(UsbHcPtr, 8, 5); /*0xc7bb*/
  UsbConfig_7(UsbHcPtr); /*0xc7c3*/
  UsbGetInfo_6(UsbHcPtr); /*0xc7cb*/
  return 0; /*0xc7d2*/
}


// Function: EhciResetHc2 @ 0xc7d8 (0x40 bytes)

char __fastcall EhciResetHc2(__int64 UsbHcPtr)
{
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc7e9*/
    return -1; /*0xc7eb*/
  UsbConfig_11(UsbHcPtr); /*0xc7f2*/
  UsbGetInfo_5(UsbHcPtr); /*0xc7fa*/
  DebugLogPrint_21(UsbHcPtr, 8, 5); /*0xc80b*/
  return 0; /*0xc812*/
}


// Function: EhciResetHcFull @ 0xc818 (0x2df bytes)

char __fastcall EhciResetHcFull(__int64 UsbHcPtr)
{
  unsigned __int8 v3; // al
  int v4; // eax
  unsigned __int8 v5; // al
  unsigned __int8 v6; // al
  int Config; // eax
  unsigned __int8 v8; // al
  __int64 n2047; // rdx
  __int16 v10; // di
  __int64 n65528; // r8
  __int64 v12; // rsi
  __int64 n8; // rbp
  int *v14; // r15
  int i; // eax
  __int64 v16; // rdi
  int v17; // r14d
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8
  __int64 UsbRtDispatchTable; // rax
  unsigned __int8 v21; // di
  char v22; // al
  int v23; // eax

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xc83b*/
    return -1; /*0xc83d*/
  v3 = *(_BYTE *)(UsbHcPtr + 68); /*0xc844*/
  if ( v3 && (v4 = HcPciReadConfig(UsbHcPtr, (unsigned int)v3 + 4), ((unsigned __int16)v4 & HIWORD(v4) & 0x2000) != 0) ) /*0xc86d*/
  {
    v5 = *(_BYTE *)(UsbHcPtr + 68); /*0xc86f*/
    if ( v5 ) /*0xc874*/
    {
      HcPciReadConfig(UsbHcPtr, v5 + 4); /*0xc87f*/
      DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc89b*/
    }
    v6 = *(_BYTE *)(UsbHcPtr + 68); /*0xc8a0*/
    if ( v6 ) /*0xc8a5*/
      Config = HcPciReadConfig(UsbHcPtr, v6); /*0xc8b2*/
    else
      Config = -1; /*0xc8a7*/
    *(_DWORD *)(UsbHcPtr + 64) |= 0x20u; /*0xc8b7*/
    if ( (Config & 0x1000000) != 0 ) /*0xc8c9*/
    {
      *(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xc8cb*/
      EhciStopHc(UsbHcPtr); /*0xc8cf*/
    }
    else
    {
      *(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xc8d6*/
      UsbDriverEntry(UsbHcPtr); /*0xc8da*/
    }
    *(_DWORD *)(UsbHcPtr + 64) &= ~0x20u; /*0xc8df*/
  }
  else if ( UsbGetInfo_7(UsbHcPtr) == -1 ) /*0xc8f2*/
  {
    v8 = *(_BYTE *)(UsbHcPtr + 68); /*0xc8f4*/
    if ( v8 ) /*0xc8f9*/
    {
      HcPciReadConfig(UsbHcPtr, v8 + 4); /*0xc908*/
      DebugLogPrint_15(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 68) + 4); /*0xc91f*/
    }
  }
  else if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xc92d*/
  {
    while ( 1 ) /*0xc946*/
    {
      while ( 1 ) /*0xc942*/
      {
        v10 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xc942*/
        if ( (v10 & 0x10) == 0 ) /*0xc946*/
          break; /*0xc946*/
        *(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xc952*/
        EhciDriverEntry(UsbHcPtr, n2047, n65528); /*0xc956*/
        EhciProcessPeriodicList((_BYTE *)UsbHcPtr); /*0xc95e*/
        *(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xc96a*/
      }
      if ( (v10 & 0x1000) != 0 ) /*0xc974*/
        break; /*0xc974*/
      if ( *(_BYTE *)(UsbRtDispatchTable + 30481) == 1 && (v10 & 1) != 0 ) /*0xc992*/
      {
        DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 1); /*0xc9a8*/
        if ( (v10 & 0x4000) != 0 && (DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) & 0x10) != 0 ) /*0xc9c1*/
        {
          if ( *(_QWORD *)(UsbHcPtr + 136) ) /*0xc9c7*/
            UsbConfig_2(UsbHcPtr); /*0xc9d4*/
          v12 = 0; /*0xc9d9*/
          n8 = 8; /*0xc9db*/
          do /*0xca27*/
          {
            v14 = (int *)(v12 + *(_QWORD *)(UsbHcPtr + 8)); /*0xc9e2*/
            for ( i = *v14; (i & 1) == 0; i = *(_DWORD *)v16 ) /*0xc9e5*/
            {
              v16 = i & 0xFFFFFFE0; /*0xc9f1*/
              v17 = *(_DWORD *)v16; /*0xc9f4*/
              if ( (*(_DWORD *)v16 & 6) == 2 && byte_40[(i & 0xFFFFFFE0) + 25] == 1 ) /*0xca04*/
              {
                UsbConfig_15(UsbHcPtr, v16); /*0xca0c*/
                if ( *(_DWORD *)v16 != v17 ) /*0xca14*/
                  v16 = (__int64)v14; /*0xca16*/
              }
            }
            v12 += 4; /*0xca1f*/
            --n8; /*0xca23*/
          }
          while ( n8 ); /*0xca27*/
        }
      }
      else
      {
        if ( (v10 & 4) == 0 || *(_BYTE *)(UsbRtDispatchTable + 29872) == 1 ) /*0xca3f*/
          return 0; /*0xca3f*/
        (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0xca51*/
        DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, 4); /*0xca67*/
        UsbRtDispatchTable = UsbRtDispatchTable; /*0xca6c*/
        v21 = 1; /*0xca73*/
        *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0xca76*/
        if ( *(_BYTE *)(UsbHcPtr + 32) ) /*0xca7d*/
        {
          do /*0xcaa6*/
          {
            v22 = *(_BYTE *)(UsbHcPtr + 69); /*0xca83*/
            if ( !v22 || v22 != v21 ) /*0xca8d*/
            {
              LOBYTE(EndpointAddr) = v21; /*0xca91*/
              LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0xca94*/
              DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0xca9a*/
            }
            ++v21; /*0xca9f*/
          }
          while ( v21 <= *(_BYTE *)(UsbHcPtr + 32) ); /*0xcaa6*/
          UsbRtDispatchTable = UsbRtDispatchTable; /*0xcaa8*/
        }
        *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0xcaaf*/
      }
    }
    v23 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4); /*0xcac5*/
    DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 4, v23); /*0xcad7*/
  }
  return 0; /*0xcaed*/
}


// Function: UsbDriverEntry @ 0xcaf8 (0xac bytes)

char __fastcall UsbDriverEntry(__int64 UsbHcPtr)
{
  __int64 UsbRtDispatchTable; // rdx
  __int64 n448; // rbx
  __int64 n54; // rdi
  __int64 n65528; // r8
  __int64 i; // rcx
  char TmpR8; // r8

  UsbRtDispatchTable = UsbRtDispatchTable; /*0xcb07*/
  n448 = 448; /*0xcb11*/
  n54 = 54; /*0xcb16*/
  do /*0xcb8b*/
  {
    n65528 = *(unsigned int *)(n448 + UsbRtDispatchTable + 3056); /*0xcb1b*/
    if ( (*(_BYTE *)(n448 + UsbRtDispatchTable + 3056) & 3) == 3 ) /*0xcb2b*/
    {
      i = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) /*0xcb41*/
                    + 8LL * (*(unsigned __int8 *)(n448 + UsbRtDispatchTable + 3067) - 1));
      if ( *(_BYTE *)(i + 1) == 16 && (n65528 & 1) != 0 ) /*0xcb4f*/
      {
        n65528 = 65528; /*0xcb55*/
        if ( ((*(_WORD *)(UsbHcPtr + 34) ^ *(_WORD *)(i + 34)) & 0xFFF8) == 0 ) /*0xcb63*/
        {
          TmpR8 = *(_BYTE *)(n448 + UsbRtDispatchTable + 3069); /*0xcb65*/
          LOBYTE(UsbRtDispatchTable) = *(_BYTE *)(n448 + UsbRtDispatchTable + 3068); /*0xcb6d*/
          DebugLogPrint_4(i, UsbRtDispatchTable, TmpR8); /*0xcb74*/
          UsbRtDispatchTable = UsbRtDispatchTable; /*0xcb79*/
        }
      }
    }
    n448 += 448; /*0xcb80*/
    --n54; /*0xcb87*/
  }
  while ( n54 ); /*0xcb8b*/
  return EhciDriverEntry(UsbHcPtr, UsbRtDispatchTable, n65528); /*0xcb9a*/
}


// Function: DebugLogPrint_10 @ 0xcba4 (0xb3 bytes)

char __fastcall sub_CBA4(__int64 a1, unsigned __int8 a2)
{
  int v2; // esi
  unsigned __int16 v4; // ax
  int v5; // edi
  unsigned __int16 i; // si

  v2 = a2; /*0xcbb3*/
  v4 = 4 * (a2 + 16); /*0xcbbc*/
  if ( (*(_DWORD *)(a1 + 56) & 0xF000) != 0 ) /*0xcbc7*/
  {
    v5 = v4; /*0xcbcd*/
    if ( (DebugLogPrint_13(a1, v4 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) == 0 ) /*0xcbd9*/
      return -1; /*0xcbdd*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Release EHCI port %d\n", v2); /*0xcbed*/
    DebugLogPrint_21(a1, v5, 0x2000); /*0xcbfd*/
    for ( i = 0; i < 0xC8u; ++i ) /*0xcc02*/
    {
      if ( (DebugLogPrint_13(a1, v5 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 2) != 0 ) /*0xcc14*/
        break; /*0xcc14*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcc22*/
    }
    DebugLogPrint_21(a1, v5, 2); /*0xcc40*/
  }
  return 0; /*0xcc51*/
}


// Function: EhciPortStatus @ 0xcc58 (0x1f4 bytes)

int __fastcall EhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
  int v3; // ebp
  int n64; // ebx
  unsigned __int16 v7; // r9
  int result; // eax
  char v9; // al
  int v10; // r15d
  int v11; // eax
  __int16 v12; // si
  __int64 v13; // rdx
  void (__fastcall *v14)(__int64, __int64, char *); // rax
  char v15; // r14
  unsigned __int8 n2; // cl
  unsigned int n64_1; // edx
  int n64_2; // ecx
  int n64_3; // edx
  int n64_4; // r8d
  int n64_5; // ecx
  int n64_6; // edx
  char n2_1; // [rsp+58h] [rbp+10h] BYREF

  v3 = a2; /*0xcc6e*/
  n64 = 64; /*0xcc77*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xcc8d*/
    return 255; /*0xcc8f*/
  v9 = *(_BYTE *)(a1 + 69); /*0xcc99*/
  if ( v9 && v9 == (_BYTE)v3 ) /*0xcca3*/
    return 0; /*0xcca5*/
  v10 = v7; /*0xccb3*/
  v11 = DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0xccba*/
  v12 = v11; /*0xccd0*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ehci port[%d] status: %08x\n", v3, v11);
  if ( (v12 & 1) != 0 && (v12 & 0xC00) == 0x400 ) /*0xcceb*/
  {
    DebugLogPrint_10(a1, v3); /*0xccf3*/
    v12 = DebugLogPrint_13(a1, v10 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0xcd07*/
  }
  if ( (v12 & 2) != 0 ) /*0xcd10*/
  {
    n64 = 80; /*0xcd12*/
    if ( a3 == 1 ) /*0xcd1b*/
      DebugLogPrint_21(a1, v10, 2); /*0xcd27*/
  }
  if ( (v12 & 1) != 0 ) /*0xcd30*/
  {
    n64 |= 1u; /*0xcd36*/
    if ( (v12 & 4) != 0 ) /*0xcd3d*/
    {
      v14 = (void (__fastcall *)(__int64, __int64, char *))qword_1C3D0[0]; /*0xcd3f*/
      v15 = 0; /*0xcd46*/
      n2 = 2; /*0xcd49*/
      n2_1 = 2; /*0xcd4b*/
      if ( qword_1C3D0[0] ) /*0xcd52*/
      {
        do /*0xcd76*/
        {
          LOBYTE(v13) = v3; /*0xcd59*/
          v14(a1, v13, &n2_1); /*0xcd5f*/
          v14 = (void (__fastcall *)(__int64, __int64, char *))qword_1C3D0[(unsigned __int8)++v15]; /*0xcd6f*/
        }
        while ( v14 ); /*0xcd76*/
        n2 = n2_1; /*0xcd78*/
      }
      if ( n2 ) /*0xcd85*/
      {
        if ( n2 == 1 ) /*0xcd8a*/
        {
          n64 |= 4u; /*0xcda3*/
        }
        else if ( n2 != 2 ) /*0xcd8f*/
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Get the undefined speed of the root hub port %x\n", n2); /*0xcd9c*/
        }
      }
      else
      {
        n64 |= 2u; /*0xcda8*/
      }
      n64 |= 0x20u; /*0xcdab*/
    }
    else if ( *(_BYTE *)(UsbRtDispatchTable + 30480) == 1 && (v12 & 2) == 0 ) /*0xcdc3*/
    {
      n64 |= 0x10u; /*0xcdc5*/
    }
  }
  n64_1 = n64 & 0xFFFFFFBF; /*0xcdd2*/
  if ( (v12 & 0x2000) == 0 ) /*0xcddc*/
    n64_1 = n64; /*0xcddc*/
  n64_2 = n64_1 | 0x800; /*0xcde1*/
  if ( (v12 & 0x1000) == 0 ) /*0xcdea*/
    n64_2 = n64_1; /*0xcdea*/
  n64_3 = n64_2 | 0x200; /*0xcdef*/
  if ( (v12 & 0x10) == 0 ) /*0xcdf7*/
    n64_3 = n64_2; /*0xcdf7*/
  n64_4 = n64_3 | 0x100; /*0xce02*/
  if ( (v12 & 0x80u) == 0 ) /*0xce09*/
    n64_4 = n64_3; /*0xce09*/
  n64_5 = n64_4 | 0x400; /*0xce12*/
  if ( (v12 & 0x100) == 0 ) /*0xce1a*/
    n64_5 = n64_4; /*0xce1a*/
  n64_6 = n64_5 | 0x1000; /*0xce20*/
  if ( (v12 & 8) == 0 ) /*0xce25*/
    n64_6 = n64_5; /*0xce25*/
  result = n64_6 | 0x4000; /*0xce2a*/
  if ( (v12 & 0x20) == 0 ) /*0xce32*/
    return n64_6; /*0xce32*/
  return result; /*0xce3f*/
}


// Function: EhciPortReset @ 0xce4c (0x9e bytes)

char __fastcall EhciPortReset(__int64 a1)
{
  unsigned __int16 v2; // r9
  char v3; // r10
  unsigned int n0x64; // edi
  int v6; // esi

  n0x64 = 0; /*0xce70*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xce75*/
    return -1; /*0xce77*/
  if ( !*(_BYTE *)(a1 + 69) || *(_BYTE *)(a1 + 69) != v3 ) /*0xce85*/
  {
    v6 = v2; /*0xce8e*/
    if ( (DebugLogPrint_13(a1, v2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) != 0 ) /*0xce9b*/
    {
      DebugLogPrint_19(a1, v6, 4); /*0xcea8*/
      do /*0xced6*/
      {
        if ( (DebugLogPrint_13(a1, v6 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xcebd*/
          break; /*0xcebd*/
        (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcecb*/
        ++n0x64; /*0xced1*/
      }
      while ( n0x64 < 0x64 ); /*0xced6*/
    }
  }
  return 0; /*0xcee4*/
}


// Function: EhciCtrlTransfer @ 0xceec (0x1b8 bytes)

char __fastcall EhciCtrlTransfer(__int64 a1, unsigned __int8 a2)
{
  unsigned __int16 v4; // r9
  unsigned int n0x14; // esi
  int v7; // edi
  unsigned int i; // ebp
  __int64 n50000; // rcx
  __int64 UsbRtDispatchTable; // rcx

  n0x14 = 0; /*0xcf1a*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xcf1f*/
    return -1; /*0xcf1f*/
  v7 = v4; /*0xcf2f*/
  if ( (DebugLogPrint_13(a1, v4 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) != 0 ) /*0xcf3c*/
  {
    DebugLogPrint_19(a1, v7, 4); /*0xcf49*/
    for ( i = 0; i < 0x64; ++i ) /*0xcf4e*/
    {
      if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xcf60*/
        break; /*0xcf60*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcf6e*/
    }
  }
  DebugLogPrint_21(a1, v7, 256); /*0xcf88*/
  if ( (*(_BYTE *)(a1 + 64) & 0x40) == 0 || (n50000 = 3000, a2 != 1) ) /*0xcf9c*/
    n50000 = 50000; /*0xcf9e*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(n50000); /*0xcfaa*/
  DebugLogPrint_19(a1, v7, 256); /*0xcfb8*/
  if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) == 0 ) /*0xcfcd*/
    return -1; /*0xcfcd*/
  do /*0xd002*/
  {
    if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x104) == 4 ) /*0xcfe9*/
      break; /*0xcfe9*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xcff7*/
    ++n0x14; /*0xcffd*/
  }
  while ( n0x14 < 0x14 ); /*0xd002*/
  if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x100) != 0 ) /*0xd014*/
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0xd016*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0xd021*/
    {
      *(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 37; /*0xd030*/
      ++*(_BYTE *)(UsbRtDispatchTable + 104); /*0xd035*/
    }
    return -1; /*0xcf23*/
  }
  if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 4) == 0 ) /*0xd04d*/
  {
    if ( (DebugLogPrint_13(a1, v7 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 1) != 0 ) /*0xd05f*/
      DebugLogPrint_10(a1, a2); /*0xd06b*/
    return -1; /*0xd070*/
  }
  (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0xd081*/
  return 0; /*0xd09d*/
}


// Function: EhciCtrlIn @ 0xd0a4 (0x4f bytes)

char __fastcall EhciCtrlIn(__int64 a1)
{
  __int64 v1; // r9

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0xd0c1*/
    return -1; /*0xd0b8*/
  if ( *(_QWORD *)(v1 + 120) ) /*0xd0c3*/
    DebugLogPrint_15(v1, *(unsigned __int8 *)(v1 + 68) + 4); /*0xd0e7*/
  return 0; /*0xd0ee*/
}


// Function: EhciPortChangeDetect @ 0xd0f4 (0x167 bytes)

char __fastcall EhciPortChangeDetect(_BYTE *UsbHcPtr)
{
  unsigned __int8 n0x10; // si
  unsigned __int8 i; // bp
  int v5; // r14d
  int v6; // eax
  char v7; // bl
  unsigned __int8 j; // bl

  n0x10 = 0; /*0xd115*/
  if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd13d*/
    || (UsbHcPtr[64] & 1) == 0
    || (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 )
  {
    return -1; /*0xd11c*/
  }
  for ( i = 1; i <= UsbHcPtr[32]; ++i ) /*0xd142*/
  {
    v5 = (unsigned __int16)(4 * (i + 16)); /*0xd15f*/
    v6 = DebugLogPrint_13((__int64)UsbHcPtr, v5 + (unsigned int)(unsigned __int8)UsbHcPtr[50]); /*0xd166*/
    v7 = v6; /*0xd17d*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI PortSts[%x] %x \n", i, v6); /*0xd17f*/
    if ( (v7 & 0x84) == 4 ) /*0xd18a*/
    {
      DebugLogPrint_19((__int64)UsbHcPtr, v5, 7340032); /*0xd198*/
      DebugLogPrint_21((__int64)UsbHcPtr, v5, 128); /*0xd1a9*/
      for ( j = 0; j < 0x64u; ++j ) /*0xd1ae*/
      {
        if ( (DebugLogPrint_13((__int64)UsbHcPtr, v5 + (unsigned int)(unsigned __int8)UsbHcPtr[50]) & 0x80u) != 0LL ) /*0xd1c2*/
          break; /*0xd1c2*/
        (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xd1d0*/
      }
    }
  }
  DebugLogPrint_19((__int64)UsbHcPtr, 0, 1); /*0xd1f3*/
  do /*0xd226*/
  {
    if ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned int)(unsigned __int8)UsbHcPtr[50] + 4) & 0x1000) != 0 ) /*0xd20b*/
      break; /*0xd20b*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xd219*/
    ++n0x10; /*0xd21f*/
  }
  while ( n0x10 < 0x10u ); /*0xd226*/
  UsbGetInfo_4((__int64)UsbHcPtr); /*0xd22d*/
  *((_DWORD *)UsbHcPtr + 16) = *((_DWORD *)UsbHcPtr + 16) & 0xFFFFFFFC | 2; /*0xd23b*/
  return 0; /*0xd254*/
}


// Function: HubGetPortAddress @ 0xd25c (0x67 bytes)

__int16 __fastcall HubGetPortAddress(_BYTE *i)
{
  _BYTE *i_1; // rbx
  __int64 j; // rax

  i_1 = i; /*0xd269*/
  if ( (*i & 3) != 0 ) /*0xd26c*/
  {
    for ( j = FwVolDriverEntry(16, 0, i[12], 0); j; j = FwVolDriverEntry(16, 0, *(_BYTE *)(j + 12), 0) ) /*0xd289*/
    {
      if ( (*(_BYTE *)(j + 14) & 0x47) == 0 ) /*0xd296*/
        return (unsigned __int8)i_1[12] | ((unsigned __int8)i_1[13] << 7); /*0xd2be*/
      i_1 = (_BYTE *)j; /*0xd2a3*/
    }
  }
  return 0; /*0xd278*/
}


// Function: DebugLogPrint_7 @ 0xd2c4 (0xe4 bytes)

__int64 __fastcall DebugLogPrint_7(__int64 UsbHcPtr, __int64 a2)
{
  unsigned int i_1; // r14d
  unsigned __int16 n255; // bp
  unsigned int i; // esi

  i_1 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xd2f8*/
  DebugLogPrint_14(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50) + 24, a2); /*0xd2ff*/
  *(_BYTE *)(a2 + 89) = 1; /*0xd306*/
  *(_DWORD *)a2 = a2 | 2; /*0xd310*/
  n255 = (unsigned __int8)UsbConfig_11(UsbHcPtr); /*0xd317*/
  if ( n255 == 255 ) /*0xd324*/
    return 255; /*0xd326*/
  for ( i = 0; !i_1 || i < i_1; ++i ) /*0xd32c*/
  {
    UsbConfig_15(UsbHcPtr, a2); /*0xd33e*/
    if ( !*(_BYTE *)(a2 + 89) ) /*0xd343*/
      break; /*0xd343*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xd355*/
  }
  UsbConfig_7(UsbHcPtr); /*0xd362*/
  if ( *(_BYTE *)(a2 + 89) == 1 ) /*0xd36b*/
  {
    *(_BYTE *)(a2 + 89) = 0; /*0xd374*/
    n255 = 255; /*0xd37c*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI Time-Out\n"); /*0xd37f*/
  }
  EhciResetHcFull(UsbHcPtr); /*0xd387*/
  return n255; /*0xd39e*/
}


// Function: EhciCtrlReset @ 0xd3a8 (0x326 bytes)

__int64 __fastcall EhciCtrlReset(
        __int64 UsbHcPtr,
        __int64 i,
        __int16 a3,
        __int16 a4,
        __int16 a5,
        __int64 a6,
        unsigned __int16 n0x4000)
{
  _WORD *v12; // rax
  unsigned __int64 v13; // r15
  unsigned __int16 n0x4000_1; // bp
  __int64 v15; // rax
  unsigned __int64 v16; // rdi
  _DWORD *v17; // r13
  __int64 v18; // r12
  __int64 v19; // rsi
  int n0x2000; // eax
  int v21; // eax
  int v22; // ecx
  int v23; // r11d
  int v24; // eax
  int v25; // eax
  __int16 v26; // bx
  __int64 UsbRtDispatchTable; // rax
  char v28; // cl
  int n0x2000_1; // [rsp+30h] [rbp-48h]
  int v30[2]; // [rsp+38h] [rbp-40h] BYREF
  __int64 v31; // [rsp+40h] [rbp-38h] BYREF
  char v32; // [rsp+90h] [rbp+18h]

  v32 = a3; /*0xd3b7*/
  *(_QWORD *)v30 = 0; /*0xd3d0*/
  v31 = 0; /*0xd3d8*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd423*/
    || (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
    || (*(_BYTE *)i & 3) == 0 )
  {
    return 0; /*0xd423*/
  }
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xd431*/
  v12 = (_WORD *)UsbConfig_1(1u); /*0xd438*/
  v13 = (unsigned __int64)v12; /*0xd43d*/
  if ( !v12 ) /*0xd443*/
  {
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 2364, (__int64)"DevRequest"); /*0xd458*/
    return 0; /*0xd3f0*/
  }
  n0x4000_1 = n0x4000; /*0xd45f*/
  *v12 = a3; /*0xd46c*/
  v12[2] = a4; /*0xd46f*/
  v12[1] = a5; /*0xd47b*/
  v12[3] = n0x4000; /*0xd480*/
  v15 = UsbConfig_1(0xAu); /*0xd485*/
  v16 = v15; /*0xd48d*/
  if ( !v15 ) /*0xd493*/
    return 0; /*0xd495*/
  v17 = (_DWORD *)(v15 + 128); /*0xd49e*/
  *(_QWORD *)(v15 + 8) = 0x40000000; /*0xd4a5*/
  *(_DWORD *)(v15 + 4) = 0; /*0xd4b2*/
  *(_DWORD *)(v15 + 16) = 1; /*0xd4b6*/
  v18 = v15 + 192; /*0xd4b9*/
  *(_QWORD *)(v15 + 20) = 1; /*0xd4bd*/
  v19 = v15 + 256; /*0xd4c1*/
  *(_QWORD *)(v15 + 28) = 0; /*0xd4c6*/
  *(_QWORD *)(v15 + 36) = 0; /*0xd4ca*/
  *(_DWORD *)(v15 + 44) = 0; /*0xd4ce*/
  *(_BYTE *)(v15 + 90) = 0; /*0xd4d2*/
  n0x2000 = 0x2000; /*0xd4d6*/
  if ( *(_BYTE *)(i + 14) ) /*0xd4db*/
  {
    n0x2000_1 = (*(_BYTE *)(i + 14) & 1 | 0x8000) << 12; /*0xd4f1*/
    *(_DWORD *)(v16 + 8) = ((unsigned __int16)HubGetPortAddress((_BYTE *)i) | 0x4000) << 16; /*0xd504*/
    n0x2000 = n0x2000_1; /*0xd50a*/
  }
  v21 = n0x2000 | 0x4000; /*0xd50e*/
  v22 = v21 | 0x8000; /*0xd51f*/
  if ( *(_WORD *)(UsbHcPtr + 112) == 4358 ) /*0xd52b*/
    v22 = v21; /*0xd52b*/
  *(_DWORD *)(v16 + 4) = *(unsigned __int8 *)(i + 10) | (*(unsigned __int16 *)(i + 16) << 16) | v22; /*0xd53d*/
  v17[2] = 560768; /*0xd543*/
  EhciBuildSgList((__int64)v17, v13, 8u); /*0xd54b*/
  if ( n0x4000 ) /*0xd558*/
  {
    *(_DWORD *)(v18 + 8) = -2147447424; /*0xd56d*/
    v24 = *(_DWORD *)(v18 + 8); /*0xd576*/
    if ( v32 >= 0 ) /*0xd57b*/
      v24 = -2147447680; /*0xd57b*/
    *(_DWORD *)(v18 + 8) = v24; /*0xd581*/
    *(_DWORD *)(v18 + 8) |= n0x4000 << 16; /*0xd593*/
    ElibReadNvStore(UsbHcPtr, v32 & 0x80, a6, n0x4000, v30, (__int64)&v31); /*0xd5af*/
    EhciBuildSgList(v18, v30[0], n0x4000); /*0xd5bf*/
    v23 = 0; /*0xd5c4*/
  }
  *(_DWORD *)(v19 + 8) = -2147447424; /*0xd5d4*/
  v25 = *(_DWORD *)(v19 + 8); /*0xd5db*/
  if ( v32 < 0 ) /*0xd5de*/
    v25 = -2147447680; /*0xd5de*/
  *(_DWORD *)(v19 + 28) = v23; /*0xd5e1*/
  *(_QWORD *)(v19 + 12) = 0; /*0xd5e5*/
  *(_QWORD *)(v19 + 20) = 0; /*0xd5ea*/
  *(_DWORD *)(v19 + 8) = v25; /*0xd5ef*/
  *(_DWORD *)(v19 + 4) = 1; /*0xd5f7*/
  *(_QWORD *)(v16 + 81) = v17; /*0xd5fa*/
  *(_DWORD *)(v16 + 16) = (_DWORD)v17; /*0xd5fe*/
  if ( n0x4000 ) /*0xd605*/
  {
    *v17 = v18; /*0xd607*/
    *(_DWORD *)v18 = v19; /*0xd60b*/
  }
  else
  {
    *v17 = v19; /*0xd611*/
  }
  *(_DWORD *)v19 = 1; /*0xd618*/
  v26 = DebugLogPrint_7(UsbHcPtr, v16); /*0xd625*/
  *(_QWORD *)(v16 + 81) = 0; /*0xd628*/
  *(_DWORD *)(v16 + 16) = 1; /*0xd630*/
  if ( n0x4000 ) /*0xd636*/
  {
    (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v31); /*0xd644*/
    n0x4000_1 = n0x4000 - (*(_WORD *)(v18 + 10) & 0x7FFF); /*0xd656*/
  }
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xd659*/
  *(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xd660*/
  v28 = *(_BYTE *)(UsbRtDispatchTable + 30472); /*0xd667*/
  if ( v26 ) /*0xd670*/
  {
    *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xd672*/
    n0x4000_1 = 0; /*0xd679*/
  }
  if ( (*(_BYTE *)(v16 + 90) & 0x40) != 0 ) /*0xd680*/
  {
    n0x4000_1 = 0; /*0xd685*/
    *(_DWORD *)(UsbRtDispatchTable + 30476) |= 4u; /*0xd689*/
    *(_BYTE *)(UsbRtDispatchTable + 30472) = v28 | 4; /*0xd690*/
  }
  FwVolConfig(v16, 0xAu); /*0xd69e*/
  FwVolConfig(v13, 1u); /*0xd6a8*/
  return n0x4000_1; /*0xd6c1*/
}


// Function: EhciCtrlDispatch @ 0xd6d0 (0x415 bytes)

__int64 __fastcall EhciCtrlDispatch(__int64 UsbHcPtr, __int64 i, signed __int8 a3, __int64 a4, unsigned int n0x4000)
{
  char *dst_1; // rdi
  unsigned __int64 n0x80; // rcx
  unsigned __int16 v12; // r15
  unsigned __int8 v13; // dl
  __int64 v14; // rax
  unsigned __int64 v15; // rsi
  __int64 v16; // r12
  char v17; // cl
  unsigned int n0x4000_2; // edx
  int n0x4000_3; // eax
  int v20; // r15d
  unsigned int v21; // r15d
  unsigned int n0x4000_5; // r15d
  int dst_2; // edx
  __int16 v24; // ax
  __int64 UsbRtDispatchTable; // rax
  __int64 UsbRtDispatchTable_1; // rax
  unsigned __int64 v27; // rdx
  unsigned __int8 v28; // [rsp+30h] [rbp-58h]
  char v29; // [rsp+30h] [rbp-58h]
  unsigned __int8 v30; // [rsp+31h] [rbp-57h]
  unsigned int n0x4000_4; // [rsp+34h] [rbp-54h]
  char *dst; // [rsp+38h] [rbp-50h] BYREF
  unsigned int v33; // [rsp+40h] [rbp-48h]
  unsigned int n0x4000_1; // [rsp+44h] [rbp-44h]
  int v35; // [rsp+48h] [rbp-40h]
  int v36; // [rsp+4Ch] [rbp-3Ch]
  __int64 v37; // [rsp+50h] [rbp-38h] BYREF

  dst = 0; /*0xd6f6*/
  dst_1 = 0; /*0xd6fa*/
  v37 = 0; /*0xd6fd*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xd748*/
    || (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
    || (*(_BYTE *)i & 3) == 0 )
  {
    return 0; /*0xd748*/
  }
  if ( *(_WORD *)(UsbHcPtr + 112) == 4332 && *(_WORD *)(UsbHcPtr + 114) == 0x816D && (a4 & 3) != 0 ) /*0xd76c*/
  {
    if ( n0x4000 >= 0x4000 ) /*0xd775*/
      LOWORD(n0x80) = 512; /*0xd785*/
    else
      n0x80 = ((unsigned __int64)(unsigned __int16)n0x4000 + 31) >> 5; /*0xd77f*/
    dst_1 = (char *)UsbConfig_1(n0x80); /*0xd78f*/
  }
  n0x4000_1 = n0x4000; /*0xd799*/
  v33 = 0; /*0xd79e*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xd7a3*/
  if ( a3 >= 0 ) /*0xd7ad*/
  {
    v12 = *(_WORD *)(i + 106); /*0xd7b9*/
    v13 = *(_BYTE *)(i + 70); /*0xd7be*/
  }
  else
  {
    v12 = *(_WORD *)(i + 104); /*0xd7af*/
    v13 = *(_BYTE *)(i + 69); /*0xd7b4*/
  }
  v28 = v13; /*0xd7c1*/
  if ( !v12 ) /*0xd7c9*/
    return 0; /*0xd7c9*/
  v14 = UsbConfig_1(6u); /*0xd7d4*/
  v15 = v14; /*0xd7d9*/
  if ( !v14 ) /*0xd7df*/
    return 0; /*0xd716*/
  v16 = v14 + 128; /*0xd7e5*/
  ElibReadNvStore(UsbHcPtr, a3, a4, n0x4000, &dst, (__int64)&v37); /*0xd814*/
  if ( !n0x4000 ) /*0xd81c*/
    goto LABEL_47; /*0xd81c*/
  v35 = v15 | 2; /*0xd831*/
  v17 = a3 | v28; /*0xd846*/
  v36 = (v12 << 16) | ((v28 | 0x40) << 8); /*0xd849*/
  v29 = a3 | v28; /*0xd84d*/
  n0x4000_2 = n0x4000; /*0xd851*/
  while ( 1 ) /*0xd862*/
  {
    n0x4000_3 = 0x4000; /*0xd862*/
    if ( n0x4000_2 < 0x4000 ) /*0xd865*/
      n0x4000_3 = n0x4000_2; /*0xd865*/
    n0x4000_4 = n0x4000_3; /*0xd86d*/
    v30 = FwVolDriverEntry_2(i, v17); /*0xd879*/
    *(_DWORD *)v15 = v35; /*0xd886*/
    *(_DWORD *)(v15 + 4) = 0; /*0xd888*/
    *(_QWORD *)(v15 + 28) = 0; /*0xd88c*/
    *(_QWORD *)(v15 + 36) = 0; /*0xd890*/
    *(_DWORD *)(v15 + 44) = 0; /*0xd894*/
    *(_BYTE *)(v15 + 90) = 0; /*0xd898*/
    *(_QWORD *)(v15 + 20) = 1; /*0xd89c*/
    *(_QWORD *)(v15 + 8) = 0x40000000; /*0xd8a4*/
    *(_QWORD *)(v15 + 81) = v16; /*0xd8ac*/
    *(_DWORD *)(v15 + 16) = v16; /*0xd8b0*/
    v20 = v36 | *(unsigned __int8 *)(i + 10) | 0x8000; /*0xd8c3*/
    if ( *(_WORD *)(UsbHcPtr + 112) == 4358 ) /*0xd8cc*/
      v20 = v36 | *(unsigned __int8 *)(i + 10); /*0xd8cc*/
    v21 = v20 | 0x2000; /*0xd8d0*/
    if ( *(_BYTE *)(i + 14) ) /*0xd8bc*/
    {
      v21 = v21 & 0xFFFFCFFF | ((*(_BYTE *)(i + 14) & 1) << 12); /*0xd8ed*/
      *(_DWORD *)(v15 + 8) = ((unsigned __int16)HubGetPortAddress((_BYTE *)i) | 0x4000) << 16; /*0xd8ff*/
    }
    *(_DWORD *)(v15 + 4) = v21; /*0xd902*/
    if ( a3 < 0 ) /*0xd909*/
    {
      *(_DWORD *)(v16 + 8) = 36224; /*0xd90f*/
LABEL_29:
      n0x4000_5 = n0x4000_4; /*0xd918*/
      goto LABEL_30; /*0xd918*/
    }
    *(_DWORD *)(v16 + 8) = 35968; /*0xda16*/
    if ( !dst_1 ) /*0xda22*/
      goto LABEL_29; /*0xda22*/
    n0x4000_5 = n0x4000_4; /*0xda28*/
    MemConfig(dst_1, dst, n0x4000_4); /*0xda41*/
LABEL_30:
    dst_2 = (int)dst_1; /*0xd91d*/
    *(_DWORD *)(v16 + 8) |= (n0x4000_5 | (v30 << 15)) << 16; /*0xd934*/
    if ( !dst_1 ) /*0xd93c*/
      dst_2 = (int)dst; /*0xd93e*/
    EhciBuildSgList(v16, dst_2, n0x4000_5); /*0xd943*/
    *(_DWORD *)v16 = 1; /*0xd950*/
    *(_DWORD *)(v16 + 4) = 1; /*0xd957*/
    *(_BYTE *)(v15 + 89) = 1; /*0xd95c*/
    *(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0xd966*/
    v24 = DebugLogPrint_7(UsbHcPtr, v15); /*0xd96d*/
    *(_DWORD *)(v15 + 16) = 1; /*0xd974*/
    *(_QWORD *)(v15 + 81) = 0; /*0xd97b*/
    if ( v24 ) /*0xd982*/
      break; /*0xd982*/
    if ( (*(_BYTE *)(v15 + 90) & 0x40) != 0 ) /*0xd98c*/
    {
      UsbRtDispatchTable = UsbRtDispatchTable; /*0xda4b*/
      *(_BYTE *)(UsbRtDispatchTable + 30472) &= ~2u; /*0xda52*/
      *(_BYTE *)(UsbRtDispatchTable + 30472) |= 1u; /*0xda59*/
      *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xda60*/
      goto LABEL_47; /*0xda67*/
    }
    FwVolDriverEntry_1(i, v29, *(int *)(v15 + 24) < 0); /*0xd9a5*/
    if ( (*(_WORD *)(v16 + 10) & 0x7FFF) != 0 ) /*0xd9bd*/
      n0x4000_5 -= *(_WORD *)(v16 + 10) & 0x7FFF; /*0xd9bd*/
    if ( n0x4000_5 ) /*0xd9c4*/
    {
      if ( dst_1 && a3 < 0 ) /*0xd9d2*/
        MemConfig(dst, dst_1, n0x4000_5); /*0xd9e4*/
      v33 += n0x4000_5; /*0xd9ed*/
      n0x4000_2 = n0x4000_1 - n0x4000_5; /*0xd9f2*/
      n0x4000_1 -= n0x4000_5; /*0xd9f5*/
      if ( n0x4000_5 >= n0x4000_4 ) /*0xd9fe*/
      {
        v17 = v29; /*0xda00*/
        dst += n0x4000_5; /*0xda07*/
        if ( n0x4000_2 ) /*0xda0e*/
          continue; /*0xda0e*/
      }
    }
    goto LABEL_47; /*0xda0e*/
  }
  UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0xda69*/
  *(_BYTE *)(UsbRtDispatchTable + 30472) |= 2u; /*0xda70*/
  *(_DWORD *)(UsbRtDispatchTable_1 + 30476) |= 0x40u; /*0xda77*/
LABEL_47:
  (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v37); /*0xda7e*/
  FwVolConfig(v15, 6u); /*0xda95*/
  if ( dst_1 ) /*0xda9d*/
  {
    if ( n0x4000 >= 0x4000 ) /*0xdaa9*/
      LOWORD(v27) = 512; /*0xdab9*/
    else
      v27 = ((unsigned __int64)(unsigned __int16)n0x4000 + 31) >> 5; /*0xdab3*/
    FwVolConfig((unsigned __int64)dst_1, v27); /*0xdabe*/
  }
  return v33; /*0xdad8*/
}


// Function: EhciBuildFrameListEntries @ 0xdae8 (0x4f bytes)

unsigned __int64 __fastcall EhciBuildFrameListEntries(int *a1, int *a2)
{
  __int64 n8; // r10
  int v3; // eax
  unsigned int n0x400; // r8d
  unsigned __int64 result; // rax

  n8 = 8; /*0xdaeb*/
  do /*0xdb1f*/
  {
    v3 = *a2; /*0xdaf7*/
    n0x400 = *a2 & 0xFFF; /*0xdafd*/
    *a1 = *a2; /*0xdb04*/
    a1 += 2; /*0xdb09*/
    *((_BYTE *)a1 - 4) = n0x400 >= 0x400; /*0xdb15*/
    *a2 = v3 + 3072; /*0xdb18*/
    --n8; /*0xdb1b*/
  }
  while ( n8 ); /*0xdb1f*/
  result = 0; /*0xdb21*/
  if ( n0x400 > 0x400 ) /*0xdb25*/
    return 0x8000000000000002uLL; /*0xdb2c*/
  return result; /*0xdb36*/
}


// Function: AssertCpuDeadLoop @ 0xdb38 (0x2a3 bytes)

__int64 __fastcall AssertCpuDeadLoop(
        __int64 UsbHcPtr,
        __int64 a2,
        unsigned __int16 a3,
        unsigned int a4,
        unsigned int a5,
        char a6,
        __int64 a7)
{
  __int64 v7; // rbp
  char v9; // dl
  __int64 UsbHcPtr_1; // rbx
  unsigned __int8 v11; // dl
  unsigned __int16 v12; // r15
  unsigned int v13; // r12d
  __int16 v14; // r13
  signed __int64 v15; // rsi
  signed __int64 v16; // rax
  __int64 v17; // r14
  __int64 UsbHcPtr_2; // rbx
  int v19; // edx
  unsigned __int8 i; // r8
  int v21; // ecx
  int v23; // [rsp+20h] [rbp-98h]
  int v24[34]; // [rsp+30h] [rbp-88h] BYREF
  unsigned int v26; // [rsp+C8h] [rbp+10h] BYREF
  unsigned __int16 v27; // [rsp+D0h] [rbp+18h]
  int v28; // [rsp+D8h] [rbp+20h]

  v27 = a3; /*0xdb3b*/
  v7 = a7; /*0xdb54*/
  v9 = *(_BYTE *)(a2 + 376); /*0xdb5f*/
  UsbHcPtr_1 = UsbHcPtr; /*0xdb65*/
  v26 = a4; /*0xdb6b*/
  v11 = v9 & 0xF; /*0xdb6f*/
  LOWORD(v28) = a3; /*0xdb72*/
  v12 = 1; /*0xdb82*/
  v13 = 0; /*0xdb8f*/
  v14 = 0; /*0xdb95*/
  v23 = *(unsigned __int16 *)(a2 + 378) * *(unsigned __int8 *)(a2 + 380); /*0xdb99*/
  if ( *(_WORD *)(UsbHcPtr + 48) ) /*0xdb9d*/
  {
    LODWORD(a7) = v11 << 8; /*0xdbb4*/
    while ( 1 ) /*0xdbda*/
    {
      v15 = EhciBuildFrameListEntries(v24, (int *)&v26); /*0xdbda*/
      if ( v15 < 0 ) /*0xdbe0*/
      {
        v26 = (v24[0] & 0xFFFFF000) + 4096; /*0xdbfd*/
        v16 = EhciBuildFrameListEntries(v24, (int *)&v26); /*0xdc04*/
        v15 = v16; /*0xdc0c*/
        if ( v16 < 0 ) /*0xdc12*/
        {
          DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v16); /*0xdc21*/
          Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3035, (__int64)"!EFI_ERROR (Status)"); /*0xdc39*/
        }
      }
      LODWORD(v17) = 0; /*0xdc52*/
      UsbHcPtr_2 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr_1 + 8) + 4LL * (unsigned __int16)v28); /*0xdc60*/
      v19 = 0; /*0xdc6c*/
      if ( (_WORD)v28 + 1 != *(_WORD *)(UsbHcPtr + 48) ) /*0xdc6f*/
        LOWORD(v19) = v28 + 1; /*0xdc6f*/
      v28 = v19; /*0xdc73*/
      if ( v15 < 0 ) /*0xdc7d*/
      {
        DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v15); /*0xdc8e*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3043, (__int64)"!EFI_ERROR (Status)"); /*0xdca6*/
      }
      *(_DWORD *)(UsbHcPtr_2 + 36) = v24[0] & 0xFFFFF000; /*0xdcc2*/
      for ( i = 0; i < 8u; ++i ) /*0xdcc5*/
      {
        v21 = v24[2 * i] & 0xFFF; /*0xdcd0*/
        *(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) = 201326592; /*0xdcd6*/
        *(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= v21; /*0xdce4*/
        *(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= (_DWORD)v17 << 12; /*0xdcf4*/
        if ( v7 ) /*0xdcfb*/
          *(_DWORD *)(UsbHcPtr_2 + 4LL * i + 4) |= 0x8000u; /*0xdcfd*/
        if ( LOBYTE(v24[2 * i + 1]) && i != 7 ) /*0xdd0e*/
        {
          v17 = (unsigned int)(v17 + 1); /*0xdd14*/
          *(_DWORD *)(UsbHcPtr_2 + 4 * v17 + 36) = v24[2 * i + 2] & 0xFFFFF000; /*0xdd19*/
        }
        v13 += v23; /*0xdd1e*/
        if ( v13 >= a5 ) /*0xdd29*/
          break; /*0xdd29*/
        ++v12; /*0xdd2e*/
      }
      *(_DWORD *)(UsbHcPtr_2 + 36) |= a7 | *(unsigned __int8 *)(a2 + 10); /*0xdd50*/
      *(_DWORD *)(UsbHcPtr_2 + 40) |= *(unsigned __int16 *)(a2 + 378); /*0xdd5a*/
      *(_DWORD *)(UsbHcPtr_2 + 44) |= *(unsigned __int8 *)(a2 + 380); /*0xdd64*/
      if ( a6 ) /*0xdd6f*/
        *(_DWORD *)(UsbHcPtr_2 + 40) |= 0x800u; /*0xdd71*/
      if ( v13 >= a5 ) /*0xdd7e*/
        break; /*0xdd7e*/
      if ( (unsigned __int16)++v14 >= *(_WORD *)(UsbHcPtr + 48) ) /*0xdd8f*/
        break; /*0xdd8f*/
      UsbHcPtr_1 = UsbHcPtr; /*0xdbbd*/
    }
    a3 = v27; /*0xdd95*/
  }
  else
  {
    UsbHcPtr_2 = UsbHcPtr; /*0xddd1*/
  }
  *(_QWORD *)(a2 + 392) = v7; /*0xdd9e*/
  if ( v7 ) /*0xdda8*/
  {
    *(_QWORD *)(a2 + 400) = a3; /*0xddae*/
    *(_QWORD *)(a2 + 416) = UsbHcPtr_2; /*0xddb5*/
  }
  return v12; /*0xddc0*/
}


// Function: UsbConfig_20 @ 0xdddc (0x85 bytes)

__int64 __fastcall UsbConfig_20(__int64 UsbHcPtr, unsigned __int16 a2, __int16 a3, unsigned __int8 *a4, char a5)
{
  __int16 v5; // r10
  unsigned __int8 v8; // cl
  __int64 v9; // rdx
  unsigned __int16 v10; // ax
  bool v11; // zf

  v5 = 0; /*0xddf1*/
LABEL_2:
  v8 = 0; /*0xddfc*/
  v9 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * a2); /*0xde07*/
  v10 = a2 + 1; /*0xde0b*/
  v11 = a2 + 1 == *(_WORD *)(UsbHcPtr + 48); /*0xde0f*/
  a2 = 0; /*0xde13*/
  if ( !v11 ) /*0xde16*/
    a2 = v10; /*0xde16*/
  while ( 1 ) /*0xde23*/
  {
    if ( a5 ) /*0xde23*/
      *(_DWORD *)(v9 + 4LL * v8 + 4) |= 0x80000000; /*0xde25*/
    else
      *(_DWORD *)(v9 + 4LL * v8 + 4) &= ~0x80000000; /*0xde2d*/
    if ( ++v5 == a3 ) /*0xde3b*/
      break; /*0xde3b*/
    if ( ++v8 >= 8u ) /*0xde42*/
      goto LABEL_2; /*0xde42*/
  }
  if ( a4 ) /*0xde49*/
    *a4 = v8; /*0xde4b*/
  return v9; /*0xde60*/
}


// Function: UsbConfig_6 @ 0xde64 (0xee bytes)

__int64 __fastcall UsbConfig_6(__int64 UsbHcPtr, unsigned __int16 a2, __int16 a3, int *a4)
{
  unsigned __int16 v4; // r10
  __int16 v8; // si
  unsigned int v9; // ebx
  __int16 v10; // di
  unsigned __int8 n8; // r8
  __int64 v12; // r11
  unsigned __int16 v13; // ax
  bool v14; // zf
  int v15; // ecx

  v4 = *(_WORD *)(UsbHcPtr + 48); /*0xde81*/
  v8 = 0; /*0xde93*/
  v9 = 0; /*0xde97*/
  v10 = 0; /*0xde9a*/
  if ( v4 ) /*0xdea2*/
  {
    while ( 2 ) /*0xdea4*/
    {
      n8 = 0; /*0xdea4*/
      v12 = *(unsigned int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * a2); /*0xdeae*/
      v13 = a2 + 1; /*0xdeb2*/
      v14 = a2 + 1 == v4; /*0xdeb5*/
      a2 = 0; /*0xdeb9*/
      if ( !v14 ) /*0xdebc*/
        a2 = v13; /*0xdebc*/
      do /*0xdf05*/
      {
        v15 = 0; /*0xdec4*/
        if ( *(int *)(v12 + 4LL * n8 + 4) < 0 ) /*0xdece*/
        {
          *(_DWORD *)(v12 + 4LL * n8 + 4) &= ~0x80000000; /*0xdee2*/
        }
        else
        {
          v15 = HIWORD(*(_DWORD *)(v12 + 4LL * n8 + 4)) & 0xFFF; /*0xded8*/
          v9 += v15; /*0xdede*/
        }
        ++v8; /*0xdee9*/
        if ( a4 ) /*0xdeef*/
          *a4++ = v15; /*0xdef1*/
        if ( v8 == a3 ) /*0xdefc*/
          return v9; /*0xdf4e*/
        ++n8; /*0xdefe*/
      }
      while ( n8 < 8u ); /*0xdf05*/
      v4 = *(_WORD *)(UsbHcPtr + 48); /*0xdf07*/
      if ( (unsigned __int16)++v10 < v4 ) /*0xdf13*/
        continue; /*0xdf13*/
      break;
    }
  }
  Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3175, (__int64)"((BOOLEAN)(0==1))"); /*0xdf28*/
  return 0; /*0xdf43*/
}


// Function: EhciInterruptTransfer @ 0xdf54 (0x1bf bytes)

__int64 __fastcall EhciInterruptTransfer(
        __int64 UsbHcPtr,
        __int64 a2,
        char a3,
        unsigned int a4,
        unsigned int a5,
        _BYTE *a6)
{
  unsigned __int16 v10; // bx
  __int64 result; // rax
  unsigned __int16 v12; // r12
  unsigned __int16 v13; // ax
  __int16 v14; // r14
  __int64 v15; // r13
  __int64 v16; // r15
  unsigned __int16 v17; // si
  unsigned __int8 v18[16]; // [rsp+40h] [rbp-38h] BYREF

  v10 = 0; /*0xdf81*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xdfbe*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0
    || !*(_QWORD *)(UsbHcPtr + 136) )
  {
    return 0; /*0xdfc5*/
  }
  if ( a5 > 8 /*0xdfeb*/
          * *(unsigned __int16 *)(UsbHcPtr + 48)
          * *(unsigned __int16 *)(a2 + 378)
          * (unsigned int)*(unsigned __int8 *)(a2 + 380) )
  {
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3275, (__int64)"((BOOLEAN)(0==1))"); /*0xe000*/
    return 0; /*0xdf8a*/
  }
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xe011*/
  v12 = 0; /*0xe027*/
  v13 = ((*(_WORD *)(UsbHcPtr + 48) - 1) /*0xe037*/
       & ((unsigned int)DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 12) >> 3))
      + 1;
  if ( v13 != *(_WORD *)(UsbHcPtr + 48) ) /*0xe04d*/
    v12 = v13; /*0xe04d*/
  v14 = AssertCpuDeadLoop(UsbHcPtr, a2, v12, a4, a5, a3, (__int64)a6); /*0xe07e*/
  v15 = UsbConfig_20(UsbHcPtr, v12, v14, v18, 1); /*0xe087*/
  if ( a6 ) /*0xe08d*/
  {
    *a6 = 0; /*0xe08f*/
    return 0; /*0xe092*/
  }
  v16 = v18[0]; /*0xe097*/
  v17 = 8 * v14 + 1; /*0xe0a5*/
  do /*0xe0c9*/
  {
    if ( *(int *)(v15 + 4 * v16 + 4) >= 0 ) /*0xe0af*/
      break; /*0xe0af*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(15); /*0xe0bd*/
    ++v10; /*0xe0c3*/
  }
  while ( v10 < v17 ); /*0xe0c9*/
  result = UsbConfig_6(UsbHcPtr, v12, v14, *(int **)(a2 + 384)); /*0xe0dd*/
  if ( v10 == v17 ) /*0xe0e5*/
    *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xe0ee*/
  return result; /*0xe106*/
}


// Function: EhciInterruptDispatch @ 0xe114 (0x2c8 bytes)

__int64 __fastcall EhciInterruptDispatch(
        __int64 UsbHcPtr,
        _BYTE *i,
        char a3,
        unsigned __int16 a4,
        __int64 a5,
        unsigned __int16 n0x4000)
{
  unsigned __int16 v6; // di
  __int64 v11; // rax
  unsigned __int64 v12; // rsi
  char *v13; // r15
  unsigned int v14; // ebx
  __int64 UsbRtDispatchTable; // rax
  unsigned int v16; // ebx
  unsigned int v17; // r13d
  int v18; // eax
  unsigned __int8 v20; // [rsp+30h] [rbp-48h]
  int v21[2]; // [rsp+38h] [rbp-40h] BYREF
  __int64 v22; // [rsp+40h] [rbp-38h] BYREF

  v6 = 0; /*0xe130*/
  *(_QWORD *)v21 = 0; /*0xe136*/
  v22 = 0; /*0xe13d*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL
    && (UsbValidateDeviceEntry((__int64)i) & 0x8000000000000000uLL) == 0LL
    && (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0
    && (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) == 0 )
  {
    *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xe199*/
    v20 = FwVolDriverEntry_2((__int64)i, a3); /*0xe1a7*/
    v11 = UsbConfig_1(6u); /*0xe1ab*/
    v12 = v11; /*0xe1b0*/
    if ( v11 )
    {
      *(_QWORD *)(v11 + 20) = 1; /*0xe1bc*/
      v13 = (char *)(v11 + 128); /*0xe1c0*/
      *(_QWORD *)v11 = 1; /*0xe1c7*/
      *(_QWORD *)(v11 + 81) = v11 + 128; /*0xe1ca*/
      *(_DWORD *)(v11 + 16) = v11 + 128; /*0xe1ce*/
      *(_QWORD *)(v11 + 8) = 0x40000000; /*0xe1d2*/
      *(_QWORD *)(v11 + 28) = 0; /*0xe1da*/
      *(_QWORD *)(v11 + 36) = 0; /*0xe1de*/
      *(_DWORD *)(v11 + 44) = 0; /*0xe1e2*/
      *(_BYTE *)(v11 + 90) = 0; /*0xe1e5*/
      v14 = (unsigned __int8)i[10] | (((a4 << 8) | a3 & 0xF | 0x20) << 8); /*0xe209*/
      if ( i[14] ) /*0xe1e9*/
      {
        v14 = v14 & 0xFFFFCFFF | ((i[14] & 1) << 12); /*0xe221*/
        *(_DWORD *)(v11 + 8) = ((unsigned __int16)HubGetPortAddress(i) << 16) | 0x40001C00; /*0xe233*/
      }
      *(_DWORD *)(v12 + 8) |= 0x40000001u; /*0xe236*/
      *(_DWORD *)(v12 + 4) = v14; /*0xe23d*/
      *(_WORD *)(v12 + 111) = UsbConfig_18(i[14], i[320]); /*0xe25c*/
      *(_DWORD *)(v12 + 24) |= v20 << 31; /*0xe274*/
      *((_DWORD *)v13 + 2) = a3 < 0 ? 36224 : 35968;
      *((_DWORD *)v13 + 2) |= n0x4000 << 16; /*0xe29b*/
      ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, n0x4000, v21, (__int64)&v22); /*0xe2b3*/
      EhciBuildSgList((__int64)v13, v21[0], n0x4000); /*0xe2c3*/
      *(_DWORD *)v13 = 1; /*0xe2d3*/
      *((_DWORD *)v13 + 1) = 1; /*0xe2d6*/
      UsbConfig_10(UsbHcPtr, v12); /*0xe2da*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0xe2df*/
      *(_BYTE *)(v12 + 89) = 1; /*0xe2e6*/
      v16 = 0; /*0xe2e9*/
      v17 = 100 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0xe2f2*/
      while ( (!v17 || v16 < v17) && v13[8] < 0 ) /*0xe305*/
      {
        (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xe313*/
        ++v16; /*0xe319*/
      }
      UsbConfig_19(UsbHcPtr, v12); /*0xe323*/
      v18 = *((_DWORD *)v13 + 2); /*0xe328*/
      if ( (v18 & 0x80u) == 0 ) /*0xe337*/
      {
        if ( (v18 & 0x40) != 0 ) /*0xe35b*/
        {
          *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xe364*/
        }
        else
        {
          v6 = n0x4000 - (HIWORD(v18) & 0x7FFF); /*0xe38e*/
          FwVolDriverEntry_1((__int64)i, a3, *(int *)(v12 + 24) < 0); /*0xe392*/
        }
      }
      else
      {
        DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI Time-Out\n"); /*0xe344*/
        *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xe350*/
      }
      (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v22); /*0xe3a3*/
      FwVolConfig(v12, 6u); /*0xe3ae*/
      EhciResetHcFull(UsbHcPtr); /*0xe3b6*/
    }
  }
  return v6; /*0xe3cf*/
}


// Function: EhciIsochTransfer @ 0xe3dc (0xff bytes)

char __fastcall EhciIsochTransfer(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int64 v5; // rsi
  __int64 v6; // rdx
  unsigned __int64 v7; // rcx

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xe429*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 )
  {
    return -1; /*0xe429*/
  }
  if ( *(_BYTE *)(a2 + 376) && *(_QWORD *)(UsbHcPtr + 136) ) /*0xe434*/
    UsbConfig_20(UsbHcPtr, 0, 8 * *(_WORD *)(UsbHcPtr + 48), 0, 0); /*0xe454*/
  v5 = *(_QWORD *)(a2 + 32); /*0xe459*/
  if ( !v5 ) /*0xe460*/
    return -1; /*0xe3fb*/
  v6 = *(_QWORD *)(a2 + 32); /*0xe462*/
  *(_BYTE *)(v5 + 89) = 0; /*0xe465*/
  UsbConfig_19(UsbHcPtr, v6); /*0xe46c*/
  FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(int *)(v5 + 24) < 0); /*0xe482*/
  FwVolConfig(v5, 6u); /*0xe48f*/
  v7 = *(_QWORD *)(a2 + 232); /*0xe494*/
  *(_QWORD *)(a2 + 32) = 0; /*0xe49b*/
  *(_QWORD *)(a2 + 24) = 0; /*0xe4a0*/
  if ( v7 ) /*0xe4a8*/
  {
    FwVolConfig(v7, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0xe4bc*/
    *(_QWORD *)(a2 + 232) = 0; /*0xe4c1*/
  }
  return 0; /*0xe4d5*/
}


// Function: EhciAsyncPeriodic @ 0xe4dc (0x1f9 bytes)

char __fastcall EhciAsyncPeriodic(__int64 UsbHcPtr, __int64 i)
{
  __int64 v5; // rax
  __int64 v6; // rbx
  _DWORD *v7; // r14
  unsigned int v8; // esi
  __int64 v9; // rax

  DebugPrint( /*0xe536*/
    0xFFFFFFFFFFFFFFFFuLL,
    "EHCI_AP dev type %d, adr %d, ep %x, maxp %x, speed %x, interval %d\n",
    *(unsigned __int8 *)(i + 4),
    *(unsigned __int8 *)(i + 10),
    *(unsigned __int8 *)(i + 64),
    *(unsigned __int16 *)(i + 62),
    *(unsigned __int8 *)(i + 14),
    *(unsigned __int8 *)(i + 320));
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xe546*/
    return -1; /*0xe546*/
  if ( (UsbValidateDeviceEntry(i) & 0x8000000000000000uLL) != 0LL ) /*0xe55a*/
    return -1; /*0xe55a*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xe566*/
    return -1; /*0xe566*/
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xe57d*/
    return -1; /*0xe57d*/
  v5 = UsbConfig_1(6u); /*0xe583*/
  v6 = v5; /*0xe588*/
  if ( !v5 ) /*0xe58e*/
    return -1; /*0xe548*/
  *(_QWORD *)(i + 32) = v5; /*0xe590*/
  v7 = (_DWORD *)(v5 + 128); /*0xe594*/
  *(_QWORD *)(i + 24) = v5 + 128; /*0xe59b*/
  *(_QWORD *)(v5 + 81) = v5 + 128; /*0xe59f*/
  *(_DWORD *)(v5 + 16) = v5 + 128; /*0xe5a3*/
  *(_DWORD *)(v5 + 20) = 1; /*0xe5a7*/
  *(_DWORD *)v5 = 1; /*0xe5ab*/
  *(_QWORD *)(v5 + 91) = i; /*0xe5ae*/
  v8 = *(unsigned __int8 *)(i + 10) | (((*(unsigned __int16 *)(i + 62) << 8) | *(_BYTE *)(i + 64) & 0xF | 0x20) << 8); /*0xe5d0*/
  if ( *(_BYTE *)(i + 14) ) /*0xe5bd*/
  {
    v8 = v8 & 0xFFFFCFFF | ((*(_BYTE *)(i + 14) & 1) << 12); /*0xe5e8*/
    *(_DWORD *)(v5 + 8) |= ((unsigned __int16)HubGetPortAddress((_BYTE *)i) << 16) | 0x1C00; /*0xe5fa*/
  }
  *(_DWORD *)(v6 + 8) |= 0x40000001u; /*0xe5fd*/
  *(_DWORD *)(v6 + 4) = v8; /*0xe604*/
  *(_WORD *)(v6 + 111) = UsbConfig_18(*(_BYTE *)(i + 14), *(_BYTE *)(i + 320)); /*0xe615*/
  *(_DWORD *)(v6 + 24) |= (unsigned __int8)FwVolDriverEntry_2(i, *(_BYTE *)(i + 64)) << 31; /*0xe62f*/
  v7[2] = 36224; /*0xe632*/
  v7[2] = (*(unsigned __int16 *)(i + 322) << 16) | 0x8D80; /*0xe642*/
  v9 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(i + 322) + 31) >> 5); /*0xe655*/
  *(_QWORD *)(i + 232) = v9; /*0xe65a*/
  if ( !v9 ) /*0xe664*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 3815, (__int64)"DevInfo->fpPollDataBuffer"); /*0xe679*/
  EhciBuildSgList((__int64)v7, *(_QWORD *)(i + 232), *(unsigned __int16 *)(i + 322)); /*0xe690*/
  *v7 = 1; /*0xe698*/
  v7[1] = 1; /*0xe69e*/
  UsbConfig_10(UsbHcPtr, v6); /*0xe6a2*/
  *(_BYTE *)(v6 + 80) = UsbRegisterNotifyFunc((__int64)EhciApAddIsocTds); /*0xe6b3*/
  *(_BYTE *)(v6 + 89) = 1; /*0xe6b8*/
  return 0; /*0xe6cb*/
}


// Function: EhciApCtrlIn @ 0xe6d8 (0xa5 bytes)

char __fastcall EhciApCtrlIn(__int64 a1)
{
  unsigned __int64 v2; // rdi
  unsigned __int64 v3; // rcx
  unsigned __int64 v4; // rdx
  unsigned __int64 v5; // rcx

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xe6f5*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xe704*/
    return -1; /*0xe704*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0xe70a*/
    return -1; /*0xe70a*/
  if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 0x1000) != 0 ) /*0xe720*/
    return -1; /*0xe720*/
  v3 = *(_QWORD *)(a1 + 40); /*0xe722*/
  if ( !v3 ) /*0xe729*/
    return -1; /*0xe729*/
  v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xe732*/
  if ( v3 < v4 ) /*0xe73c*/
    return -1; /*0xe73c*/
  if ( v3 + 24 > v2 ) /*0xe745*/
    return -1; /*0xe745*/
  v5 = *(_QWORD *)(v3 + 8); /*0xe747*/
  if ( !v5 || v5 < v4 || v5 + 128 > v2 ) /*0xe75f*/
    return -1; /*0xe770*/
  *(_DWORD *)(v5 + 107) = 525568; /*0xe761*/
  *(_BYTE *)(v5 + 89) = 0; /*0xe76a*/
  return 0; /*0xe777*/
}


// Function: EhciApCtrlOut @ 0xe780 (0x108 bytes)

char __fastcall EhciApCtrlOut(__int64 a1)
{
  unsigned __int64 v2; // rdi
  unsigned __int64 v3; // rcx
  unsigned __int64 v4; // rdx
  unsigned __int64 v5; // r11
  unsigned __int64 v6; // rbx
  __int64 v7; // r11
  int v8; // eax

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xe79d*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) == 0LL /*0xe7d0*/
    && (*(_BYTE *)(a1 + 64) & 1) != 0
    && (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 0x1000) == 0 )
  {
    v3 = *(_QWORD *)(a1 + 40); /*0xe7d6*/
    if ( v3 ) /*0xe7dd*/
    {
      v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xe7ea*/
      if ( v3 >= v4 && v3 + 24 <= v2 ) /*0xe801*/
      {
        v5 = *(_QWORD *)(v3 + 8); /*0xe803*/
        if ( v5 ) /*0xe80a*/
        {
          if ( v5 >= v4 && v5 + 128 <= v2 ) /*0xe81b*/
          {
            if ( *(char *)(v5 + 107) < 0 ) /*0xe822*/
              return 0; /*0xe879*/
            v6 = *(_QWORD *)(v3 + 16); /*0xe824*/
            if ( v6 && v6 >= v4 && v6 + 64 <= v2 ) /*0xe839*/
            {
              *(_DWORD *)(v5 + 107) = 558464; /*0xe83f*/
              EhciBuildSgList(v6, v5 + 99, 8u); /*0xe850*/
              *(_DWORD *)(v7 + 12) = 0; /*0xe855*/
              *(_DWORD *)(v7 + 24) = 0; /*0xe85a*/
              v8 = *(_DWORD *)(v7 + 107); /*0xe85f*/
              *(_DWORD *)(v7 + 20) = 1; /*0xe863*/
              *(_DWORD *)(v7 + 16) = v6; /*0xe86b*/
              *(_DWORD *)(v6 + 8) = v8; /*0xe86f*/
              *(_BYTE *)(v7 + 89) = 1; /*0xe872*/
              return 0; /*0xe872*/
            }
          }
        }
      }
    }
  }
  return -1; /*0xe882*/
}


// Function: UsbConfig_17 @ 0xe888 (0x93 bytes)

char __fastcall UsbConfig_17(__int64 UsbHcPtr)
{
  __int16 v1; // di
  __int64 UsbRtDispatchTable; // rcx

  v1 = 0; /*0xe892*/
  if ( *(_BYTE *)(UsbHcPtr + 69) ) /*0xe897*/
    return 0; /*0xe89f*/
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xe8b1*/
  {
    DebugLogPrint_21(UsbHcPtr, 0, 2); /*0xe8bc*/
    while ( (DebugLogPrint_13(UsbHcPtr, *(unsigned __int8 *)(UsbHcPtr + 50)) & 2) != 0 ) /*0xe8cf*/
    {
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xe8dd*/
      if ( (unsigned __int16)++v1 >= 0x1F4u ) /*0xe8ee*/
        goto LABEL_7; /*0xe8ee*/
    }
    return 0; /*0xe8cf*/
  }
LABEL_7:
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xe8f0*/
  if ( *(_BYTE *)(UsbRtDispatchTable + 104) < 0x30u ) /*0xe8fb*/
  {
    *(_WORD *)(UsbRtDispatchTable + 2LL * *(unsigned __int8 *)(UsbRtDispatchTable + 104) + 8) = 36; /*0xe906*/
    ++*(_BYTE *)(UsbRtDispatchTable + 104); /*0xe90b*/
  }
  return -1; /*0xe915*/
}


// Function: DebugLogPrint_6 @ 0xe91c (0x113 bytes)

char __fastcall DebugLogPrint_6(__int64 UsbHcPtr)
{
  __int64 v2; // rax
  __int64 *v3; // rbx
  _DWORD *v5; // rsi
  unsigned __int16 i; // r8
  __int64 v7; // rcx
  __int64 v8; // rdx
  __int64 v9; // rax

  v2 = UsbConfig_1(1u); /*0xe941*/
  v3 = (__int64 *)v2; /*0xe948*/
  if ( !v2 ) /*0xe94e*/
    return -1; /*0xe94e*/
  v5 = *(_DWORD **)(UsbHcPtr + 136); /*0xe957*/
  *(_QWORD *)(UsbHcPtr + 40) = v2; /*0xe95e*/
  if ( v5 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "EHCI add ISOC TDs: ITD %x\n", (_DWORD)v5);
    for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); v5 += 32 ) /*0xe97e*/
    {
      v7 = *(_QWORD *)(UsbHcPtr + 8); /*0xe984*/
      v8 = i++; /*0xe988*/
      *v5 = *(_DWORD *)(v7 + 4 * v8); /*0xe993*/
      *(_DWORD *)(v7 + 4 * v8) = (_DWORD)v5; /*0xe995*/
    }
  }
  v9 = UsbConfig_1(4u); /*0xe9a8*/
  if ( !v9 ) /*0xe9b0*/
    return -1; /*0xe950*/
  *v3 = v9; /*0xe9b2*/
  *(_DWORD *)(v9 + 16) = 1; /*0xe9b8*/
  *(_QWORD *)(v9 + 20) = 1; /*0xe9bc*/
  *(_QWORD *)(v9 + 8) = 0x40000000; /*0xe9c0*/
  *(_DWORD *)(v9 + 4) = 0; /*0xe9c8*/
  *(_QWORD *)(v9 + 28) = 0; /*0xe9cb*/
  *(_QWORD *)(v9 + 36) = 0; /*0xe9cf*/
  *(_DWORD *)(v9 + 44) = 0; /*0xe9d3*/
  *(_BYTE *)(v9 + 90) = 0; /*0xe9d6*/
  *(_DWORD *)(*v3 + 16) = 1; /*0xe9dd*/
  *(_DWORD *)(*v3 + 20) = 1; /*0xe9e4*/
  *(_DWORD *)(*v3 + 4) = 4202496; /*0xe9eb*/
  *(_DWORD *)*v3 = 1; /*0xe9f5*/
  *(_DWORD *)(*v3 + 24) = 64; /*0xe9fb*/
  *(_WORD *)(*v3 + 111) = 1; /*0xea05*/
  UsbConfig_10(UsbHcPtr, *v3); /*0xea0d*/
  return 0; /*0xea28*/
}


// Function: UsbGetInfo_5 @ 0xea30 (0x73 bytes)

char __fastcall UsbGetInfo_5(__int64 UsbHcPtr)
{
  unsigned __int16 i; // di

  DebugLogPrint_21(UsbHcPtr, 0, 16); /*0xea43*/
  for ( i = 0; i < 0x3E8u; ++i ) /*0xea48*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) != 0 ) /*0xea5d*/
      break; /*0xea5d*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xea6b*/
  }
  return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) == 0); /*0xea9d*/
}


// Function: UsbGetInfo_6 @ 0xeaa4 (0x71 bytes)

char __fastcall UsbGetInfo_6(__int64 UsbHcPtr)
{
  unsigned __int16 i; // di

  DebugLogPrint_19(UsbHcPtr, 0, 16); /*0xeab7*/
  for ( i = 0; i < 0x3E8u; ++i ) /*0xeabc*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) == 0 ) /*0xead1*/
      break; /*0xead1*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xeadf*/
  }
  return -((DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x4000) != 0); /*0xeb0f*/
}


// Function: UsbConfig_11 @ 0xeb18 (0xcb bytes)

char __fastcall UsbConfig_11(__int64 UsbHcPtr)
{
  unsigned __int16 n0x10; // di
  unsigned __int16 i; // si

  DebugLogPrint_21(UsbHcPtr, 0, 32); /*0xeb35*/
  n0x10 = 0; /*0xeb3a*/
  for ( i = 0; i < 0x3E8u; ++i ) /*0xeb3c*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) != 0 ) /*0xeb55*/
      break; /*0xeb55*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xeb63*/
  }
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) != 0 ) /*0xeb89*/
    return 0; /*0xebcc*/
  DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xeb93*/
  do /*0xebc6*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xebab*/
      break; /*0xebab*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xebb9*/
    ++n0x10; /*0xebbf*/
  }
  while ( n0x10 < 0x10u ); /*0xebc6*/
  return -1; /*0xebdd*/
}


// Function: UsbConfig_7 @ 0xebe4 (0xe4 bytes)

char __fastcall UsbConfig_7(__int64 UsbHcPtr)
{
  unsigned __int16 n0x10; // di
  unsigned __int16 i; // si

  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec0b*/
    return 0; /*0xec0b*/
  DebugLogPrint_19(UsbHcPtr, 0, 32); /*0xec1a*/
  n0x10 = 0; /*0xec1f*/
  for ( i = 0; i < 0x3E8u; ++i ) /*0xec21*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec3a*/
      break; /*0xec3a*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0xec48*/
  }
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x8000) == 0 ) /*0xec6e*/
    return 0; /*0xecb1*/
  DebugLogPrint_19(UsbHcPtr, 0, 1); /*0xec78*/
  do /*0xecab*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 0x1000) != 0 ) /*0xec90*/
      break; /*0xec90*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(125); /*0xec9e*/
    ++n0x10; /*0xeca4*/
  }
  while ( n0x10 < 0x10u ); /*0xecab*/
  return -1; /*0xecc2*/
}


// Function: UsbConfig_10 @ 0xecc8 (0xcc bytes)

char __fastcall UsbConfig_10(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int16 v2; // r9
  unsigned __int16 v3; // r10
  __int64 v4; // rbx
  __int64 v5; // r11
  int v6; // eax
  __int16 n7; // ax
  _DWORD *v9; // [rsp+10h] [rbp+10h]

  if ( !a2 ) /*0xecda*/
    return -1; /*0xecda*/
  v2 = *(_WORD *)(a2 + 111); /*0xece0*/
  if ( !v2 ) /*0xece9*/
    return -1; /*0xed87*/
  v3 = *(_WORD *)(UsbHcPtr + 128); /*0xecef*/
  if ( v3 < *(_WORD *)(UsbHcPtr + 48) ) /*0xecfc*/
  {
    v4 = (__int64)v9; /*0xecfe*/
    do /*0xed5e*/
    {
      v5 = *(_QWORD *)(UsbHcPtr + 8) + 4LL * v3; /*0xed0b*/
      if ( *(_QWORD *)(UsbHcPtr + 136) ) /*0xed0f*/
        v5 = *(unsigned int *)v5; /*0xed18*/
      v6 = *(_DWORD *)v5; /*0xed1b*/
      while ( (v6 & 1) == 0 ) /*0xed36*/
      {
        v4 = v6 & 0xFFFFFFE0; /*0xed27*/
        if ( *(_WORD *)&byte_40[v4 + 47] <= v2 ) /*0xed2f*/
          break; /*0xed2f*/
        v6 = *(_DWORD *)v4; /*0xed31*/
        v5 = v4; /*0xed33*/
      }
      if ( (v6 & 1) != 0 || v4 != a2 ) /*0xed41*/
      {
        *(_DWORD *)a2 = *(_DWORD *)v5; /*0xed46*/
        *(_DWORD *)v5 = a2 | 2; /*0xed4d*/
      }
      v2 = *(_WORD *)(a2 + 111); /*0xed50*/
      v3 += v2; /*0xed55*/
    }
    while ( v3 < *(_WORD *)(UsbHcPtr + 48) ); /*0xed5e*/
  }
  n7 = *(_WORD *)(UsbHcPtr + 128); /*0xed60*/
  if ( n7 == 7 ) /*0xed6c*/
    *(_WORD *)(UsbHcPtr + 128) = 0; /*0xed6e*/
  else
    *(_WORD *)(UsbHcPtr + 128) = n7 + 1; /*0xed7b*/
  return 0; /*0xed93*/
}


// Function: UsbConfig_19 @ 0xed94 (0x8a bytes)

char __fastcall UsbConfig_19(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int16 v2; // bx
  int *v5; // rdx
  int v6; // eax
  int *v7; // rcx

  v2 = 0; /*0xeda3*/
  if ( !a2 || !*(_WORD *)(a2 + 111) ) /*0xedb0*/
    return -1; /*0xee0c*/
  UsbGetInfo_6(UsbHcPtr); /*0xedb6*/
  while ( v2 < *(_WORD *)(UsbHcPtr + 48) ) /*0xedfb*/
  {
    v5 = (int *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * v2); /*0xedc8*/
    v6 = *v5; /*0xedcc*/
    while ( (v6 & 1) == 0 ) /*0xede5*/
    {
      v7 = (int *)(v6 & 0xFFFFFFE0); /*0xedd8*/
      if ( v7 == (int *)a2 ) /*0xedde*/
        break; /*0xedde*/
      v6 = *v7; /*0xede0*/
      v5 = v7; /*0xede2*/
    }
    if ( (v6 & 1) == 0 ) /*0xeded*/
      *v5 = *(_DWORD *)a2; /*0xedf1*/
    ++v2; /*0xedf3*/
  }
  *(_DWORD *)a2 = 1; /*0xee00*/
  UsbGetInfo_5(UsbHcPtr); /*0xee03*/
  return 0; /*0xee18*/
}


// Function: EhciBuildSgList @ 0xee20 (0x59 bytes)

unsigned __int16 __fastcall EhciBuildSgList(__int64 a1, int a2, unsigned int n0x4000)
{
  unsigned __int16 n0x4000_1; // ax
  _DWORD *v4; // r9

  n0x4000_1 = 0; /*0xee20*/
  *(_DWORD *)(a1 + 4) = 1; /*0xee22*/
  *(_QWORD *)(a1 + 16) = 0; /*0xee29*/
  v4 = (_DWORD *)(a1 + 12); /*0xee2d*/
  *(_DWORD *)(a1 + 12) = 0; /*0xee31*/
  *(_QWORD *)(a1 + 24) = 0; /*0xee34*/
  if ( n0x4000 ) /*0xee3b*/
  {
    if ( n0x4000 > 0x4000 ) /*0xee50*/
      LOWORD(n0x4000) = 0x4000; /*0xee50*/
    while ( 1 ) /*0xee68*/
    {
      *v4 = a2; /*0xee68*/
      n0x4000_1 = ((a2 + 4096) & 0xF000) - a2; /*0xee6f*/
      if ( n0x4000_1 >= (unsigned __int16)n0x4000 ) /*0xee76*/
        break; /*0xee76*/
      LOWORD(n0x4000) = n0x4000 - n0x4000_1; /*0xee57*/
      ++v4; /*0xee5b*/
      a2 += n0x4000_1; /*0xee62*/
    }
  }
  return n0x4000_1; /*0xee78*/
}


// Function: UsbConfig_15 @ 0xee7c (0xa1 bytes)

char __fastcall UsbConfig_15(__int64 UsbHcPtr, __int64 a2)
{
  __int64 v2; // rax
  __int64 v3; // r10
  unsigned int v5; // ecx
  char (__fastcall *EhciApSubFunc_1)(_BYTE *, __int64, __int64); // r11

  v2 = *(_QWORD *)(a2 + 81); /*0xee86*/
  v3 = a2; /*0xee8c*/
  if ( v2 ) /*0xee95*/
  {
    while ( 1 ) /*0xee97*/
    {
      if ( *(char *)(v2 + 8) < 0 ) /*0xee9b*/
        return -1; /*0xee9b*/
      if ( (*(_BYTE *)(v2 + 8) & 0x40) != 0 ) /*0xeea1*/
        break; /*0xeea1*/
      v5 = *(_DWORD *)v2; /*0xeea3*/
      if ( (*(_DWORD *)v2 & 1) != 0 ) /*0xeea8*/
      {
        *(_BYTE *)(a2 + 89) = 0; /*0xeebd*/
        goto LABEL_9; /*0xeec1*/
      }
      v2 = v5; /*0xeeaa*/
      if ( !v5 ) /*0xeeae*/
        return -1; /*0xeeae*/
    }
    *(_WORD *)(a2 + 89) = 0x4000; /*0xeec3*/
LABEL_9:
    if ( (unsigned __int8)(*(_BYTE *)(a2 + 80) - 1) > 0x31u ) /*0xeed0*/
      return 0; /*0xeed0*/
    EhciApSubFunc_1 = *(char (__fastcall **)(_BYTE *, __int64, __int64))(UsbRtDispatchTable /*0xeedd*/
                                                                       + 8LL * *(unsigned __int8 *)(a2 + 80)
                                                                       + 29456);
    if ( !EhciApSubFunc_1 ) /*0xeee8*/
      return 0; /*0xef19*/
    if ( EhciApSubFunc_1 == EhciApSubFunc || (UsbValidateDeviceEntry(*(_QWORD *)(a2 + 91)) & 0x8000000000000000uLL) == 0LL ) /*0xef02*/
    {
      ((void (__fastcall *)(__int64, _QWORD, __int64, _QWORD, _WORD))EhciApSubFunc_1)( /*0xef16*/
        UsbHcPtr,
        *(_QWORD *)(v3 + 91),
        v3,
        0,
        0);
      return 0; /*0xef16*/
    }
  }
  return -1; /*0xeeb7*/
}


// Function: UsbConfig_2 @ 0xef20 (0x16f bytes)

unsigned __int64 __fastcall UsbConfig_2(__int64 UsbHcPtr)
{
  unsigned int v2; // eax
  __int64 v3; // r8
  unsigned __int16 v4; // bx
  __int64 v5; // rdx
  unsigned __int8 i; // di
  unsigned __int64 i_1; // rax
  unsigned int n0x37; // r8d
  __int64 v9; // rcx
  __int64 v10; // rsi
  unsigned __int16 v11; // ax

  v2 = DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 12); /*0xef43*/
  v3 = *(_QWORD *)(UsbHcPtr + 8); /*0xef4e*/
  v4 = (*(_WORD *)(UsbHcPtr + 48) - 1) & (v2 >> 3); /*0xef5f*/
  v5 = *(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0; /*0xef77*/
  for ( i = 0; i < 8u; ++i ) /*0xef7a*/
  {
    if ( (*(_DWORD *)((_BYTE *)&word_4[2 * i] + (*(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0)) & 0x8000) != 0 ) /*0xef86*/
      break; /*0xef86*/
  }
  if ( i != 8 ) /*0xef93*/
    goto LABEL_11; /*0xef93*/
  if ( !v4 ) /*0xef9d*/
    v4 = *(_WORD *)(UsbHcPtr + 48); /*0xef9d*/
  v5 = *(_DWORD *)(v3 + 4LL * --v4) & 0xFFFFFFE0; /*0xefac*/
  for ( i = 0; i < 8u; ++i ) /*0xefaf*/
  {
    i_1 = i; /*0xefb2*/
    if ( (*(_DWORD *)((_BYTE *)&word_4[2 * i] + (*(_DWORD *)(v3 + 4LL * v4) & 0xFFFFFFE0)) & 0x8000) != 0 ) /*0xefbb*/
      break; /*0xefbb*/
  }
  if ( i != 8 ) /*0xefc8*/
  {
LABEL_11:
    n0x37 = 1; /*0xefd5*/
    v9 = UsbRtDispatchTable + 3504; /*0xefd8*/
    do /*0xf002*/
    {
      v10 = v9; /*0xefe1*/
      i_1 = *(_DWORD *)v9 & 3; /*0xefe4*/
      if ( (*(_BYTE *)v9 & 3) == 3 && *(_QWORD *)(v9 + 416) == v5 ) /*0xeff2*/
        break; /*0xeff2*/
      ++n0x37; /*0xeff4*/
      v9 += 448; /*0xeff7*/
    }
    while ( n0x37 < 0x37 ); /*0xf002*/
    if ( n0x37 != 55 ) /*0xf008*/
    {
      *(_DWORD *)(v5 + 4LL * i + 4) &= ~0x8000u; /*0xf00e*/
      v11 = *(_WORD *)(v10 + 400); /*0xf014*/
      if ( v4 < v11 ) /*0xf01e*/
      {
        v4 += *(_WORD *)(UsbHcPtr + 48); /*0xf020*/
        if ( v4 < v11 ) /*0xf027*/
          Assert( /*0xf03c*/
            (UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c",
            4851,
            (__int64)"CurrentFIndex >= (UINT16)DevInfo->IsocDetails.XferStart");
      }
      UsbConfig_6(UsbHcPtr, *(_WORD *)(v10 + 400), 8 * (v4 - *(_WORD *)(v10 + 400)) + i + 1, *(int **)(v10 + 384)); /*0xf065*/
      i_1 = *(_QWORD *)(v10 + 392); /*0xf06a*/
      *(_BYTE *)i_1 = 1; /*0xf071*/
    }
  }
  return i_1; /*0xf088*/
}


// Function: EhciApAddIsocTds @ 0xf090 (0x138 bytes)

char __fastcall EhciApAddIsocTds(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 v3; // rdi
  __int64 v7; // rdx
  __int64 v8; // r8
  void (__fastcall *v9)(__int64, __int64, __int64, _QWORD, __int16); // r10
  int Info_12; // eax
  __int16 v12; // [rsp+20h] [rbp-18h]

  v3 = *(_QWORD *)(a3 + 81); /*0xf0a4*/
  FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), *(int *)(a3 + 24) < 0); /*0xf0c3*/
  if ( !*(_BYTE *)(a3 + 24) ) /*0xf0c8*/
  {
    if ( (unsigned __int8)(*(_BYTE *)(a2 + 21) - 1) <= 0x31u ) /*0xf0d5*/
    {
      v9 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, __int16))(UsbRtDispatchTable /*0xf0e2*/
                                                                             + 8LL * *(unsigned __int8 *)(a2 + 21)
                                                                             + 29456);
      if ( v9 ) /*0xf0ed*/
      {
        v12 = *(_WORD *)(a2 + 322) - (*(_WORD *)(v3 + 10) & 0x7FFF); /*0xf115*/
        v9(a1, a2, v3, *(_QWORD *)(a2 + 232), v12); /*0xf11a*/
      }
    }
    goto LABEL_8; /*0xf11d*/
  }
  if ( (*(_BYTE *)(a3 + 24) & 8) == 0 /*0xf140*/
    || (LOBYTE(v8) = *(_BYTE *)(a2 + 13),
        LOBYTE(v7) = *(_BYTE *)(a2 + 12),
        Info_12 = UsbGetInfo_12(a1, v7, v8, 0),
        Info_12 != 255)
    && (Info_12 & 0x20) != 0 )
  {
LABEL_8:
    *(_DWORD *)(v3 + 8) &= 0x300u; /*0xf142*/
    *(_DWORD *)(v3 + 8) |= *(unsigned __int16 *)(a2 + 322) << 16; /*0xf159*/
    EhciBuildSgList(v3, *(_QWORD *)(a2 + 232), *(unsigned __int16 *)(a2 + 322)); /*0xf16b*/
    *(_DWORD *)(a3 + 24) &= 0x80000000; /*0xf170*/
    *(_DWORD *)(a3 + 12) = 0; /*0xf177*/
    *(_DWORD *)(a3 + 28) = 0; /*0xf17b*/
    *(_DWORD *)(a3 + 32) = 0; /*0xf17f*/
    *(_DWORD *)(a3 + 36) = 0; /*0xf183*/
    *(_DWORD *)(a3 + 40) = 0; /*0xf187*/
    *(_DWORD *)(a3 + 44) = 0; /*0xf18b*/
    *(_DWORD *)(a3 + 20) = 1; /*0xf18f*/
    *(_DWORD *)v3 = 1; /*0xf196*/
    *(_DWORD *)(v3 + 4) = 1; /*0xf19c*/
    *(_DWORD *)(a3 + 16) = v3; /*0xf1a3*/
    *(_DWORD *)(v3 + 8) |= 0x8C80u; /*0xf1a6*/
    *(_BYTE *)(a3 + 89) = 1; /*0xf1ad*/
  }
  return 0; /*0xf1c2*/
}


// Function: EhciApSubFunc @ 0xf1c8 (0x63 bytes)

char __fastcall EhciApSubFunc(_BYTE *a1, __int64 a2, __int64 a3)
{
  __int64 v3; // rdi
  int v5; // eax

  v3 = *(_QWORD *)(a3 + 81); /*0xf1d2*/
  UsbGetInfo_15(a1); /*0xf1d9*/
  if ( *(char *)(a3 + 107) < 0 ) /*0xf1e2*/
  {
    EhciBuildSgList(v3, a3 + 99, 8u); /*0xf1f1*/
    v5 = *(_DWORD *)(a3 + 107); /*0xf1f6*/
    *(_DWORD *)(a3 + 12) = 0; /*0xf1fc*/
    *(_QWORD *)(a3 + 28) = 0; /*0xf200*/
    *(_QWORD *)(a3 + 36) = 0; /*0xf204*/
    *(_DWORD *)(a3 + 44) = 0; /*0xf208*/
    *(_QWORD *)(a3 + 20) = 1; /*0xf20c*/
    *(_DWORD *)(a3 + 16) = v3; /*0xf214*/
    *(_DWORD *)(v3 + 8) = v5; /*0xf217*/
    *(_BYTE *)(a3 + 89) = 1; /*0xf21a*/
  }
  return 0; /*0xf225*/
}


// Function: UsbConfig_18 @ 0xf22c (0x8e bytes)

__int64 __fastcall sub_F22C(char a1, unsigned __int8 a2)
{
  unsigned __int8 v2; // di
  int v3; // ebx
  char i; // al

  v2 = a2; /*0xf236*/
  LOWORD(v3) = 1; /*0xf239*/
  if ( a1 ) /*0xf240*/
  {
    if ( !a2 ) /*0xf27d*/
      Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 5194, (__int64)"Interval >= 1 && Interval <= 255"); /*0xf292*/
    for ( i = 0; v2; v2 >>= 1 ) /*0xf29c*/
      ++i; /*0xf29e*/
    return (unsigned __int16)(1 << (i - 1)); /*0xf2aa*/
  }
  else
  {
    if ( (unsigned __int8)(a2 - 1) > 0xFu ) /*0xf248*/
      Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ehci.c", 5186, (__int64)"Interval >= 1 && Interval <= 16"); /*0xf25d*/
    if ( (unsigned __int16)(1 << (v2 - 1) >> 3) ) /*0xf26e*/
      LOWORD(v3) = 1 << (v2 - 1) >> 3; /*0xf274*/
  }
  return (unsigned __int16)v3; /*0xf2b4*/
}


// Function: OhciDriverEntry @ 0xf2bc (0x202 bytes)

char __fastcall OhciDriverEntry(__int64 UsbHcPtr)
{
  char v2; // di
  unsigned int n787216; // eax
  char v5; // al
  unsigned __int16 v6; // cx
  __int64 v7; // rdx
  __int64 v8; // rax
  __int16 v9; // ax
  int n11999; // esi
  unsigned int v11; // esi
  int v12; // eax

  v2 = 0; /*0xf2d8*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xf2dd*/
    return -1; /*0xf2dd*/
  n787216 = (unsigned int)HcPciReadConfig(UsbHcPtr, 8u) >> 8; /*0xf2f3*/
  if ( n787216 != 787216 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI HC Class Code is wrong: %x\n", n787216);
    return -1; /*0xf2e1*/
  }
  *(_DWORD *)(UsbHcPtr + 52) = 4096; /*0xf317*/
  *(_WORD *)(UsbHcPtr + 48) = 32; /*0xf321*/
  *(_QWORD *)(UsbHcPtr + 16) = HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFFF0LL; /*0xf33d*/
  v5 = DebugLogPrint_13(UsbHcPtr, 0x48u); /*0xf341*/
  v6 = 0; /*0xf346*/
  v7 = *(_QWORD *)(UsbHcPtr + 8); /*0xf349*/
  for ( *(_BYTE *)(UsbHcPtr + 32) = v5; v6 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(v7 + 4 * v8) = 0 ) /*0xf355*/
    v8 = v6++; /*0xf35b*/
  if ( UsbRegister(UsbHcPtr) == -1 || OhciResetHc1(UsbHcPtr) == -1 ) /*0xf384*/
    return -1; /*0xf384*/
  v9 = DebugLogPrint_13(UsbHcPtr, 0x34u); /*0xf392*/
  n11999 = v9 & 0x3FFF; /*0xf399*/
  if ( n11999 != 11999 )
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI: HcFmInterval %x\n", v9 & 0x3FFF);
  v11 = ((((6 * n11999 - 1260) / 7u) & 0x7FFF) << 16) | n11999; /*0xf3e5*/
  DebugLogPrint_14(UsbHcPtr, 8u, 1); /*0xf3ea*/
  while ( 1 ) /*0xf3f9*/
  {
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0xf3f9*/
    if ( (DebugLogPrint_13(UsbHcPtr, 8u) & 1) == 0 ) /*0xf40f*/
      break; /*0xf40f*/
    if ( (unsigned __int8)++v2 >= 0x64u ) /*0xf418*/
      return -1; /*0xf418*/
  }
  DebugLogPrint_14(UsbHcPtr, 0x34u, v11); /*0xf42a*/
  DebugLogPrint_14(UsbHcPtr, 0x18u, *(_DWORD *)(UsbHcPtr + 8)); /*0xf43b*/
  DebugLogPrint_14(UsbHcPtr, 0x40u, (9 * (v11 & 0x3FFF) / 0xA) & 0x3FFF); /*0xf464*/
  DebugLogPrint_14(UsbHcPtr, 4u, 180); /*0xf477*/
  DebugLogPrint_14(UsbHcPtr, 0x10u, -1073741758); /*0xf48a*/
  *(_DWORD *)(UsbHcPtr + 64) |= 1u; /*0xf48f*/
  v12 = *(_DWORD *)(UsbRtDispatchTable + 4); /*0xf499*/
  if ( (v12 & 0x80u) == 0 ) /*0xf49e*/
    *(_DWORD *)(UsbRtDispatchTable + 4) = v12 | 0x80; /*0xf4a4*/
  return 0; /*0xf4b8*/
}


// Function: OhciStartHc @ 0xf4c0 (0x138 bytes)

char __fastcall OhciStartHc(__int64 UsbHcPtr)
{
  __int64 TmpRdx; // rdx
  __int64 TmpR8; // r8
  unsigned __int8 i; // di
  unsigned __int16 v6; // cx
  __int64 j; // rdx
  __int64 v8; // rax
  unsigned __int64 *v9; // rdi
  unsigned __int64 v10; // rcx
  unsigned __int64 v11; // rcx

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xf4f3*/
    return -1; /*0xf4e3*/
  for ( i = 1; i <= *(_BYTE *)(UsbHcPtr + 32); ++i ) /*0xf4f8*/
  {
    LOBYTE(TmpR8) = i; /*0xf500*/
    LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0xf503*/
    UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0xf509*/
  }
  DebugLogPrint_14(UsbHcPtr, 4u, 0); /*0xf521*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(1000LL * *(unsigned __int16 *)(UsbRtDispatchTable + 31396)); /*0xf542*/
  DebugLogPrint_14(UsbHcPtr, 0x14u, -1); /*0xf554*/
  DebugLogPrint_14(UsbHcPtr, 0x100u, 0); /*0xf564*/
  v6 = 0; /*0xf569*/
  for ( j = *(_QWORD *)(UsbHcPtr + 8); v6 < *(_WORD *)(UsbHcPtr + 48); *(_DWORD *)(j + 4 * v8) = 0 ) /*0xf570*/
    v8 = v6++; /*0xf576*/
  v9 = *(unsigned __int64 **)(UsbHcPtr + 40); /*0xf585*/
  FwVolConfig(*v9, 1u); /*0xf58e*/
  v10 = v9[1]; /*0xf593*/
  if ( v10 ) /*0xf59a*/
    FwVolConfig(v10, 1u); /*0xf59e*/
  v11 = v9[2]; /*0xf5a3*/
  if ( v11 ) /*0xf5aa*/
    FwVolConfig(v11, 1u); /*0xf5ae*/
  FwVolConfig(v9[3], 6u); /*0xf5bc*/
  FwVolConfig((unsigned __int64)v9, 3u); /*0xf5c9*/
  UsbServiceHcPolling(UsbHcPtr, 3u); /*0xf5d3*/
  *(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0xf5d8*/
  UsbFindActiveHc(); /*0xf5dc*/
  return 0; /*0xf5f2*/
}


// Function: OhciStopHc @ 0xf5f8 (0xac bytes)

char __fastcall OhciStopHc(__int64 UsbHcPtr)
{
  unsigned __int64 v2; // rbx
  unsigned __int64 v3; // r8
  unsigned __int64 v4; // rdi
  unsigned __int64 v5; // rcx
  _DWORD *v6; // rcx

  v2 = *(_QWORD *)(UsbHcPtr + 40); /*0xf60c*/
  v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xf616*/
  v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xf620*/
  if ( v2 < v3 ) /*0xf626*/
    return -1; /*0xf626*/
  if ( v2 + 88 > v4 ) /*0xf62f*/
    return -1; /*0xf62f*/
  v5 = *(_QWORD *)(v2 + 16); /*0xf631*/
  if ( v5 < v3 ) /*0xf638*/
    return -1; /*0xf638*/
  if ( v5 + 32 > v4 ) /*0xf641*/
    return -1; /*0xf641*/
  *(_BYTE *)(v5 + 21) = 0; /*0xf643*/
  UsbGetInfo_15((_BYTE *)UsbHcPtr); /*0xf64a*/
  v6 = *(_DWORD **)(v2 + 8); /*0xf656*/
  if ( (unsigned __int64)v6 < *(_QWORD *)(UsbRtDispatchTable + 29880) || (unsigned __int64)(v6 + 8) > v4 ) /*0xf66a*/
    return -1; /*0xf697*/
  if ( (*v6 & 0x4000) == 0 ) /*0xf672*/
  {
    v6[2] = *(_DWORD *)(v2 + 16); /*0xf677*/
    *(_DWORD *)(*(_QWORD *)(v2 + 16) + 8LL) = 0; /*0xf67e*/
    **(_DWORD **)(v2 + 16) = *(_DWORD *)(*(_QWORD *)(v2 + 16) + 16LL); /*0xf689*/
    *(_BYTE *)(*(_QWORD *)(v2 + 16) + 21LL) = 1; /*0xf68f*/
  }
  return 0; /*0xf69e*/
}


// Function: OhciResetHc1 @ 0xf6a4 (0x43 bytes)

char __fastcall OhciResetHc1(__int64 UsbHcPtr)
{
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xf6b5*/
    return -1; /*0xf6b7*/
  DebugLogPrint_14(UsbHcPtr, 0x14u, 0x80000000); /*0xf6c9*/
  DebugLogPrint_14(UsbHcPtr, 4u, 60); /*0xf6da*/
  return 0; /*0xf6e1*/
}


// Function: OhciResetHc2 @ 0xf6e8 (0x43 bytes)

char __fastcall OhciResetHc2(__int64 a1)
{
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xf6f9*/
    return -1; /*0xf6fb*/
  DebugLogPrint_22(a1, 4u, 52); /*0xf70b*/
  DebugLogPrint_14(a1, 0x10u, 0x80000000); /*0xf71e*/
  return 0; /*0xf725*/
}


// Function: OhciResetHc @ 0xf72c (0x1e8 bytes)

char __fastcall OhciResetHc(__int64 UsbHcPtr)
{
  bool v3; // zf
  __int64 UsbRtDispatchTable; // rax
  int v5; // eax
  __int64 v6; // rdi
  __int64 v7; // rsi
  void (__fastcall *v8)(__int64, _QWORD, __int64, _QWORD, int); // r10
  __int64 v9; // rdi
  __int64 v10; // rax
  int v11; // [rsp+20h] [rbp-18h]

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0xf781*/
    || (HcPciReadConfig(UsbHcPtr, 4u) & 6) != 6
    || (HcPciReadConfig(UsbHcPtr, 0x10u) & 0xFFFFFF80) != *(_DWORD *)(UsbHcPtr + 16) )
  {
    return -1; /*0xf781*/
  }
  if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 0x40000000) == 0 ) /*0xf79b*/
  {
    if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 ) /*0xf7f1*/
    {
      if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) == 0x80 ) /*0xf806*/
      {
        if ( (DebugLogPrint_13(UsbHcPtr, 0x18u) & 0xFFFFFF00) == *(_DWORD *)(UsbHcPtr + 8) ) /*0xf837*/
        {
          if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 0x40) != 0 ) /*0xf84a*/
          {
            DebugLogPrint_20(UsbHcPtr, 4u, 4); /*0xf854*/
            UsbGetInfo_1((_BYTE *)UsbHcPtr); /*0xf85c*/
            DebugLogPrint_22(UsbHcPtr, 4u, 4); /*0xf869*/
          }
          if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 2) != 0 ) /*0xf87b*/
          {
            while ( 1 ) /*0xf8d1*/
            {
              v10 = *(_QWORD *)(UsbHcPtr + 8); /*0xf8d1*/
              v9 = *(unsigned int *)(v10 + 132); /*0xf8e1*/
              *(_DWORD *)(v10 + 132) = 0; /*0xf8e7*/
              DebugLogPrint_14(UsbHcPtr, 0xCu, 2); /*0xf8ed*/
              if ( !v9 ) /*0xf8f5*/
                break; /*0xf8f5*/
              do /*0xf8cf*/
              {
                v6 = (unsigned int)v9 & 0xFFFFFFF0; /*0xf884*/
                v7 = *(unsigned int *)(v6 + 8); /*0xf88b*/
                if ( *(_BYTE *)(v6 + 21) == 1 && (unsigned __int8)(*(_BYTE *)(v6 + 20) - 1) <= 0x31u ) /*0xf897*/
                {
                  v8 = *(void (__fastcall **)(__int64, _QWORD, __int64, _QWORD, int))(UsbRtDispatchTable /*0xf8a4*/
                                                                                    + 8LL
                                                                                    * *(unsigned __int8 *)(v6 + 20)
                                                                                    + 29456);
                  if ( v8 ) /*0xf8af*/
                  {
                    LOWORD(v11) = 0; /*0xf8b4*/
                    v8(UsbHcPtr, 0, v6, 0, v11); /*0xf8c1*/
                  }
                }
                if ( v6 == v7 ) /*0xf8c7*/
                  break; /*0xf8c7*/
                LODWORD(v9) = v7; /*0xf8c9*/
              }
              while ( v7 ); /*0xf8cf*/
            }
          }
          return 0; /*0xf8f5*/
        }
      }
      else
      {
        v5 = DebugLogPrint_13(UsbHcPtr, 0xCu); /*0xf80d*/
        DebugLogPrint_14(UsbHcPtr, 0xCu, v5); /*0xf81b*/
      }
    }
    return -1; /*0xf756*/
  }
  DebugLogPrint_14(UsbHcPtr, 0xCu, 0x40000000); /*0xf7a3*/
  v3 = (unsigned int)DebugLogPrint_13(UsbHcPtr, 0x18u) == *(_DWORD *)(UsbHcPtr + 8); /*0xf7b3*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xf7b9*/
  if ( v3 ) /*0xf7c0*/
  {
    *(_DWORD *)(UsbRtDispatchTable + 4) &= ~1u; /*0xf7c2*/
    UsbConfig_14(UsbHcPtr); /*0xf7c6*/
    OhciStartHc(UsbHcPtr); /*0xf7ce*/
  }
  else
  {
    *(_DWORD *)(UsbRtDispatchTable + 4) |= 1u; /*0xf7d8*/
    *(_BYTE *)(UsbRtDispatchTable + 30482) = 0; /*0xf7dc*/
    OhciDriverEntry(UsbHcPtr); /*0xf7e3*/
  }
  return 0; /*0xf90d*/
}


// Function: OhciPortStatus @ 0xf914 (0x14d bytes)

int __fastcall OhciPortStatus(__int64 a1, unsigned __int8 a2, char a3)
{
  int v3; // r14d
  int n64; // ebx
  unsigned __int16 v7; // r9
  int result; // eax
  unsigned int v9; // ebp
  int v10; // edi
  unsigned int v11; // ebx
  int v12; // edx
  int v13; // ecx
  int v14; // edx
  int v15; // ecx
  int v16; // edx
  int v17; // ecx

  v3 = a2; /*0xf92c*/
  n64 = 64; /*0xf936*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xf94c*/
    return 255; /*0xf94e*/
  v9 = v7; /*0xf958*/
  v10 = DebugLogPrint_13(a1, v7); /*0xf977*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Ohci port[%d] status: %08x\n", v3, v10);
  if ( (v10 & 1) != 0 ) /*0xf984*/
  {
    n64 = 65; /*0xf986*/
    if ( (v10 & 2) != 0 ) /*0xf992*/
      n64 = 97; /*0xf992*/
  }
  v11 = n64 | 4; /*0xf995*/
  if ( (v10 & 0x200) != 0 ) /*0xf99c*/
    v11 = v11 & 0xFFFFFFF9 | 2; /*0xf9a1*/
  if ( (v10 & ((unsigned int)&loc_FFFD + 3)) != 0 ) /*0xf9ad*/
  {
    if ( a3 == 1 ) /*0xf9b2*/
      DebugLogPrint_14(a1, v9, (int)&loc_FFFD + 3); /*0xf9b9*/
    v11 |= 0x10u; /*0xf9be*/
  }
  if ( (v10 & 0x20000) != 0 ) /*0xf9ca*/
  {
    v11 |= 0x1000u; /*0xf9cc*/
    if ( a3 == 1 ) /*0xf9d3*/
      DebugLogPrint_14(a1, v9, 0x20000); /*0xf9da*/
  }
  v12 = v11 | 0x100; /*0xf9e9*/
  if ( (v10 & 4) == 0 ) /*0xf9f0*/
    v12 = v11; /*0xf9f0*/
  v13 = v12 | 0x200; /*0xf9f5*/
  if ( (v10 & 8) == 0 ) /*0xf9fd*/
    v13 = v12; /*0xf9fd*/
  v14 = v13 | 0x400; /*0xfa02*/
  if ( (v10 & 0x10) == 0 ) /*0xfa0a*/
    v14 = v13; /*0xfa0a*/
  v15 = v14 | 0x800; /*0xfa0f*/
  if ( (v10 & 0x100) == 0 ) /*0xfa18*/
    v15 = v14; /*0xfa18*/
  v16 = v15 | 0x2000; /*0xfa1d*/
  if ( (v10 & 0x40000) == 0 ) /*0xfa28*/
    v16 = v15; /*0xfa28*/
  v17 = v16 | 0x4000; /*0xfa2d*/
  if ( (v10 & 0x80000) == 0 ) /*0xfa36*/
    v17 = v16; /*0xfa36*/
  result = v17 | 0x8000; /*0xfa3b*/
  if ( (v10 & 0x100000) == 0 ) /*0xfa45*/
    return v17; /*0xfa45*/
  return result; /*0xfa57*/
}


// Function: OhciPortReset @ 0xfa64 (0x38 bytes)

char __fastcall OhciPortReset(__int64 a1)
{
  __int64 v1; // r9
  unsigned __int8 v2; // r10

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xfa76*/
    return -1; /*0xfa78*/
  DebugLogPrint_14(v1, 4 * v2 + 80, 1); /*0xfa90*/
  return 0; /*0xfa97*/
}


// Function: OhciPortChangeDetect @ 0xfa9c (0xe6 bytes)

char __fastcall OhciPortChangeDetect(__int64 a1)
{
  unsigned __int16 v2; // r9
  unsigned int n0x1F4; // esi
  unsigned int v5; // edi
  int v6; // eax

  n0x1F4 = 0; /*0xfac1*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0xfac6*/
    return -1; /*0xfac6*/
  v5 = v2; /*0xfacf*/
  DebugLogPrint_14(a1, v2, 16); /*0xfade*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0xfaef*/
  do /*0xfb1f*/
  {
    if ( (DebugLogPrint_13(a1, v5) & 0x100000) != 0 ) /*0xfb03*/
      break; /*0xfb03*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0xfb11*/
    ++n0x1F4; /*0xfb17*/
  }
  while ( n0x1F4 < 0x1F4 ); /*0xfb1f*/
  if ( (DebugLogPrint_13(a1, v5) & 0x100000) == 0 )
  {
    v6 = DebugLogPrint_13(a1, v5); /*0xfb36*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI: port reset timeout, status: %08x\n", v6);
    return -1; /*0xfaca*/
  }
  DebugLogPrint_14(a1, v5, 0x100000); /*0xfb59*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(3000); /*0xfb6a*/
  return 0; /*0xfb7c*/
}


// Function: OhciCtrlIn @ 0xfb84 (0x8c bytes)

char __fastcall OhciCtrlIn(__int64 a1)
{
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0xfbb0*/
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 )
  {
    return -1; /*0xfb97*/
  }
  DebugLogPrint_14(a1, 0x10u, 8); /*0xfbc0*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(40000); /*0xfbd1*/
  DebugLogPrint_14(a1, 4u, 1216); /*0xfbe5*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0xfbf6*/
  *(_DWORD *)(a1 + 64) = *(_DWORD *)(a1 + 64) & 0xFFFFFFFC | 2; /*0xfc05*/
  return 0; /*0xfc0a*/
}


// Function: OhciCtrlOut @ 0xfc10 (0x4d bytes)

char __fastcall OhciCtrlOut(__int64 a1)
{
  __int64 v1; // r9
  char v2; // r10

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0xfc2d*/
    return -1; /*0xfc24*/
  if ( *(_QWORD *)(v1 + 120) ) /*0xfc2f*/
  {
    if ( v2 == 1 ) /*0xfc48*/
      DebugLogPrint_22(v1, 4u, 256); /*0xfc4a*/
    else
      DebugLogPrint_20(v1, 4u, 256); /*0xfc51*/
  }
  return 0; /*0xfc58*/
}


// Function: OhciCtrlTransfer @ 0xfc60 (0x358 bytes)

__int64 __fastcall OhciCtrlTransfer(
        __int64 UsbHcPtr,
        __int64 a2,
        __int16 a3,
        __int16 a4,
        __int16 a5,
        __int64 a6,
        unsigned __int16 a7)
{
  _QWORD *v7; // rsi
  unsigned __int64 v12; // rbx
  unsigned __int64 v13; // rcx
  unsigned __int64 v14; // rax
  unsigned __int64 v15; // rax
  unsigned __int64 v16; // rax
  unsigned __int64 v17; // rax
  __int16 v18; // ax
  unsigned __int16 v19; // r12
  _WORD *v20; // rcx
  unsigned int n64; // eax
  int *v22; // r15
  int v23; // ecx
  int v24; // eax
  _DWORD *v25; // rcx
  _DWORD *v26; // rdi
  int v27; // eax
  __int64 v28; // rcx
  __int64 v29; // rcx
  __int64 v30; // rbx
  __int64 UsbRtDispatchTable; // rcx
  unsigned __int16 v32; // dx
  unsigned int v33; // r8d
  __int64 v34; // rax
  __int64 v35; // r9
  __int64 n15; // r8
  unsigned __int16 v37; // bx
  __int64 v39; // [rsp+30h] [rbp-38h] BYREF
  __int64 v40; // [rsp+70h] [rbp+8h] BYREF

  v7 = *(_QWORD **)(UsbHcPtr + 40); /*0xfc86*/
  v40 = 0; /*0xfc92*/
  v39 = 0; /*0xfc99*/
  v12 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xfcaa*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0xfcb9*/
    return 0; /*0xfcb9*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0xfcca*/
    return 0; /*0xfcca*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0xfcd4*/
    return 0; /*0xfcd4*/
  if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0xfce8*/
    return 0; /*0xfce8*/
  if ( (*(_BYTE *)a2 & 3) == 0 ) /*0xfcf5*/
    return 0; /*0xfcf5*/
  v13 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0xfd02*/
  if ( (unsigned __int64)v7 < v13 ) /*0xfd0c*/
    return 0; /*0xfd0c*/
  if ( (unsigned __int64)(v7 + 11) > v12 ) /*0xfd19*/
    return 0; /*0xfd19*/
  v14 = v7[3]; /*0xfd1f*/
  if ( v14 < v13 ) /*0xfd26*/
    return 0; /*0xfd26*/
  if ( v14 + 32 > v12 ) /*0xfd33*/
    return 0; /*0xfd33*/
  v15 = v7[4]; /*0xfd39*/
  if ( v15 < v13 ) /*0xfd40*/
    return 0; /*0xfd40*/
  if ( v15 + 32 > v12 ) /*0xfd4d*/
    return 0; /*0xfd4d*/
  v16 = v7[5]; /*0xfd53*/
  if ( v16 < v13 ) /*0xfd5a*/
    return 0; /*0xfd5a*/
  if ( v16 + 32 > v12 ) /*0xfd67*/
    return 0; /*0xfd67*/
  v17 = v7[6]; /*0xfd6d*/
  if ( v17 < v13 || v17 + 32 > v12 ) /*0xfd81*/
    return 0; /*0xff96*/
  v18 = a5; /*0xfd87*/
  v19 = a7; /*0xfd8f*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0xfd98*/
  v20 = (_WORD *)v7[4]; /*0xfd9f*/
  v20[12] = a3; /*0xfda3*/
  v20[13] = v18; /*0xfda8*/
  v20[14] = a4; /*0xfdac*/
  v20[15] = v19; /*0xfdb0*/
  n64 = *(unsigned __int16 *)(a2 + 16); /*0xfdba*/
  v22 = (int *)v7[3]; /*0xfdbf*/
  if ( n64 > 0x40 ) /*0xfdc5*/
    n64 = 64; /*0xfdc5*/
  v23 = (8 * n64) | *(_BYTE *)(a2 + 14) & 1; /*0xfdd3*/
  v24 = *(unsigned __int8 *)(a2 + 10); /*0xfdd7*/
  v22[1] = 0; /*0xfddf*/
  v22[3] = 0; /*0xfde3*/
  *v22 = v24 | ((v23 | 2) << 13); /*0xfdec*/
  v25 = (_DWORD *)v7[4]; /*0xfdef*/
  *v25 = -234618880; /*0xfdf3*/
  v25[1] = (_DWORD)v25 + 24; /*0xfdfc*/
  v25[3] = (_DWORD)v25 + 31; /*0xfe02*/
  if ( v19 )
  {
    v26 = (_DWORD *)v7[5]; /*0xfe18*/
    ElibReadNvStore(UsbHcPtr, a3 & 0x80, a6, v19, &v40, (__int64)&v39); /*0xfe3b*/
    v26[1] = v40; /*0xfe4d*/
    v27 = v19 + a6 - 1; /*0xfe66*/
    *v26 = (a3 & 0x80u) != 0 ? -216793088 : -217317376;
    v26[3] = v27; /*0xfe6a*/
  }
  v28 = v7[6]; /*0xfe6f*/
  *(_QWORD *)(v28 + 4) = 0; /*0xfe7c*/
  *(_DWORD *)(v28 + 12) = 0; /*0xfe8b*/
  *(_DWORD *)v28 = (a3 & 0x80u) != 0 ? -217317376 : -216793088;
  v29 = v7[4]; /*0xfe90*/
  v22[2] = v29; /*0xfe94*/
  if ( v19 ) /*0xfe9c*/
  {
    *(_DWORD *)(v29 + 8) = *((_DWORD *)v7 + 10); /*0xfea1*/
    v29 = v7[5]; /*0xfea4*/
  }
  *(_DWORD *)(v29 + 8) = *((_DWORD *)v7 + 12); /*0xfeab*/
  *(_DWORD *)(v7[6] + 8LL) = 0; /*0xfeb2*/
  v30 = v7[4]; /*0xfeb5*/
  do /*0xfed5*/
  {
    *(_DWORD *)(v30 + 16) = 0; /*0xfec0*/
    *(_BYTE *)(v30 + 20) = UsbRegisterNotifyFunc((__int64)OhciApDispatchSub); /*0xfec8*/
    *(_BYTE *)(v30 + 21) = 1; /*0xfecb*/
    v30 = *(unsigned int *)(v30 + 8); /*0xfecf*/
  }
  while ( v30 ); /*0xfed5*/
  *v22 &= ~0x4000u; /*0xfed7*/
  DebugLogPrint_14(UsbHcPtr, 0x20u, (int)v22); /*0xfee5*/
  DebugLogPrint_14(UsbHcPtr, 8u, 2); /*0xfef4*/
  DebugLogPrint_9(UsbHcPtr, v22, v7[6], (_BYTE *)a2); /*0xff06*/
  *v22 |= 0x4000u; /*0xff0b*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0xff14*/
  v32 = v19; /*0xff1b*/
  v33 = *(_DWORD *)v7[6]; /*0xff1f*/
  *(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0xff22*/
  v34 = v7[5]; /*0xff29*/
  LOBYTE(v35) = *(_BYTE *)(UsbRtDispatchTable + 30472); /*0xff2d*/
  n15 = v33 >> 28; /*0xff34*/
  if ( *(_DWORD *)(v34 + 4) ) /*0xff38*/
    v32 = *(_DWORD *)(v34 + 4) - a6; /*0xff40*/
  v37 = 0; /*0xff47*/
  if ( (_BYTE)n15 ) /*0xff4d*/
  {
    if ( (_BYTE)n15 == 4 ) /*0xff53*/
    {
      LOBYTE(v35) = v35 | 4; /*0xff64*/
      *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0xff68*/
      *(_BYTE *)(UsbRtDispatchTable + 30472) = v35; /*0xff6f*/
    }
    else if ( (_BYTE)n15 == 15 ) /*0xff59*/
    {
      *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0xff5b*/
    }
  }
  else
  {
    v37 = v32; /*0xff78*/
  }
  if ( v19 ) /*0xff7f*/
    (*(void (__fastcall **)(_QWORD, __int64, __int64, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))( /*0xff8d*/
      *(_QWORD *)(UsbHcPtr + 104),
      v39,
      n15,
      v35);
  return v37; /*0xffab*/
}


// Function: OhciBulkTransfer @ 0xffb8 (0x34c bytes)

__int64 __fastcall OhciBulkTransfer(__int64 UsbHcPtr, __int64 a2, signed __int8 a3, __int64 a4, unsigned int n896)
{
  unsigned __int64 v8; // rbp
  unsigned __int64 v9; // rcx
  unsigned __int64 v10; // rdi
  unsigned __int64 v11; // rax
  unsigned __int64 v12; // rax
  unsigned __int16 v13; // r13
  unsigned __int8 v14; // r14
  unsigned int n896_1; // r15d
  unsigned int v16; // ebp
  int n2048; // eax
  int v18; // r14d
  int v19; // r14d
  int i; // edx
  int n896_2; // r13d
  int v22; // r8d
  int n15; // ecx
  __int64 UsbRtDispatchTable_1; // rax
  __int64 UsbRtDispatchTable; // rax
  int v26; // ecx
  unsigned __int8 v28; // [rsp+30h] [rbp-48h]
  char v29; // [rsp+31h] [rbp-47h]
  __int64 v30; // [rsp+38h] [rbp-40h] BYREF
  __int64 v31; // [rsp+40h] [rbp-38h] BYREF

  v30 = 0; /*0xffe5*/
  v31 = 0; /*0xffec*/
  v8 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0xfffd*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x1000c*/
    return 0; /*0x1000c*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x1001d*/
    return 0; /*0x1001d*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x10027*/
    return 0; /*0x10027*/
  if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0x1003b*/
    return 0; /*0x1003b*/
  if ( (*(_BYTE *)a2 & 3) == 0 ) /*0x10046*/
    return 0; /*0x10046*/
  v9 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x10053*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x1005a*/
  v10 = *(_QWORD *)(UsbHcPtr + 40); /*0x10061*/
  if ( v10 < v9 ) /*0x10068*/
    return 0; /*0x10068*/
  if ( v10 + 88 > v8 ) /*0x10075*/
    return 0; /*0x10075*/
  v11 = *(_QWORD *)(v10 + 72); /*0x1007b*/
  if ( v11 < v9 ) /*0x10082*/
    return 0; /*0x10082*/
  if ( v11 + 32 > v8 ) /*0x1008f*/
    return 0; /*0x1008f*/
  v12 = *(_QWORD *)(v10 + 80); /*0x10095*/
  if ( v12 < v9 || v12 + 32 > v8 ) /*0x100a9*/
    return 0; /*0x100a9*/
  v13 = a3 >= 0 ? *(_WORD *)(a2 + 106) : *(_WORD *)(a2 + 104);
  v14 = a3 < 0 ? *(_BYTE *)(a2 + 69) : *(_BYTE *)(a2 + 70);
  v29 = a3 | v14; /*0x100db*/
  v28 = FwVolDriverEntry_2(a2, a3 | v14); /*0x100e4*/
  if ( !v13 ) /*0x100ec*/
    return 0; /*0x102e4*/
  n896_1 = n896; /*0x100f2*/
  v16 = 0; /*0x1011f*/
  ElibReadNvStore(UsbHcPtr, a3, a4, n896, &v30, (__int64)&v31); /*0x10121*/
  if ( n896 ) /*0x10129*/
  {
    n2048 = 2048; /*0x10134*/
    v18 = v14 << 7; /*0x10142*/
    if ( a3 < 0 ) /*0x1014e*/
      n2048 = 4096; /*0x1014e*/
    v19 = (v13 << 16) | n2048 | v18; /*0x1015b*/
    for ( i = v28 << 24; ; i = v28 << 24 ) /*0x1015e*/
    {
      n896_2 = 896; /*0x10169*/
      if ( n896_1 < 0x380 ) /*0x10177*/
        n896_2 = n896_1; /*0x10177*/
      v22 = v16 + v30; /*0x1017b*/
      **(_DWORD **)(v10 + 72) = 0x4000; /*0x1017e*/
      *(_DWORD *)(*(_QWORD *)(v10 + 72) + 8LL) = *(_DWORD *)(v10 + 80); /*0x1018b*/
      *(_DWORD *)(*(_QWORD *)(v10 + 72) + 4LL) = 0; /*0x10192*/
      *(_DWORD *)(*(_QWORD *)(v10 + 72) + 12LL) = 0; /*0x1019a*/
      **(_DWORD **)(v10 + 72) = v19 | *(unsigned __int8 *)(a2 + 10); /*0x101a9*/
      **(_DWORD **)(v10 + 80) = -233570304; /*0x101b6*/
      **(_DWORD **)(v10 + 80) |= i; /*0x101c0*/
      *(_DWORD *)(*(_QWORD *)(v10 + 80) + 4LL) = v22; /*0x101c6*/
      *(_DWORD *)(*(_QWORD *)(v10 + 80) + 12LL) = n896_2 + v22 - 1; /*0x101ce*/
      *(_DWORD *)(*(_QWORD *)(v10 + 80) + 8LL) = 0; /*0x101dc*/
      *(_DWORD *)(*(_QWORD *)(v10 + 80) + 16LL) = 0; /*0x101e4*/
      *(_BYTE *)(*(_QWORD *)(v10 + 80) + 20LL) = UsbRegisterNotifyFunc((__int64)OhciApInterruptEnd); /*0x101f6*/
      *(_BYTE *)(*(_QWORD *)(v10 + 80) + 21LL) = 1; /*0x10200*/
      **(_DWORD **)(v10 + 72) &= ~0x4000u; /*0x10208*/
      DebugLogPrint_14(UsbHcPtr, 0x28u, *(_DWORD *)(v10 + 72)); /*0x10210*/
      *(_BYTE *)(UsbRtDispatchTable + 30472) &= 0xFCu; /*0x10224*/
      DebugLogPrint_14(UsbHcPtr, 8u, 4); /*0x1022f*/
      DebugLogPrint_9(UsbHcPtr, *(_DWORD **)(v10 + 72), *(_QWORD *)(v10 + 80), (_BYTE *)a2); /*0x10242*/
      **(_DWORD **)(v10 + 72) |= 0x4000u; /*0x10251*/
      FwVolDriverEntry_1(a2, v29, *(_BYTE *)(*(_QWORD *)(v10 + 80) + 3LL) & 1); /*0x10261*/
      n15 = **(_DWORD **)(v10 + 80) >> 28; /*0x1026c*/
      if ( (_BYTE)n15 == 4 ) /*0x10272*/
      {
        UsbRtDispatchTable = UsbRtDispatchTable; /*0x10290*/
        *(_BYTE *)(UsbRtDispatchTable + 30472) |= 1u; /*0x10297*/
        *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0x1029e*/
      }
      else if ( (_BYTE)n15 == 15 ) /*0x10277*/
      {
        UsbRtDispatchTable_1 = UsbRtDispatchTable; /*0x10279*/
        *(_BYTE *)(UsbRtDispatchTable + 30472) |= 2u; /*0x10280*/
        *(_DWORD *)(UsbRtDispatchTable_1 + 30476) |= 0x40u; /*0x10287*/
        goto LABEL_34; /*0x1028e*/
      }
      if ( (_BYTE)n15 ) /*0x102a7*/
        goto LABEL_34; /*0x102a7*/
      v26 = *(_DWORD *)(*(_QWORD *)(v10 + 80) + 4LL); /*0x102ad*/
      if ( v26 ) /*0x102b2*/
        break; /*0x102b2*/
      v16 += n896_2; /*0x102b4*/
      n896_1 -= n896_2; /*0x102b7*/
      if ( !n896_1 ) /*0x102ba*/
        goto LABEL_34; /*0x102ba*/
    }
    v16 = v26 - v30; /*0x102ce*/
  }
LABEL_34:
  (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v31); /*0x102d0*/
  return v16; /*0x102f7*/
}


// Function: OhciInterruptTransfer @ 0x10304 (0x224 bytes)

__int64 __fastcall OhciInterruptTransfer(
        __int64 UsbHcPtr,
        _BYTE *a2,
        char a3,
        unsigned __int16 a4,
        __int64 a5,
        unsigned __int16 a6)
{
  __int64 v11; // rax
  _DWORD *v12; // rsi
  __int64 v13; // r14
  int v14; // r9d
  int v15; // ecx
  int v16; // edi
  int v17; // r15d
  _DWORD *v18; // rdx
  int n15; // eax
  __int64 v20; // [rsp+30h] [rbp-38h] BYREF
  __int64 v21; // [rsp+38h] [rbp-30h] BYREF

  v20 = 0; /*0x10327*/
  v21 = 0; /*0x1032e*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x10340*/
    return 0; /*0x10340*/
  if ( (UsbValidateDeviceEntry((__int64)a2) & 0x8000000000000000uLL) != 0LL ) /*0x10356*/
    return 0; /*0x10356*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x1035c*/
    return 0; /*0x1035c*/
  if ( (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 ) /*0x1036d*/
    return 0; /*0x1036d*/
  if ( (*a2 & 3) == 0 ) /*0x10375*/
    return 0; /*0x10375*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x10383*/
  v11 = UsbConfig_1(2u); /*0x1038a*/
  v12 = (_DWORD *)v11; /*0x1038f*/
  if ( !v11 ) /*0x10395*/
    return 0; /*0x10342*/
  v13 = v11 + 32; /*0x10397*/
  *(_QWORD *)v11 = 0x4000; /*0x1039b*/
  *(_DWORD *)(v11 + 8) = v11 + 32; /*0x103a2*/
  *(_DWORD *)(v11 + 12) = 0; /*0x103a6*/
  *(_BYTE *)(v11 + 16) = UsbGetInfo_10(a2[320]); /*0x103b8*/
  v14 = (unsigned __int8)FwVolDriverEntry_2((__int64)a2, a3); /*0x103cb*/
  v15 = a4; /*0x103d3*/
  LOWORD(v16) = a6; /*0x103d9*/
  *v12 = (unsigned __int8)a2[10]
       | (a3 < 0 ? 4096 : 2048)
       | ((unsigned __int8)a3 << 7)
       | (((8 * v15) | a2[14] & 1) << 13);
  *(_DWORD *)v13 = (v14 << 24) | 0xF2140000; /*0x1042a*/
  ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, a6, &v20, (__int64)&v21); /*0x10441*/
  v17 = v20; /*0x10446*/
  *(_DWORD *)(v13 + 4) = v20; /*0x10452*/
  *(_DWORD *)(v13 + 8) = 0; /*0x10456*/
  *(_DWORD *)(v13 + 16) = 0; /*0x1045a*/
  *(_DWORD *)(v13 + 12) = a6 + v17 - 1; /*0x10464*/
  *(_BYTE *)(v13 + 20) = UsbRegisterNotifyFunc((__int64)OhciApInterruptEnd); /*0x10470*/
  UhciInsertFrameListEntry(UsbHcPtr, (__int64)v12); /*0x10477*/
  *(_BYTE *)(v13 + 21) = 1; /*0x1047c*/
  *v12 &= ~0x4000u; /*0x10484*/
  DebugLogPrint_9(UsbHcPtr, v18, v13, a2); /*0x1048e*/
  UsbConfig_5(UsbHcPtr, (__int64)v12); /*0x10499*/
  FwVolDriverEntry_1((__int64)a2, a3, *(_BYTE *)(v13 + 3) & 1); /*0x104ac*/
  n15 = *(_DWORD *)v13 >> 28; /*0x104b4*/
  if ( (_BYTE)n15 == 4 ) /*0x104b9*/
  {
    *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x20u; /*0x104d6*/
  }
  else if ( (_BYTE)n15 == 15 ) /*0x104bd*/
  {
    *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x104c6*/
  }
  if ( *(_DWORD *)(v13 + 4) ) /*0x104dd*/
    v16 = *(_DWORD *)(v13 + 4) - v17; /*0x104e7*/
  (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v21); /*0x104f6*/
  FwVolConfig((unsigned __int64)v12, 2u); /*0x10502*/
  return (unsigned __int16)v16; /*0x1051b*/
}


// Function: OhciIsochTransfer @ 0x10528 (0x1fa bytes)

char __fastcall OhciIsochTransfer(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int8 v5; // bp
  __int64 v6; // rsi
  __int64 v7; // rsi
  char v8; // cl
  int v9; // edx
  int v10; // edx
  int n2048; // eax
  __int64 v12; // rax

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x1057c*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80
    || (*(_BYTE *)a2 & 3) == 0 )
  {
    return -1; /*0x1054c*/
  }
  v5 = FwVolDriverEntry_2(a2, *(_BYTE *)(a2 + 64)); /*0x1058e*/
  v6 = UsbConfig_1(1u); /*0x10596*/
  if ( !v6 ) /*0x1059c*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1770, (__int64)"Ptr"); /*0x105b1*/
  *(_QWORD *)(a2 + 32) = v6; /*0x105bb*/
  v7 = UsbConfig_1(1u); /*0x105c4*/
  if ( !v7 ) /*0x105ca*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1773, (__int64)"Ptr"); /*0x105df*/
  v8 = *(_BYTE *)(a2 + 64); /*0x105e4*/
  v9 = *(_BYTE *)(a2 + 14) & 1 | (8 * *(unsigned __int16 *)(a2 + 62)); /*0x105fc*/
  *(_QWORD *)(a2 + 24) = v7; /*0x105fe*/
  v10 = ((v8 & 0xF | 0x80) << 7) | (v9 << 13); /*0x10611*/
  n2048 = 2048; /*0x10613*/
  if ( v8 < 0 ) /*0x1061a*/
    n2048 = 4096; /*0x1061a*/
  **(_DWORD **)(a2 + 32) = *(unsigned __int8 *)(a2 + 10) | n2048 | v10; /*0x1062a*/
  *(_DWORD *)(*(_QWORD *)(a2 + 32) + 8LL) = *(_DWORD *)(a2 + 24); /*0x10633*/
  *(_DWORD *)(*(_QWORD *)(a2 + 32) + 8LL) |= 2 * v5; /*0x10640*/
  *(_DWORD *)(*(_QWORD *)(a2 + 32) + 12LL) = 0; /*0x10647*/
  *(_DWORD *)(*(_QWORD *)(a2 + 32) + 4LL) = 0; /*0x1064f*/
  *(_BYTE *)(*(_QWORD *)(a2 + 32) + 16LL) = UsbGetInfo_10(*(_BYTE *)(a2 + 320)); /*0x10662*/
  v12 = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x10674*/
  *(_QWORD *)(a2 + 232) = v12; /*0x10679*/
  if ( !v12 ) /*0x10683*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 1790, (__int64)"DevInfo->fpPollDataBuffer"); /*0x10698*/
  **(_DWORD **)(a2 + 24) = -267124736; /*0x106a6*/
  *(_DWORD *)(*(_QWORD *)(a2 + 24) + 16LL) = -267124736; /*0x106ac*/
  *(_DWORD *)(*(_QWORD *)(a2 + 24) + 4LL) = *(_DWORD *)(a2 + 232); /*0x106b9*/
  *(_DWORD *)(*(_QWORD *)(a2 + 24) + 12LL) = *(unsigned __int16 *)(a2 + 322) - 1 + *(_DWORD *)(a2 + 232); /*0x106d8*/
  *(_DWORD *)(*(_QWORD *)(a2 + 24) + 8LL) = 0; /*0x106df*/
  *(_BYTE *)(*(_QWORD *)(a2 + 24) + 20LL) = UsbRegisterNotifyFunc((__int64)OhciApSubFunc); /*0x106ec*/
  UhciInsertFrameListEntry(UsbHcPtr, *(_QWORD *)(a2 + 32)); /*0x106f6*/
  *(_BYTE *)(*(_QWORD *)(a2 + 24) + 21LL) = 1; /*0x106ff*/
  **(_DWORD **)(a2 + 32) &= ~0x4000u; /*0x10707*/
  return 0; /*0x1071c*/
}


// Function: OhciApTransfer @ 0x10724 (0xf4 bytes)

char __fastcall OhciApTransfer(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int64 v2; // rsi
  unsigned __int64 v4; // r14
  unsigned __int64 v7; // rcx

  v2 = *(_QWORD *)(a2 + 32); /*0x10739*/
  v4 = *(_QWORD *)(a2 + 24); /*0x10740*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x1077a*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, 4u) & 0xC0) != 0x80 )
  {
    return -1; /*0x10751*/
  }
  if ( v2 ) /*0x10781*/
  {
    *(_DWORD *)v4 = 0; /*0x10783*/
    *(_DWORD *)(v4 + 16) = 0; /*0x1078a*/
    *(_BYTE *)(v4 + 21) = 0; /*0x10792*/
    UsbConfig_5(UsbHcPtr, v2); /*0x10797*/
    FwVolDriverEntry_1(a2, *(_BYTE *)(a2 + 64), (*(_DWORD *)(v2 + 8) & 2) != 0); /*0x107ac*/
    FwVolConfig(v4, 1u); /*0x107b9*/
    *(_QWORD *)(a2 + 24) = 0; /*0x107be*/
    FwVolConfig(v2, 1u); /*0x107cb*/
    v7 = *(_QWORD *)(a2 + 232); /*0x107d0*/
    *(_QWORD *)(a2 + 32) = 0; /*0x107d7*/
    if ( v7 ) /*0x107df*/
    {
      FwVolConfig(v7, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x107f3*/
      *(_QWORD *)(a2 + 232) = 0; /*0x107f8*/
    }
  }
  return 0; /*0x10811*/
}


// Function: OhciApSubFunc @ 0x10818 (0x12c bytes)

char __fastcall OhciApSubFunc(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 UsbRtDispatchTable; // rbp
  unsigned __int8 i; // dl
  __int64 v7; // rcx
  __int64 v8; // rdi
  __int16 v10; // cx
  void (__fastcall *v11)(__int64, __int64, __int64, _QWORD, __int16); // r10
  int v12; // eax

  if ( *(_BYTE *)(a3 + 21) ) /*0x1082c*/
  {
    *(_BYTE *)(a3 + 21) = 0; /*0x10842*/
    DebugLogPrint_20(a1, 4u, 4); /*0x1084a*/
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x1084f*/
    for ( i = 1; i < 0x37u; ++i ) /*0x10856*/
    {
      v7 = 448LL * i; /*0x10862*/
      v8 = v7 + UsbRtDispatchTable + 3056; /*0x10869*/
      if ( (*(_BYTE *)v8 & 2) != 0 && *(_QWORD *)(v8 + 24) == a3 ) /*0x10875*/
        break; /*0x10875*/
    }
    if ( i == 55 ) /*0x10881*/
      return -1; /*0x10885*/
    FwVolDriverEntry_1( /*0x1089f*/
      v7 + UsbRtDispatchTable + 3056,
      *(_BYTE *)(v8 + 64),
      (*(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) & 2) != 0);
    if ( (*(_DWORD *)a3 & 0xF0000000) == 0 ) /*0x108aa*/
    {
      if ( *(_DWORD *)(a3 + 4) ) /*0x108ac*/
        v10 = *(_WORD *)(a3 + 4) - *(_WORD *)(v8 + 232); /*0x108b6*/
      else
        v10 = *(_WORD *)(v8 + 322); /*0x108bf*/
      if ( (unsigned __int8)(*(_BYTE *)(v8 + 21) - 1) <= 0x31u ) /*0x108cd*/
      {
        v11 = *(void (__fastcall **)(__int64, __int64, __int64, _QWORD, __int16))(UsbRtDispatchTable /*0x108d3*/
                                                                                + 8LL * *(unsigned __int8 *)(v8 + 21)
                                                                                + 29456);
        if ( v11 ) /*0x108de*/
          v11(a1, v8, a3, *(_QWORD *)(v8 + 232), v10); /*0x108f5*/
      }
    }
    DebugLogPrint_22(a1, 4u, 4); /*0x10903*/
    v12 = *(_DWORD *)(a3 + 16); /*0x10908*/
    *(_DWORD *)(a3 + 8) = 0; /*0x1090b*/
    *(_DWORD *)a3 = v12; /*0x1090f*/
    *(_DWORD *)(a3 + 4) = *(_DWORD *)(v8 + 232); /*0x10917*/
    *(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) &= 2u; /*0x1091e*/
    *(_DWORD *)(*(_QWORD *)(v8 + 32) + 8LL) |= a3; /*0x10926*/
    *(_BYTE *)(a3 + 21) = 1; /*0x10929*/
  }
  return 0; /*0x1093e*/
}


// Function: OhciApCtrlIn @ 0x10944 (0xa0 bytes)

char __fastcall OhciApCtrlIn(__int64 a1)
{
  unsigned __int64 v2; // rdi
  unsigned __int64 v3; // rdx
  unsigned __int64 v4; // r8
  _DWORD *v5; // rcx

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x10961*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x10970*/
    return -1; /*0x10970*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x10976*/
    return -1; /*0x10976*/
  if ( (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 ) /*0x10987*/
    return -1; /*0x10987*/
  v3 = *(_QWORD *)(a1 + 40); /*0x1098b*/
  if ( !v3 ) /*0x10992*/
    return -1; /*0x10992*/
  v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x1099b*/
  if ( v3 < v4 ) /*0x109a5*/
    return -1; /*0x109a5*/
  if ( v3 + 88 > v2 ) /*0x109ae*/
    return -1; /*0x109ae*/
  v5 = *(_DWORD **)(v3 + 8); /*0x109b0*/
  if ( !v5 || (unsigned __int64)v5 < v4 || (unsigned __int64)(v5 + 8) > v2 ) /*0x109c5*/
    return -1; /*0x109d7*/
  *v5 |= 0x4000u; /*0x109c7*/
  *(_BYTE *)(*(_QWORD *)(v3 + 16) + 21LL) = 0; /*0x109cf*/
  return 0; /*0x109de*/
}


// Function: OhciApCtrlOut @ 0x109e4 (0xc3 bytes)

char __fastcall OhciApCtrlOut(__int64 a1)
{
  unsigned __int64 v2; // rdi
  unsigned __int64 v3; // rdx
  unsigned __int64 v4; // rcx
  unsigned __int64 v5; // rax

  v2 = *(_QWORD *)(UsbRtDispatchTable + 29880) + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x10a01*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x10a10*/
    return -1; /*0x10a10*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x10a1a*/
    return -1; /*0x10a1a*/
  if ( (DebugLogPrint_13(a1, 4u) & 0xC0) != 0x80 ) /*0x10a2b*/
    return -1; /*0x10a2b*/
  v3 = *(_QWORD *)(a1 + 40); /*0x10a2f*/
  if ( !v3 ) /*0x10a36*/
    return -1; /*0x10a36*/
  v4 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x10a3f*/
  if ( v3 < v4 ) /*0x10a49*/
    return -1; /*0x10a49*/
  if ( v3 + 88 > v2 ) /*0x10a52*/
    return -1; /*0x10a52*/
  v5 = *(_QWORD *)(v3 + 8); /*0x10a54*/
  if ( !v5 || v5 < v4 || v5 + 32 > v2 ) /*0x10a69*/
    return -1; /*0x10a9a*/
  *(_DWORD *)(*(_QWORD *)(v3 + 16) + 8LL) = 0; /*0x10a6f*/
  *(_DWORD *)(*(_QWORD *)(v3 + 8) + 8LL) = *(_DWORD *)(v3 + 16); /*0x10a7a*/
  **(_DWORD **)(v3 + 16) = *(_DWORD *)(*(_QWORD *)(v3 + 16) + 16LL); /*0x10a84*/
  *(_BYTE *)(*(_QWORD *)(v3 + 16) + 21LL) = 1; /*0x10a8a*/
  **(_DWORD **)(v3 + 8) &= ~0x4000u; /*0x10a92*/
  return 0; /*0x10aa1*/
}


// Function: OhciApDispatch @ 0x10aa8 (0x103 bytes)

char __fastcall OhciApDispatch(_BYTE *UsbHcPtr)
{
  unsigned __int16 n84; // bp
  unsigned __int8 v3; // di
  unsigned int v5; // eax
  unsigned int v6; // esi

  n84 = 84; /*0x10ac4*/
  v3 = 0; /*0x10ace*/
  if ( (HcCheckInit((__int64)UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x10af5*/
    || (UsbHcPtr[64] & 1) == 0
    || (DebugLogPrint_13((__int64)UsbHcPtr, 4u) & 0xC0) != 0x80 )
  {
    return -1; /*0x10ad5*/
  }
  v5 = DebugLogPrint_13((__int64)UsbHcPtr, 0x48u); /*0x10b00*/
  v6 = v5; /*0x10b05*/
  if ( (v5 & 0x200) == 0 ) /*0x10b0b*/
  {
    if ( (v5 & 0x100) != 0 ) /*0x10b11*/
    {
      if ( UsbHcPtr[32] ) /*0x10b27*/
      {
        do /*0x10b65*/
        {
          DebugLogPrint_22((__int64)UsbHcPtr, 0x4Cu, 0x10000 << (v3 + 1)); /*0x10b44*/
          DebugLogPrint_14((__int64)UsbHcPtr, n84, 256); /*0x10b55*/
          n84 += 4; /*0x10b5a*/
          ++v3; /*0x10b5e*/
        }
        while ( v3 < UsbHcPtr[32] ); /*0x10b65*/
      }
    }
    else
    {
      DebugLogPrint_14((__int64)UsbHcPtr, 0x50u, 0x10000); /*0x10b20*/
    }
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1000LL * ((v6 >> 23) & 0xFE)); /*0x10b80*/
  }
  UsbGetInfo_1(UsbHcPtr); /*0x10b89*/
  return 0; /*0x10ba4*/
}


// Function: UhciInsertFrameListEntry @ 0x10bac (0x69 bytes)

char __fastcall UhciInsertFrameListEntry(__int64 UsbHcPtr, __int64 a2)
{
  __int16 v2; // r8
  unsigned __int16 i; // r9
  _DWORD *j; // r10
  __int64 v5; // rax

  if ( !a2 ) /*0x10bb9*/
    return -1; /*0x10bb9*/
  LOBYTE(v2) = *(_BYTE *)(a2 + 16); /*0x10bbb*/
  if ( !(_BYTE)v2 ) /*0x10bc2*/
    return -1; /*0x10c0d*/
  for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); i += v2 ) /*0x10bc8*/
  {
    for ( j = (_DWORD *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * i); ; j = (_DWORD *)(v5 + 12) ) /*0x10bd6*/
    {
      v5 = (unsigned int)*j; /*0x10be6*/
      if ( !*j || *((_BYTE *)&word_10 + (unsigned int)*j) <= (unsigned __int8)v2 ) /*0x10be0*/
        break; /*0x10be0*/
    }
    if ( v5 != a2 ) /*0x10bf1*/
    {
      *(_DWORD *)(a2 + 12) = v5; /*0x10bf3*/
      *j = a2; /*0x10bf6*/
    }
    v2 = *(unsigned __int8 *)(a2 + 16); /*0x10bf9*/
  }
  return 0; /*0x10c14*/
}


// Function: UsbConfig_5 @ 0x10c18 (0x125 bytes)

char __fastcall UsbConfig_5(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int16 n0x64; // bx
  unsigned __int16 i; // r8
  _DWORD *v5; // r9
  __int64 v6; // rax

  n0x64 = 0; /*0x10c22*/
  if ( !a2 || !*(_BYTE *)(a2 + 16) ) /*0x10c30*/
    return -1; /*0x10d30*/
  *(_DWORD *)a2 |= 0x4000u; /*0x10c39*/
  for ( i = 0; i < *(_WORD *)(UsbHcPtr + 48); i += *(unsigned __int8 *)(a2 + 16) ) /*0x10c41*/
  {
    v5 = (_DWORD *)(*(_QWORD *)(UsbHcPtr + 8) + 4LL * i); /*0x10c4f*/
    v6 = (unsigned int)*v5; /*0x10c53*/
    if ( *v5 ) /*0x10c53*/
    {
      do /*0x10c6a*/
      {
        if ( v6 == a2 ) /*0x10c5e*/
          break; /*0x10c5e*/
        v5 = (_DWORD *)(v6 + 12); /*0x10c60*/
        v6 = *(unsigned int *)(v6 + 12); /*0x10c64*/
      }
      while ( v6 ); /*0x10c6a*/
      if ( v6 ) /*0x10c6f*/
        *v5 = *(_DWORD *)(a2 + 12); /*0x10c74*/
    }
  }
  DebugLogPrint_14(UsbHcPtr, 0xCu, 4); /*0x10c92*/
  DebugLogPrint_14(UsbHcPtr, 0x10u, 4); /*0x10ca3*/
  do /*0x10cd2*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 4) != 0 ) /*0x10cb7*/
      break; /*0x10cb7*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(10); /*0x10cc5*/
    ++n0x64; /*0x10ccb*/
  }
  while ( n0x64 < 0x64u ); /*0x10cd2*/
  if ( n0x64 >= 0x64u ) /*0x10cd8*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2272, (__int64)"Index < 100"); /*0x10ced*/
  if ( (DebugLogPrint_13(UsbHcPtr, 0xCu) & 4) == 0 ) /*0x10d01*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2273, (__int64)"HcReadHcMem(HcStruc, 0x0c) & 0x00000004"); /*0x10d16*/
  DebugLogPrint_14(UsbHcPtr, 0x14u, 4); /*0x10d27*/
  return 0; /*0x10d37*/
}


// Function: UsbRegister @ 0x10d40 (0x1d0 bytes)

char __fastcall UsbRegister(__int64 UsbHcPtr)
{
  __int64 v2; // rax
  __int64 *v3; // rbx
  const char *DescPtrs; // r8
  __int64 n2303; // rdx
  _DWORD *v7; // rax
  __int64 v8; // rax
  __int64 *v9; // rcx
  __int64 n4; // rdx
  __int64 v11; // rsi
  __int64 v12; // rsi
  _DWORD *v13; // rax

  v2 = UsbConfig_1(3u); /*0x10d57*/
  v3 = (__int64 *)v2; /*0x10d5c*/
  if ( !v2 ) /*0x10d62*/
  {
    DescPtrs = "DescPtrs"; /*0x10d64*/
    n2303 = 2303; /*0x10d6b*/
LABEL_3:
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", n2303, (__int64)DescPtrs); /*0x10d70*/
    return -1; /*0x10d7e*/
  }
  *(_QWORD *)(UsbHcPtr + 40) = v2; /*0x10d88*/
  v7 = (_DWORD *)UsbConfig_1(1u); /*0x10d8c*/
  if ( !v7 ) /*0x10d94*/
  {
    DescPtrs = "Ptr"; /*0x10d96*/
    n2303 = 2315; /*0x10d9d*/
    goto LABEL_3; /*0x10da2*/
  }
  *v3 = (__int64)v7; /*0x10da4*/
  *v7 = 0x4000; /*0x10daa*/
  *(_DWORD *)(*v3 + 12) = 0; /*0x10db3*/
  *(_BYTE *)(*v3 + 16) = 1; /*0x10dba*/
  UhciInsertFrameListEntry(UsbHcPtr, *v3); /*0x10dc1*/
  v8 = UsbConfig_1(6u); /*0x10dcb*/
  if ( !v8 ) /*0x10dd3*/
  {
    DescPtrs = "Ptr"; /*0x10dd5*/
    n2303 = 2331; /*0x10ddc*/
    goto LABEL_3; /*0x10de1*/
  }
  v9 = v3 + 3; /*0x10de3*/
  n4 = 4; /*0x10de7*/
  do /*0x10dfb*/
  {
    *v9 = v8; /*0x10dec*/
    v8 += 32; /*0x10def*/
    ++v9; /*0x10df3*/
    --n4; /*0x10df7*/
  }
  while ( n4 ); /*0x10dfb*/
  v3[9] = v8; /*0x10dfd*/
  v3[10] = v8 + 32; /*0x10e05*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 0x10) == 0 ) /*0x10e0d*/
  {
    v11 = UsbConfig_1(1u); /*0x10e1b*/
    if ( !v11 ) /*0x10e21*/
      Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2361, (__int64)"Ptr"); /*0x10e36*/
    v3[1] = v11; /*0x10e40*/
    v12 = UsbConfig_1(1u); /*0x10e49*/
    if ( !v12 ) /*0x10e4f*/
      Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2365, (__int64)"Ptr"); /*0x10e64*/
    v13 = (_DWORD *)v3[1]; /*0x10e69*/
    v3[2] = v12; /*0x10e6d*/
    *v13 = 544824; /*0x10e71*/
    *(_DWORD *)(v3[1] + 8) = *((_DWORD *)v3 + 4); /*0x10e7e*/
    *(_DWORD *)(v3[1] + 12) = 0; /*0x10e8a*/
    *(_DWORD *)(v3[1] + 4) = 0; /*0x10e92*/
    *(_BYTE *)(v3[1] + 16) = 8; /*0x10e9a*/
    *(_DWORD *)v3[2] = -132907008; /*0x10ea2*/
    *(_DWORD *)(v3[2] + 16) = -132907008; /*0x10ea8*/
    *(_DWORD *)(v3[2] + 4) = *((_DWORD *)v3 + 4) + 24; /*0x10eb5*/
    *(_DWORD *)(v3[2] + 12) = *((_DWORD *)v3 + 4) + 24; /*0x10ec2*/
    *(_DWORD *)(v3[2] + 8) = 0; /*0x10ed0*/
    *(_BYTE *)(v3[2] + 20) = UsbRegisterNotifyFunc((__int64)OhciStopHc); /*0x10edd*/
    *(_BYTE *)(v3[2] + 21) = 0; /*0x10ee7*/
    UhciInsertFrameListEntry(UsbHcPtr, v3[1]); /*0x10eef*/
    UsbServiceHcPolling(UsbHcPtr, 0); /*0x10ef9*/
  }
  return 0; /*0x10f0a*/
}


// Function: UsbGetInfo_1 @ 0x10f10 (0xca bytes)

__int64 __fastcall sub_10F10(_BYTE *UsbHcPtr)
{
  __int64 v3; // rdx
  __int64 v4; // r8
  __int64 v5; // r9
  unsigned __int8 v6; // di
  char i; // si

  if ( *(_BYTE *)(UsbRtDispatchTable + 29872) == 1 ) /*0x10f30*/
    return 255; /*0x10f32*/
  (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x10f48*/
  *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x10f63*/
  DebugLogPrint_14((__int64)UsbHcPtr, 0x14u, 0x80000000); /*0x10f6a*/
  v6 = 1; /*0x10f72*/
  for ( i = *UsbHcPtr | 0x80; v6 <= UsbHcPtr[32]; ++v6 ) /*0x10f79*/
  {
    LOBYTE(v4) = v6; /*0x10f7f*/
    LOBYTE(v3) = i; /*0x10f82*/
    DebugLogPrint_3((__int64)UsbHcPtr, v3, v4, v5); /*0x10f88*/
  }
  DebugLogPrint_14((__int64)UsbHcPtr, 0xCu, 64); /*0x10fa2*/
  DebugLogPrint_14((__int64)UsbHcPtr, 0x10u, 0x80000000); /*0x10fb5*/
  *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x10fc1*/
  return 0; /*0x10fd4*/
}


// Function: DebugLogPrint_9 @ 0x10fdc (0xbf bytes)

char __fastcall DebugLogPrint_9(__int64 UsbHcPtr, _DWORD *a2, __int64 a3, _BYTE *a4)
{
  unsigned int i_1; // ebx
  unsigned int i; // edi

  i_1 = 16 * *(unsigned __int16 *)(UsbRtDispatchTable + 30470); /*0x1100e*/
  for ( i = 0; !i_1 || i < i_1; ++i )
  {
    OhciResetHc(UsbHcPtr); /*0x1101e*/
    if ( !*(_BYTE *)(a3 + 21) ) /*0x11027*/
      return 0; /*0x11027*/
    if ( (*a4 & 3) == 0 )
    {
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI Abort: devinfo: %x\n", (_DWORD)a4);
      return -1; /*0x1107e*/
    }
    (*(void (__fastcall **)(__int64))(BootServices + 248))(60); /*0x1103b*/
  }
  *a2 |= 0x4000u; /*0x11045*/
  OhciResetHc(UsbHcPtr); /*0x1104c*/
  if ( *(_BYTE *)(a3 + 21) ) /*0x11051*/
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "OHCI Time-Out\n"); /*0x11062*/
    return -1; /*0x11069*/
  }
  return 0; /*0x11091*/
}


// Function: UsbConfig_14 @ 0x1109c (0xa7 bytes)

char __fastcall UsbConfig_14(__int64 UsbHcPtr)
{
  __int64 UsbRtDispatchTable; // r8
  unsigned __int8 v3; // bl
  __int64 v4; // r9
  __int64 v5; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x110a6*/
  if ( *(_BYTE *)(UsbRtDispatchTable + 30504) ) /*0x110b0*/
  {
    v3 = 0; /*0x110ba*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0x110bc*/
    {
      do /*0x11134*/
      {
        v4 = *(_QWORD *)(UsbRtDispatchTable + 27696); /*0x110c5*/
        v5 = *(_QWORD *)(v4 + 8LL * v3); /*0x110cf*/
        if ( v5 /*0x110f8*/
          && (*(_BYTE *)(v5 + 64) & 5) == 5
          && *(_BYTE *)(v5 + 1) == 48
          && ((*(unsigned __int16 *)(UsbHcPtr + 34) ^ *(unsigned __int16 *)(v5 + 34)) & 0xFFFFFFF8) == 0 )
        {
          *(_BYTE *)(UsbRtDispatchTable + 30482) = 1; /*0x110fa*/
          (*(void (**)(void))(200LL * (((*(unsigned __int8 *)(*(_QWORD *)(v4 + 8LL * v3) + 1LL) - 16) >> 4) + 4) /*0x1111c*/
                            + UsbRtDispatchTable
                            + 128))();
          UsbRtDispatchTable = UsbRtDispatchTable; /*0x11124*/
        }
        ++v3; /*0x1112b*/
      }
      while ( v3 < *(_BYTE *)(UsbRtDispatchTable + 27704) ); /*0x11134*/
    }
  }
  return 0; /*0x1113d*/
}


// Function: OhciApDispatchSub @ 0x1114c (0x68 bytes)

char __fastcall OhciApDispatchSub(__int64 a1, __int64 a2, __int64 a3)
{
  unsigned __int64 v3; // r10
  unsigned __int64 v4; // r9
  unsigned __int64 v5; // rdx
  _DWORD *v6; // rcx

  v3 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x1115d*/
  v4 = v3 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x1116b*/
  if ( !(*(_DWORD *)a3 >> 28) ) /*0x11173*/
    goto LABEL_8; /*0x11173*/
  v5 = *(_QWORD *)(a1 + 40); /*0x11175*/
  if ( v5 >= v3 && v5 + 88 <= v4 ) /*0x11185*/
  {
    v6 = *(_DWORD **)(v5 + 48); /*0x11187*/
    if ( (unsigned __int64)v6 >= v3 && (unsigned __int64)(v6 + 8) <= v4 ) /*0x11197*/
    {
      if ( v6 != (_DWORD *)a3 ) /*0x1119c*/
      {
        *v6 = *(_DWORD *)a3; /*0x1119e*/
        *(_BYTE *)(*(_QWORD *)(v5 + 48) + 21LL) = 0; /*0x111a5*/
      }
LABEL_8:
      *(_BYTE *)(a3 + 21) = 0; /*0x111a9*/
      return 0; /*0x111b0*/
    }
  }
  return -1; /*0x111b0*/
}


// Function: UsbGetInfo_10 @ 0x111b4 (0x50 bytes)

char __fastcall sub_111B4(unsigned __int8 a1)
{
  unsigned __int8 v1; // di
  char i; // al

  v1 = a1; /*0x111c3*/
  if ( !a1 ) /*0x111c8*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Ohci.c", 2763, (__int64)"Interval >= 1 && Interval <= 255"); /*0x111dd*/
  for ( i = 0; v1; v1 >>= 1 ) /*0x111e7*/
    ++i; /*0x111e9*/
  return 1 << (i - 1); /*0x111fe*/
}


// Function: HcCheckInit @ 0x11204 (0x61 bytes)

unsigned __int64 __fastcall HcCheckInit(__int64 a1)
{
  unsigned __int64 v1; // rax
  unsigned __int64 v4; // rcx
  _QWORD *v5; // r8

  v1 = 0; /*0x11204*/
  if ( !a1 ) /*0x1120c*/
    return 0x800000000000000FuLL; /*0x1120c*/
  v4 = *(unsigned __int8 *)(UsbRtDispatchTable + 27704); /*0x11220*/
  if ( *(_BYTE *)(UsbRtDispatchTable + 27704) ) /*0x11220*/
  {
    v5 = *(_QWORD **)(UsbRtDispatchTable + 27696); /*0x1122d*/
    do /*0x11243*/
    {
      if ( a1 == *v5 ) /*0x11237*/
        break; /*0x11237*/
      ++v1; /*0x11239*/
      ++v5; /*0x1123c*/
    }
    while ( v1 < v4 ); /*0x11243*/
  }
  if ( v1 == v4 ) /*0x11248*/
    return 0x800000000000000FuLL; /*0x1120e*/
  else
    return -(__int64)((*(_BYTE *)(a1 + 64) & 0xC) != 12) & 0x800000000000000FuLL; /*0x11261*/
}


// Function: UsbValidateDeviceEntry @ 0x11268 (0xa1 bytes)

unsigned __int64 __fastcall UsbValidateDeviceEntry(__int64 a1)
{
  unsigned __int64 v1; // r9
  unsigned __int64 v2; // r8
  unsigned __int64 n0x37; // rax
  __int64 v5; // rdx
  unsigned __int64 v6; // rax
  unsigned __int64 v7; // rax
  unsigned __int64 v8; // rdx

  v1 = *(_QWORD *)(UsbRtDispatchTable + 29880); /*0x11276*/
  v2 = v1 + (unsigned int)(*(_DWORD *)(UsbRtDispatchTable + 29876) << 12); /*0x11281*/
  if ( !a1 ) /*0x11287*/
    return 0x800000000000000FuLL; /*0x11287*/
  n0x37 = 0; /*0x11294*/
  v5 = UsbRtDispatchTable + 3056; /*0x11296*/
  do /*0x112b0*/
  {
    if ( a1 == v5 ) /*0x112a0*/
      break; /*0x112a0*/
    ++n0x37; /*0x112a2*/
    v5 += 448; /*0x112a5*/
  }
  while ( n0x37 < 0x37 ); /*0x112b0*/
  if ( n0x37 == 55 ) /*0x112b6*/
    return 0x800000000000000FuLL; /*0x112b6*/
  v6 = *(_QWORD *)(a1 + 32); /*0x112b8*/
  if ( v6 ) /*0x112bf*/
  {
    if ( v6 < v1 || v6 + 32 > v2 ) /*0x112cd*/
      return 0x800000000000000FuLL; /*0x112cd*/
  }
  v7 = *(_QWORD *)(a1 + 24); /*0x112cf*/
  if ( v7 ) /*0x112d6*/
  {
    if ( v7 < v1 || v7 + 32 > v2 ) /*0x112e4*/
      return 0x800000000000000FuLL; /*0x112e4*/
  }
  v8 = *(_QWORD *)(a1 + 232); /*0x112e6*/
  if ( v8 && (v8 < v1 || v8 + *(unsigned __int16 *)(a1 + 322) > v2) ) /*0x11304*/
    return 0x800000000000000FuLL; /*0x11289*/
  else
    return 0; /*0x11306*/
}


// Function: HcPciReadConfig @ 0x1130c (0x58 bytes)

__int64 __fastcall HcPciReadConfig(__int64 a1, unsigned int a2)
{
  __int64 v3; // rax

  v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(*(_QWORD *)(a1 + 104) + 48LL))(*(_QWORD *)(a1 + 104), 2, a2); /*0x11337*/
  if ( v3 >= 0 ) /*0x1133d*/
    return 0; /*0x1135a*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Read error: %r at %x\n", v3, a2);
  return 0xFFFFFFFFLL; /*0x1135e*/
}


// Function: DebugLogPrint_15 @ 0x11364 (0x4e bytes)

void __fastcall sub_11364(__int64 a1, unsigned int a2)
{
  __int64 v3; // rax

  v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(*(_QWORD *)(a1 + 104) + 56LL))(*(_QWORD *)(a1 + 104), 2, a2); /*0x1138e*/
  if ( v3 < 0 )
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Write32 error: %r at %x\n", v3, a2);
}


// Function: HcPciWriteConfig16 @ 0x113b4 (0x4f bytes)

void __fastcall HcPciWriteConfig16(__int64 UsbHcPtr, unsigned int n192, __int16 n6)
{
  __int64 v4; // rax
  __int16 n6_1; // [rsp+50h] [rbp+18h] BYREF

  n6_1 = n6; /*0x113b4*/
  v4 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int16 *))(*(_QWORD *)(UsbHcPtr + 104) + 56LL))( /*0x113df*/
         *(_QWORD *)(UsbHcPtr + 104),
         1,
         n192,
         1,
         &n6_1);
  if ( v4 < 0 )
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io Write16 error: %r at %x\n", v4, n192);
}


// Function: DebugLogPrint_13 @ 0x11404 (0x5e bytes)

__int64 __fastcall sub_11404(__int64 a1, unsigned int a2)
{
  __int64 v2; // rax
  __int64 v4; // rax
  unsigned int v6; // [rsp+48h] [rbp+10h] BYREF

  v2 = *(_QWORD *)(a1 + 104); /*0x1140a*/
  v6 = 0; /*0x11411*/
  v4 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _QWORD, __int64, unsigned int *))(v2 + 16))( /*0x11435*/
         v2,
         2,
         0,
         a2,
         1,
         &v6);
  if ( v4 >= 0 ) /*0x1143b*/
    return v6; /*0x11458*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io MMIO Read error: %r at %x\n", v4, a2);
  return 0xFFFFFFFFLL; /*0x1145c*/
}


// Function: DebugLogPrint_14 @ 0x11464 (0x53 bytes)

void __fastcall sub_11464(__int64 a1, unsigned int a2, int a3)
{
  __int64 v4; // rax
  int v5; // [rsp+50h] [rbp+18h] BYREF

  v5 = a3; /*0x11467*/
  v4 = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, _QWORD, __int64, int *))(*(_QWORD *)(a1 + 104) + 24LL))( /*0x11493*/
         *(_QWORD *)(a1 + 104),
         2,
         0,
         a2,
         1,
         &v5);
  if ( v4 < 0 )
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Pci Io MMIO Write error: %r at %x\n", v4, a2);
}


// Function: DebugLogPrint_22 @ 0x114b8 (0x43 bytes)

void __fastcall sub_114B8(__int64 a1, unsigned int a2, int a3)
{
  int v6; // eax

  if ( (unsigned __int64)a2 <= *(_QWORD *)(a1 + 24) ) /*0x114d3*/
  {
    v6 = DebugLogPrint_13(a1, a2); /*0x114d7*/
    DebugLogPrint_14(a1, a2, a3 | v6); /*0x114e6*/
  }
}


// Function: DebugLogPrint_20 @ 0x114fc (0x45 bytes)

void __fastcall sub_114FC(__int64 a1, unsigned int a2, int a3)
{
  int v6; // eax

  if ( (unsigned __int64)a2 <= *(_QWORD *)(a1 + 24) ) /*0x11517*/
  {
    v6 = DebugLogPrint_13(a1, a2); /*0x1151b*/
    DebugLogPrint_14(a1, a2, ~a3 & v6); /*0x1152c*/
  }
}


// Function: DebugLogPrint_21 @ 0x11544 (0x44 bytes)

void __fastcall sub_11544(__int64 a1, int a2, int a3)
{
  int v6; // eax

  v6 = DebugLogPrint_13(a1, a2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x11561*/
  DebugLogPrint_14(a1, a2 + *(unsigned __int8 *)(a1 + 50), a3 | v6); /*0x11583*/
}


// Function: DebugLogPrint_19 @ 0x11588 (0x46 bytes)

void __fastcall sub_11588(__int64 a1, int a2, int a3)
{
  int v6; // eax

  v6 = DebugLogPrint_13(a1, a2 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x115a5*/
  DebugLogPrint_14(a1, a2 + *(unsigned __int8 *)(a1 + 50), ~a3 & v6); /*0x115c9*/
}


// Function: ElibRead32 @ 0x115d0 (0x68 bytes)

char __fastcall ElibRead32(__int64 a1, unsigned int a2, __int64 a3)
{
  __int64 v3; // rcx
  __int64 v4; // rax
  char v6; // [rsp+48h] [rbp+10h] BYREF

  LOBYTE(a3) = 4; /*0x115d8*/
  v3 = *(_QWORD *)(a1 + 104); /*0x115ea*/
  v6 = 0; /*0x115ed*/
  v4 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, _QWORD, __int64, char *))(v3 + 32))(v3, 0, a3, a2, 1, &v6); /*0x115fb*/
  if ( v4 < 0 ) /*0x11601*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0x11612*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 801, (__int64)"!EFI_ERROR (Status)"); /*0x1162a*/
  }
  return v6; /*0x11633*/
}


// Function: ElibWrite8 @ 0x11638 (0x63 bytes)

__int64 __fastcall ElibWrite8(__int64 a1, unsigned int a2, __int64 a3)
{
  __int64 result; // rax
  char v4; // [rsp+50h] [rbp+18h] BYREF

  v4 = a3; /*0x1163b*/
  LOBYTE(a3) = 4; /*0x11647*/
  result = (*(__int64 (__fastcall **)(_QWORD, _QWORD, __int64, _QWORD, __int64, char *))(*(_QWORD *)(a1 + 104) + 40LL))( /*0x11662*/
             *(_QWORD *)(a1 + 104),
             0,
             a3,
             a2,
             1,
             &v4);
  if ( result < 0 ) /*0x11668*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x11679*/
    return Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 832, (__int64)"!EFI_ERROR (Status)"); /*0x11691*/
  }
  return result; /*0x11696*/
}


// Function: AssertCpuDeadLoop_1 @ 0x1169c (0x6d bytes)

__int64 __fastcall sub_1169C(__int64 a1, unsigned int a2, __int64 a3)
{
  __int64 v3; // rax
  __int64 v4; // rax
  unsigned __int16 v6; // [rsp+48h] [rbp+10h] BYREF

  v3 = *(_QWORD *)(a1 + 104); /*0x116a2*/
  LOBYTE(a3) = 4; /*0x116b5*/
  v6 = 0; /*0x116b8*/
  v4 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _QWORD, __int64, unsigned __int16 *))(v3 + 32))( /*0x116ca*/
         v3,
         1,
         a3,
         a2,
         1,
         &v6);
  if ( v4 < 0 ) /*0x116d0*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0x116e1*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 861, (__int64)"!EFI_ERROR (Status)"); /*0x116f9*/
  }
  return v6; /*0x11703*/
}


// Function: ElibWrite16Direct @ 0x1170c (0x65 bytes)

__int64 __fastcall ElibWrite16Direct(__int64 a1, unsigned int a2, __int64 a3)
{
  __int64 result; // rax
  __int16 v4; // [rsp+50h] [rbp+18h] BYREF

  v4 = a3; /*0x1170f*/
  LOBYTE(a3) = 4; /*0x1171c*/
  result = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, _QWORD, __int64, __int16 *))(*(_QWORD *)(a1 + 104) + 40LL))( /*0x11738*/
             *(_QWORD *)(a1 + 104),
             1,
             a3,
             a2,
             1,
             &v4);
  if ( result < 0 ) /*0x1173e*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x1174f*/
    return Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 892, (__int64)"!EFI_ERROR (Status)"); /*0x11767*/
  }
  return result; /*0x1176c*/
}


// Function: AssertCpuDeadLoop_0 @ 0x11774 (0x71 bytes)

__int64 __fastcall sub_11774(__int64 a1, __int64 n2047, __int64 a3)
{
  __int64 v3; // rax

  LOBYTE(a3) = 4; /*0x11795*/
  v3 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64))(*(_QWORD *)(a1 + 104) + 32LL))( /*0x117a8*/
         *(_QWORD *)(a1 + 104),
         2,
         a3);
  if ( v3 < 0 ) /*0x117ae*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v3); /*0x117bf*/
    Assert((__int64)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Elib.c", 921, (__int64)"!EFI_ERROR (Status)"); /*0x117d7*/
  }
  return 0; /*0x117e0*/
}


// Function: ElibReadNvStore @ 0x117e8 (0x6e bytes)

char __fastcall ElibReadNvStore(__int64 a1, unsigned __int8 a2, __int64 a3, unsigned int a4, _QWORD *a5, __int64 a6)
{
  __int64 v7; // rcx
  __int64 v8; // rbx
  _QWORD v10[3]; // [rsp+30h] [rbp-18h] BYREF
  __int64 v11; // [rsp+50h] [rbp+8h] BYREF

  v7 = *(_QWORD *)(a1 + 104); /*0x11804*/
  v8 = a4; /*0x11807*/
  v11 = a4; /*0x1181c*/
  if ( (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int64 *, _QWORD *, __int64))(v7 + 72))( /*0x1182e*/
         v7,
         a2 >> 7,
         a3,
         &v11,
         v10,
         a6) >= 0
    && v11 == v8 )
  {
    *a5 = v10[0]; /*0x1183a*/
    return 0; /*0x1183d*/
  }
  else
  {
    *a5 = a3; /*0x11846*/
    return -1; /*0x11849*/
  }
}


// Function: DebugBeep @ 0x11858 (0x57 bytes)

unsigned __int8 __fastcall DebugBeep(unsigned __int8 a1, unsigned __int16 a2)
{
  unsigned __int8 UsbRtDispatchTable; // al
  unsigned __int8 v3; // al
  unsigned __int8 v4; // bl

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x1185e*/
  if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 1) != 0 ) /*0x1186d*/
  {
    __outbyte(0x43u, 0xB6u); /*0x11876*/
    __outbyte(0x42u, a1); /*0x1187e*/
    __outbyte(0x42u, a1); /*0x1187f*/
    v3 = __inbyte(0x61u); /*0x11885*/
    v4 = v3; /*0x11886*/
    __outbyte(0x61u, v3 | 3); /*0x1188a*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(15LL * a2); /*0x1189a*/
    __outbyte(0x61u, v4); /*0x118a8*/
    return v4; /*0x118a6*/
  }
  return UsbRtDispatchTable; /*0x118a9*/
}


// Function: ElibCheckDevReady @ 0x118b0 (0x34 bytes)

char (__fastcall *__fastcall ElibCheckDevReady(__int64 a1))(__int64)
{
  *(_BYTE *)a1 = 3; /*0x118b7*/
  *(_QWORD *)(a1 + 8) = HubNullFunc1; /*0x118ba*/
  *(_QWORD *)(a1 + 16) = HubNullFunc2; /*0x118c5*/
  *(_QWORD *)(a1 + 24) = HubGetDescriptor; /*0x118d0*/
  *(_QWORD *)(a1 + 32) = HubResetPort; /*0x118db*/
  *(_BYTE *)(a1 + 3) = 0; /*0x118df*/
  return HubResetPort; /*0x118e3*/
}


// Function: HubGetDescriptor @ 0x118e4 (0x34d bytes)

__int64 __fastcall HubGetDescriptor(unsigned __int8 *UsbHcPtr, __int64 dst, __int64 a3, unsigned __int16 a4)
{
  __int64 UsbRtDispatchTable; // r15
  __int64 v6; // rdi
  char v7; // r14
  unsigned __int8 *v10; // r8
  unsigned __int8 *v11; // rdx
  unsigned __int8 v12; // r9
  unsigned __int64 i_1; // rsi
  unsigned __int8 *i; // rcx
  unsigned __int8 n4; // al
  unsigned __int8 v16; // r8
  __int64 v17; // rax
  char n4_1; // al
  __int64 v19; // rax
  unsigned __int64 v20; // rsi
  __int64 n256; // r8
  unsigned __int8 v23; // r8
  unsigned __int8 v24; // di
  char n4_2; // al
  unsigned __int8 v26; // cl
  __int64 v27; // rcx
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8
  unsigned __int8 v30; // di
  unsigned __int64 v31; // [rsp+60h] [rbp+8h]

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x118fa*/
  v6 = a4; /*0x11907*/
  *(_BYTE *)(dst + 4) = 3; /*0x11912*/
  v7 = 0; /*0x11916*/
  *(_BYTE *)(dst + 21) = UsbRegisterNotifyFunc((__int64)DebugLogPrint_8); /*0x11924*/
  v10 = (unsigned __int8 *)(a3 + v6); /*0x11927*/
  if ( (*(_DWORD *)dst & 0x200) != 0 ) /*0x11932*/
  {
    while ( (unsigned __int16)v6 < *(_WORD *)(a3 + 2) ) /*0x11938*/
    {
      v11 = (unsigned __int8 *)(a3 + (unsigned __int16)v6); /*0x1193d*/
      v12 = *v11; /*0x11940*/
      if ( !*v11 || (unsigned __int16)v6 + (unsigned int)v12 > *(unsigned __int16 *)(a3 + 2) ) /*0x11957*/
        break; /*0x11957*/
      if ( v11[1] == 4 && v11[3] && v11[5] == 9 && !v11[6] && v11[7] == 2 ) /*0x11975*/
      {
        v10 = (unsigned __int8 *)(a3 + (unsigned __int16)v6); /*0x11983*/
        *(_BYTE *)(dst + 73) = v11[7]; /*0x11986*/
        *(_BYTE *)(dst + 20) = v11[3]; /*0x1198c*/
        break; /*0x1198c*/
      }
      LOWORD(v6) = v12 + (_WORD)v6; /*0x1197b*/
    }
  }
  i_1 = *(unsigned __int16 *)(a3 + 2) + a3; /*0x1198f*/
  for ( i = &v10[*v10]; ; i += *i ) /*0x1199a*/
  {
    n4 = i[1]; /*0x1199d*/
    if ( n4 == 4 || (unsigned __int64)i >= i_1 || !*i ) /*0x119a9*/
      break; /*0x119a9*/
    if ( n4 == 5 && (i[3] & 3) == 3 && (i[2] & 0x80u) != 0 ) /*0x119bf*/
    {
      *(_BYTE *)(dst + 64) = i[2]; /*0x119cc*/
      *(_WORD *)(dst + 62) = *((_WORD *)i + 2); /*0x119d3*/
      *(_BYTE *)(dst + 320) = i[6]; /*0x119da*/
      break; /*0x119da*/
    }
  }
  if ( (UsbHcPtr[64] & 0x40) != 0 && *(char *)(dst + 12) < 0 ) /*0x119ef*/
    *(_WORD *)(dst + 108) |= 0x800u; /*0x119f1*/
  v16 = *(_BYTE *)(dst + 12); /*0x119f5*/
  *(_BYTE *)(dst + 224) = 0; /*0x119fe*/
  v17 = FwVolDriverEntry(16, 0, v16, 0); /*0x11a07*/
  if ( v17 ) /*0x11a0f*/
    *(_BYTE *)(dst + 224) = *(_BYTE *)(v17 + 224) + 1; /*0x11a19*/
  n4_1 = *(_BYTE *)(dst + 14); /*0x11a1f*/
  if ( n4_1 == 4 || n4_1 == 64 ) /*0x11a28*/
  {
    HIWORD(v31) = 0; /*0x11a2f*/
    LOWORD(v31) = 3104; /*0x11a34*/
    *(_DWORD *)((char *)&v31 + 2) = *(unsigned __int8 *)(dst + 224); /*0x11a49*/
    SataDriverEntry((__int64)UsbHcPtr, dst, v31, 50, 0); /*0x11a5b*/
  }
  v19 = UsbConfig_1(0x20u); /*0x11a67*/
  v20 = v19; /*0x11a6c*/
  if ( !v19 ) /*0x11a72*/
    return 0; /*0x11a72*/
  if ( (unsigned __int8)UsbGetInfo_11((__int64)UsbHcPtr, dst, v19) ) /*0x11a84*/
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Failed to get the hub descriptor\n"); /*0x11a98*/
    FwVolConfig(v20, 0x20u); /*0x11aa2*/
    return 0; /*0x11a76*/
  }
  *(_BYTE *)(dst + 40) = *(_BYTE *)(v20 + 2); /*0x11ab3*/
  *(_BYTE *)(dst + 41) = *(_BYTE *)(v20 + 5); /*0x11ab9*/
  DebugPrint(
    0xFFFFFFFFFFFFFFFFuLL,
    "Usb Hub:: number of downstream port: %d, PowerOnDelay %d\n",
    *(unsigned __int8 *)(v20 + 2),
    *(unsigned __int8 *)(v20 + 5));
  if ( (*(_DWORD *)dst & 0x200) != 0 ) /*0x11ad1*/
  {
    v23 = *(_BYTE *)(dst + 20); /*0x11ad3*/
    if ( v23 ) /*0x11ada*/
      DebugLogPrint_12(UsbHcPtr, (_DWORD *)dst, v23); /*0x11ae2*/
  }
  v24 = 1; /*0x11ae7*/
  if ( *(_BYTE *)(dst + 40) ) /*0x11aea*/
  {
    do /*0x11b5f*/
    {
      if ( (*(_WORD *)(dst + 108) & 0x800) == 0 || v24 != UsbHcPtr[69] ) /*0x11b09*/
      {
        if ( (n4_2 = *(_BYTE *)(dst + 14), n4_2 != 4) && n4_2 != 64 /*0x11b3a*/
          || (HcMemoryRead((__int64)UsbHcPtr, dst, v24, UsbRtDispatchTable + 29904),
              (*(_WORD *)(UsbRtDispatchTable + 29904) & 0x200) == 0) )
        {
          LOBYTE(n256) = v24; /*0x11b42*/
          UsbGetInfo_14(UsbHcPtr, dst, n256, 8); /*0x11b4b*/
          v7 = 1; /*0x11b50*/
        }
      }
      ++v24; /*0x11b58*/
    }
    while ( v24 <= *(_BYTE *)(dst + 40) ); /*0x11b5f*/
    if ( v7 && (*(_WORD *)(dst + 108) & 0x800) == 0 ) /*0x11b6d*/
    {
      v26 = *(_BYTE *)(UsbRtDispatchTable + 30501); /*0x11b76*/
      if ( v26 ) /*0x11b7e*/
        v27 = 1000000LL * v26; /*0x11b90*/
      else
        v27 = 2000LL * *(unsigned __int8 *)(dst + 41); /*0x11b84*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(v27); /*0x11b9e*/
    }
  }
  *(_QWORD *)(dst + 24) = 0; /*0x11ba9*/
  *(_QWORD *)(dst + 32) = 0; /*0x11bb0*/
  FwVolConfig(v20, 0x20u); /*0x11bb4*/
  v30 = 1; /*0x11bb9*/
  for ( *(_WORD *)(dst + 324) = 0; v30 <= *(_BYTE *)(dst + 40); ++v30 ) /*0x11bc4*/
  {
    LOBYTE(PortNum) = *(_BYTE *)(dst + 10); /*0x11bca*/
    LOBYTE(EndpointAddr) = v30; /*0x11bcd*/
    DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0x11bd3*/
  }
  *(_WORD *)(dst + 322) = *(_WORD *)(dst + 62); /*0x11be8*/
  (*(void (__fastcall **)(unsigned __int8 *, __int64))(200LL * (((UsbHcPtr[1] - 16) >> 4) + 4) + UsbRtDispatchTable + 232))( /*0x11c0f*/
    UsbHcPtr,
    dst);
  return dst; /*0x11c24*/
}


// Function: HubResetPort @ 0x11c34 (0xab bytes)

char __fastcall HubResetPort(__int64 a1)
{
  __int64 v2; // rcx
  unsigned __int8 TmpR8; // bl
  int n2047_1; // eax
  __int64 n2047; // rdx
  __int64 i; // rsi

  v2 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(a1 + 11) - 1)); /*0x11c5d*/
  (*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(v2 + 1) - 16) >> 4) + 4) /*0x11c7a*/
                                           + UsbRtDispatchTable
                                           + 224))(
    v2,
    a1);
  TmpR8 = 1; /*0x11c86*/
  n2047_1 = *(unsigned __int8 *)(a1 + 11) - 1; /*0x11c88*/
  *(_BYTE *)(a1 + 64) = 0; /*0x11c8a*/
  n2047 = n2047_1; /*0x11c8e*/
  for ( i = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * n2047_1); TmpR8 <= *(_BYTE *)(a1 + 40); ++TmpR8 ) /*0x11ca3*/
  {
    if ( (*(_WORD *)(a1 + 108) & 0x800) == 0 || TmpR8 != *(_BYTE *)(i + 69) ) /*0x11cb6*/
    {
      LOBYTE(n2047) = *(_BYTE *)(a1 + 10); /*0x11cb8*/
      DebugLogPrint_4(i, n2047, TmpR8); /*0x11cc1*/
    }
  }
  return 0; /*0x11cd9*/
}


// Function: HubNullFunc2 @ 0x11cec (0x11 bytes)

__int64 __fastcall HubNullFunc2(__int64 a1, char n9)
{
  __int64 n255; // rax

  n255 = 255; /*0x11cef*/
  if ( n9 == 9 ) /*0x11cf9*/
    return 3; /*0x11cf9*/
  return n255; /*0x11cfc*/
}


// Function: DebugLogPrint_8 @ 0x12320 (0xe3 bytes)

char __fastcall DebugLogPrint_8(__int64 UsbHcPtr, __int64 a2, __int64 a3, _WORD *a4)
{
  char v7; // si
  __int64 EndpointAddr; // r8
  __int64 UsbRtDispatchTable; // rdx
  unsigned __int8 i; // bl

  v7 = 0; /*0x12354*/
  DebugPrint( /*0x1235f*/
    0xFFFFFFFFFFFFFFFFuLL,
    "USBHub_ProcessHubData, gUsbData->bEnumFlag = %d\n",
    *(unsigned __int8 *)(UsbRtDispatchTable + 29872));
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x12364*/
  if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x12372*/
  {
    for ( i = 1; i <= *(_BYTE *)(a2 + 40); ++i ) /*0x12376*/
    {
      if ( ((unsigned __int16)(1 << i) & *a4) != 0 ) /*0x12389*/
      {
        if ( !v7 && ((unsigned __int16)~*(_WORD *)(a2 + 324) & (unsigned __int16)(1 << i)) != 0 ) /*0x1239e*/
        {
          (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x123ac*/
          UsbRtDispatchTable = UsbRtDispatchTable; /*0x123b2*/
          v7 = 1; /*0x123b9*/
        }
        *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x123bc*/
        LOBYTE(EndpointAddr) = i; /*0x123c3*/
        LOBYTE(UsbRtDispatchTable) = *(_BYTE *)(a2 + 10); /*0x123c6*/
        DebugLogPrint_3(UsbHcPtr, UsbRtDispatchTable, EndpointAddr); /*0x123cc*/
        UsbRtDispatchTable = UsbRtDispatchTable; /*0x123d1*/
        *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x123d8*/
      }
    }
  }
  return 0; /*0x123fc*/
}


// Function: DebugLogPrint_2 @ 0x12404 (0x1f7 bytes)

char __fastcall DebugLogPrint_2(_BYTE *UsbHcPtr, __int64 dst, __int64 n256, char a4)
{
  __int64 UsbRtDispatchTable; // rbp
  unsigned __int8 n256_1; // di
  char n4; // al
  int v9; // esi
  int v11; // esi
  char n4_1; // al
  __int64 n20000; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x1241d*/
  n256_1 = n256; /*0x12424*/
  if ( a4 )
  {
    n4 = *(_BYTE *)(dst + 14); /*0x12436*/
    if ( n4 == 4 || n4 == 64 )
    {
      if ( !(unsigned __int8)UsbGetInfo_14(UsbHcPtr, dst, n256, 28) )
      {
        v9 = 0; /*0x12457*/
        while ( 1 )
        {
          (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x12465*/
          if ( (unsigned __int8)HcMemoryRead((__int64)UsbHcPtr, dst, n256_1, UsbRtDispatchTable + 29904) ) /*0x12482*/
            break; /*0x12482*/
          if ( (*(_BYTE *)(UsbRtDispatchTable + 29906) & 0x20) != 0 ) /*0x12492*/
            goto LABEL_12; /*0x12492*/
          if ( (unsigned int)++v9 >= 0x32 )
          {
            if ( (*(_BYTE *)(UsbRtDispatchTable + 29906) & 0x20) == 0 )
            {
              DebugPrint(
                0xFFFFFFFFFFFFFFFFuLL,
                "Usb super speed hub port[%d] status: %08x: warm reset port is failed\n",
                n256_1,
                *(_DWORD *)(UsbRtDispatchTable + 29904));
              return -1; /*0x124c1*/
            }
LABEL_12:
            if ( !(unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 29) /*0x12511*/
              && !(unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 20) )
            {
              return 0; /*0x12511*/
            }
            return -1; /*0x12511*/
          }
        }
      }
      return -1; /*0x12489*/
    }
  }
  if ( !(unsigned __int8)UsbGetInfo_14(UsbHcPtr, dst, n256, 4) ) /*0x12522*/
  {
    (*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0x12537*/
    v11 = 0; /*0x1253d*/
    while ( 1 ) /*0x1253f*/
    {
      if ( (unsigned __int8)HcMemoryRead((__int64)UsbHcPtr, dst, n256_1, UsbRtDispatchTable + 29904) ) /*0x12556*/
        return -1; /*0x1255d*/
      if ( (*(_WORD *)(UsbRtDispatchTable + 29906) & 0x10) != 0 ) /*0x12573*/
        break; /*0x12573*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(5000); /*0x12581*/
      if ( (unsigned int)++v11 >= 0xA ) /*0x1258c*/
        return -1; /*0x1258c*/
    }
    if ( (unsigned __int8)HcMemoryWrite((__int64)UsbHcPtr, dst, n256_1, 20) ) /*0x125aa*/
      return -1; /*0x125b1*/
    n4_1 = *(_BYTE *)(dst + 14); /*0x125b7*/
    if ( n4_1 != 4 && n4_1 != 64 ) /*0x125c0*/
    {
      if ( (*(_WORD *)(dst + 108) & 0x800) == 0 ) /*0x125cb*/
      {
        n20000 = 20000; /*0x125cd*/
LABEL_28:
        (*(void (__fastcall **)(__int64))(BootServices + 248))(n20000); /*0x125e7*/
        return 0; /*0x125ee*/
      }
      if ( (*(_WORD *)(UsbRtDispatchTable + 29904) & 0x200) != 0 ) /*0x125e0*/
      {
        n20000 = 1000; /*0x125e2*/
        goto LABEL_28; /*0x125e2*/
      }
    }
    return 0; /*0x125f4*/
  }
  return -1; /*0x124dc*/
}


// Function: HcMemoryWrite @ 0x125fc (0x3c bytes)

__int64 __fastcall HcMemoryWrite(__int64 a1, __int64 a2, unsigned __int8 a3, __int16 a4)
{
  unsigned __int64 v5; // [rsp+30h] [rbp-18h]

  WORD1(v5) = a4; /*0x12605*/
  LOWORD(v5) = 291; /*0x1260b*/
  HIDWORD(v5) = a3; /*0x12614*/
  return SataDriverEntry(a1, a2, v5, 50, 0); /*0x12633*/
}


// Function: UsbGetInfo_11 @ 0x12638 (0x4f bytes)

__int64 __fastcall UsbGetInfo_11(__int64 UsbHcPtr, __int64 dst, __int64 a3)
{
  char n4; // al
  bool v4; // zf
  __int16 n10752; // ax
  unsigned __int64 v7; // [rsp+48h] [rbp+10h]

  HIDWORD(v7) = 0x200000; /*0x12641*/
  LOWORD(v7) = 1696; /*0x12649*/
  n4 = *(_BYTE *)(dst + 14); /*0x12653*/
  if ( n4 == 4 || (v4 = n4 == 64, n10752 = 10496, v4) ) /*0x12661*/
    n10752 = 10752; /*0x12663*/
  WORD1(v7) = n10752; /*0x12668*/
  return SataDriverEntry(UsbHcPtr, dst, v7, 150, a3); /*0x12682*/
}


// Function: HcMemoryRead @ 0x12688 (0x3c bytes)

__int64 __fastcall HcMemoryRead(__int64 a1, __int64 a2, unsigned __int8 a3, __int64 a4)
{
  unsigned __int64 v5; // [rsp+30h] [rbp-18h]

  HIDWORD(v5) = a3 | 0x40000; /*0x12693*/
  LODWORD(v5) = 163; /*0x126a3*/
  return SataDriverEntry(a1, a2, v5, 150, a4); /*0x126bf*/
}


// Function: UsbGetInfo_14 @ 0x126c4 (0x3c bytes)

__int64 __fastcall UsbGetInfo_14(_BYTE *UsbHcPtr, __int64 dst, __int64 n256, __int16 n8)
{
  unsigned __int64 v5; // [rsp+30h] [rbp-18h]

  WORD1(v5) = n8; /*0x126cd*/
  LOWORD(v5) = 803; /*0x126d3*/
  HIDWORD(v5) = (unsigned __int8)n256; /*0x126dc*/
  return SataDriverEntry((__int64)UsbHcPtr, dst, v5, 100, 0); /*0x126fb*/
}


// Function: XhciDriverEntry @ 0x12700 (0x5b5 bytes)

char __fastcall XhciDriverEntry(__int64 UsbHcPtr)
{
  __int64 v1; // rbp
  unsigned int n0x64; // r14d
  char v3; // r12
  unsigned int n787248; // eax
  unsigned int Config; // eax
  unsigned __int64 Config_1; // rbx
  unsigned __int64 v9; // rbx
  unsigned __int64 v10; // rdx
  unsigned int i; // ebx
  unsigned int j; // ebx
  unsigned __int8 k; // bl
  __int64 v14; // rbx
  char v15; // al
  int v16; // edx
  char v17; // di
  unsigned int m; // ebx
  __int64 v19; // rcx
  __int64 v20; // r8
  __int64 v21; // rdx
  __int64 TmpRdx; // rdx
  __int64 v23; // rbx
  __int64 v24; // rdx
  __int64 v25; // r8
  __int64 v26; // rdx
  __int64 v27; // rax
  __int64 v28; // rdi
  __int64 v29; // rbx
  __int64 v30; // rdx
  __int64 v31; // rdx
  unsigned __int8 v32; // di
  int v33; // ebx
  unsigned int v34; // edx
  int v35; // eax

  v1 = *(_QWORD *)(UsbHcPtr + 72); /*0x1271c*/
  n0x64 = 0; /*0x12720*/
  v3 = 0; /*0x12723*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || !v1 ... [8386 chars total]


// Function: XhciReset @ 0x12cb8 (0x193 bytes)

char __fastcall XhciReset(__int64 UsbHcPtr)
{
  __int64 v1; // rdi
  __int64 TmpRdx; // rdx
  __int64 TmpR8; // r8
  unsigned __int8 v6; // si
  __int64 v7; // rdx
  unsigned int i; // esi
  unsigned int v9; // edx
  char n24; // [rsp+50h] [rbp+8h] BYREF

  v1 = *(_QWORD *)(UsbHcPtr + 72); /*0x12cc7*/
  n24 = 0; /*0x12cce*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x12ce8*/
    return -1; /*0x12cdd*/
  v6 = 1; /*0x12cf1*/
  for ( *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; v6 <= *(_BYTE *)(v1 + 15); ++v6 ) /*0x12cfb*/
  {
    LOBYTE(TmpR8) = v6; /*0x12d03*/
    LOBYTE(TmpRdx) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12d06*/
    UsbGetInfo_13((_BYTE *)UsbHcPtr, TmpRdx, TmpR8); /*0x12d0c*/
  }
  if ( (UsbGetInfo_8(UsbHcPtr, TmpRdx, (unsigned int)*(_QWORD *)(v1 + 40) + 24) & 8) != 0 ) /*0x12d31*/
  {
    DebugLogPrint_18(UsbHcPtr, v7, *(_QWORD *)(v1 + 40) + 24, 2); /*0x12d41*/
    n24 = 24; /*0x12d5d*/
    DebugLogPrint_1(UsbHcPtr, 0, 33, 0, 0, &n24, 0x32u, 0); /*0x12d74*/
  }
  XhciDriverInit(UsbHcPtr); /*0x12d7c*/
  *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x12d91*/
  DebugLogPrint_19(UsbHcPtr, 0, 4); /*0x12d98*/
  DebugLogPrint_20(UsbHcPtr, *(_DWORD *)(v1 + 48) - *(_DWORD *)(UsbHcPtr + 16) + 32, 2); /*0x12dac*/
  DebugLogPrint_19(UsbHcPtr, 0, 1); /*0x12dba*/
  for ( i = 0; i < 0x140; ++i ) /*0x12dbf*/
  {
    if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x12dd2*/
      break; /*0x12dd2*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x12de0*/
  }
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) == 0 ) /*0x12e01*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 473, (__int64)"HcReadOpReg(HcStruc, 0x0004) & 0x00000001"); /*0x12e16*/
  v9 = *(_DWORD *)(v1 + 56); /*0x12e1b*/
  if ( v9 ) /*0x12e20*/
    DebugLogPrint_20(UsbHcPtr, v9, 0x10000); /*0x12e2b*/
  *(_DWORD *)(UsbHcPtr + 64) &= ~1u; /*0x12e30*/
  UsbFindActiveHc(); /*0x12e34*/
  return 0; /*0x12e45*/
}


// Function: XhciStart @ 0x12e4c (0x1a0 bytes)

char __fastcall XhciStart(__int64 UsbHcPtr)
{
  __int64 v3; // rdi
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8
  __int64 UsbRtDispatchTable; // rax
  unsigned __int8 v7; // si
  unsigned __int8 v8; // bp
  char v9; // si
  unsigned __int8 v10; // si
  __int64 v11; // r15
  unsigned __int8 v12; // bp

  if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x12e75*/
  {
    if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x12ea3*/
      || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
      || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
    {
      return -1; /*0x12e87*/
    }
    v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x12ea5*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI_EnumeratePorts..\n"); /*0x12eb4*/
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x12eb9*/
    *(_BYTE *)(UsbRtDispatchTable + 30480) = 1; /*0x12ec0*/
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x12ec7*/
    if ( *(_BYTE *)(v3 + 69) ) /*0x12ece*/
    {
      v7 = 0; /*0x12ed5*/
      do /*0x12ef7*/
      {
        LOBYTE(EndpointAddr) = v7 + *(_BYTE *)(v3 + 68); /*0x12ee5*/
        LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12ee8*/
        DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12eeb*/
        ++v7; /*0x12ef0*/
      }
      while ( v7 < *(_BYTE *)(v3 + 69) ); /*0x12ef7*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x12ef9*/
    }
    if ( *(_BYTE *)(v3 + 81) ) /*0x12f00*/
    {
      v8 = 0; /*0x12f07*/
      do /*0x12f53*/
      {
        v9 = v8 + *(_BYTE *)(v3 + 80); /*0x12f17*/
        if ( *(_WORD *)(v3 + 100) == 4358 && *(_WORD *)(v3 + 102) == 13362 ) /*0x12f29*/
          UsbConfig_3(UsbHcPtr, v3, v8 + *(_BYTE *)(v3 + 80), 1); /*0x12f37*/
        LOBYTE(EndpointAddr) = v9; /*0x12f3e*/
        LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12f41*/
        DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12f47*/
        ++v8; /*0x12f4c*/
      }
      while ( v8 < *(_BYTE *)(v3 + 81) ); /*0x12f53*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x12f55*/
    }
    if ( *(_BYTE *)(v3 + 488) ) /*0x12f5c*/
    {
      v10 = 0; /*0x12f66*/
      do /*0x12fb2*/
      {
        v11 = *(_QWORD *)(v3 + 88); /*0x12f6d*/
        if ( *(_BYTE *)(v11 + 12LL * v10 + 9) ) /*0x12f79*/
        {
          v12 = 0; /*0x12f82*/
          do /*0x12fa6*/
          {
            LOBYTE(EndpointAddr) = v12 + *(_BYTE *)(v11 + 12LL * v10 + 8); /*0x12f93*/
            LOBYTE(PortNum) = *(_BYTE *)UsbHcPtr | 0x80; /*0x12f96*/
            DebugLogPrint_3(UsbHcPtr, PortNum, EndpointAddr); /*0x12f99*/
            ++v12; /*0x12f9e*/
          }
          while ( v12 < *(_BYTE *)(v11 + 12LL * v10 + 9) ); /*0x12fa6*/
        }
        ++v10; /*0x12fa8*/
      }
      while ( v10 < *(_BYTE *)(v3 + 488) ); /*0x12fb2*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x12fb4*/
    }
    *(_BYTE *)(UsbRtDispatchTable + 30480) = 0; /*0x12fbe*/
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x12fc5*/
    XhciDriverInit(UsbHcPtr); /*0x12fcc*/
  }
  return 0; /*0x12fe2*/
}


// Function: XhciAllocTrbRing @ 0x12fec (0x40 bytes)

__int64 __fastcall XhciAllocTrbRing(__int64 *a1)
{
  __int64 v1; // rdx

  v1 = *(__int64 *)((char *)a1 + 20); /*0x12fec*/
  if ( (*(_DWORD *)(v1 + 12) & 0xFC00) == 0x1800 ) /*0x12ffd*/
  {
    *(_DWORD *)(v1 + 12) ^= (*(_DWORD *)(v1 + 12) ^ *((unsigned __int8 *)a1 + 28)) & 1; /*0x13009*/
    v1 = *a1; /*0x1300c*/
    *((_BYTE *)a1 + 28) ^= 1u; /*0x1300f*/
    *(__int64 *)((char *)a1 + 20) = v1; /*0x13013*/
  }
  *(_DWORD *)(v1 + 12) &= 1u; /*0x13017*/
  *(_QWORD *)v1 = 0; /*0x1301d*/
  *(_DWORD *)(v1 + 8) = 0; /*0x13020*/
  *(__int64 *)((char *)a1 + 20) += 16; /*0x13026*/
  return v1; /*0x1302b*/
}


// Function: DebugLogPrint_1 @ 0x1302c (0x200 bytes)

char __fastcall DebugLogPrint_1(
        __int64 UsbHcPtr,
        __int64 *a2,
        int n33,
        __int64 a4,
        char i,
        _BYTE *a6,
        unsigned __int16 a7,
        _BYTE *a8)
{
  char v8; // r11
  __int64 v9; // rsi
  unsigned int v12; // r15d
  char v14; // bl
  unsigned int v15; // ebp
  __int64 v16; // r10
  __int64 v17; // rdx
  __int64 j; // r8
  char v19; // al
  __int64 *k; // rcx
  int v21; // eax
  char n13; // al
  char v24; // [rsp+68h] [rbp+20h]

  v24 = a4; /*0x1303b*/
  v8 = a4; /*0x13054*/
  v9 = *(_QWORD *)(UsbHcPtr + 72); /*0x13057*/
  v12 = 100 * a7; /*0x13066*/
  v14 = 0; /*0x1306d*/
  v15 = 0; /*0x1306f*/
LABEL_2:
  if ( v12 && v15 >= v12 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: execution time-out.\n");
    v14 = -1; /*0x1319c*/
    *a6 = -1; /*0x1319e*/
    goto LABEL_38; /*0x131a0*/
  }
  v16 = *(_QWORD *)(v9 + 180); /*0x1307f*/
  LOBYTE(a4) = *(_BYTE *)(v9 + 188); /*0x13086*/
  v17 = v16; /*0x1308d*/
  for ( j = *(unsigned int *)(v16 + 12); ; j = *(unsigned int *)(v17 + 12) )
  {
    if ( (j & 1) != (_BYTE)a4 ) /*0x1313b*/
      goto LABEL_26; /*0x1313b*/
    if ( (unsigned __int16)j >> 10 != n33 ) /*0x130a5*/
      goto LABEL_18; /*0x130a5*/
    if ( n33 != 33 ) /*0x130ab*/
      break; /*0x130ab*/
    if ( a2 ) /*0x130b0*/
    {
      if ( *(__int64 **)v17 == a2 ) /*0x130b5*/
      {
        if ( a8 ) /*0x130c2*/
          *a8 = *(_BYTE *)(v17 + 15); /*0x130c7*/
        v19 = *(_BYTE *)(v17 + 11); /*0x130c9*/
        *a6 = v19; /*0x130ce*/
        v14 = -(v19 != 1); /*0x130d6*/
        goto LABEL_38; /*0x130d8*/
      }
    }
    else if ( *a6 && *(_BYTE *)(v17 + 11) == *a6 ) /*0x130e6*/
    {
      goto LABEL_38; /*0x130e6*/
    }
LABEL_18:
    if ( v17 == *(_QWORD *)(v9 + 172) ) /*0x13116*/
    {
      v17 = *(_QWORD *)(v9 + 160); /*0x13118*/
      LOBYTE(a4) = a4 ^ 1; /*0x1311f*/
    }
    else
    {
      v17 += 16; /*0x13125*/
    }
    if ( v17 == v16 )
    {
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Event Ring is full...\n", j, a4);
      Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 785, (__int64)"0"); /*0x13166*/
      *a6 = 21; /*0x1316b*/
LABEL_26:
      (*(void (__fastcall **)(__int64, __int64))(BootServices + 248))(10, v17); /*0x1316e*/
      v8 = v24; /*0x13180*/
      ++v15; /*0x13185*/
      goto LABEL_2; /*0x13187*/
    }
  }
  if ( n33 != 32 ) /*0x130f2*/
    goto LABEL_18; /*0x130f2*/
  if ( *(_BYTE *)(v17 + 15) != v8 ) /*0x130f8*/
    goto LABEL_18; /*0x130f8*/
  j = WORD1(j) & 0x1F; /*0x13102*/
  if ( (_BYTE)j != i ) /*0x13109*/
    goto LABEL_18; /*0x13109*/
  if ( a8 ) /*0x131ad*/
  {
    *(_DWORD *)a8 = *(_DWORD *)(v17 + 8) & 0xFFFFFF; /*0x131b7*/
    if ( *(_BYTE *)(v17 + 11) == 13 ) /*0x131be*/
    {
      for ( k = *(__int64 **)v17; ; *(_DWORD *)a8 += k[1] & 0x1FFFF ) /*0x131c0*/
      {
        *((_DWORD *)k + 3) &= 0xFFFFFFDB; /*0x131ec*/
        if ( (*((_BYTE *)k + 12) & 0x10) == 0 ) /*0x131f4*/
          break; /*0x131f4*/
        v21 = *((_DWORD *)k + 7); /*0x131cb*/
        k += 2; /*0x131ce*/
        if ( (v21 & 0xFC00) == 0x1800 ) /*0x131dc*/
          k = (__int64 *)*k; /*0x131de*/
      }
    }
  }
  n13 = *(_BYTE *)(v17 + 11); /*0x131f6*/
  *a6 = n13; /*0x131f9*/
  if ( n13 != 1 && n13 != 13 ) /*0x13201*/
    v14 = -1; /*0x13203*/
LABEL_38:
  XhciDriverInit(UsbHcPtr); /*0x13205*/
  return v14; /*0x1321e*/
}


// Function: DebugLogPrint_0 @ 0x1322c (0x2b3 bytes)

char __fastcall DebugLogPrint_0(__int64 UsbHcPtr, int n11, unsigned __int8 *a3)
{
  __int64 v3; // rbp
  __int64 v7; // rax
  char *v8; // r8
  __int64 v9; // rdi
  unsigned __int16 n50; // r15
  int v12; // ecx
  char v13; // al
  int v14; // eax
  __int64 v15; // rdx
  int v16; // ebx
  int v17; // ebx
  int v18; // ebx
  int v19; // ebx
  int v20; // ebx
  int v21; // ebx
  unsigned __int8 v22; // bl
  unsigned __int8 n25; // [rsp+70h] [rbp+8h] BYREF
  unsigned __int8 v24; // [rsp+88h] [rbp+20h] BYREF

  v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x13242*/
  n25 = 0; /*0x1324c*/
  v7 = XhciAllocTrbRing((__int64 *)(v3 + 128)); /*0x1325a*/
  v9 = v7; /*0x13265*/
  n50 = 50; /*0x13268*/
  if ( !v7 ) /*0x1326f*/
    return -1; /*0x1326f*/
  *(_DWORD *)(v7 + 12) &= 0xFFFF03FF; /*0x13278*/
  *(_DWORD *)(v7 + 12) |= (n11 & 0x3F) << 10; /*0x13287*/
  v12 = *(_DWORD *)(v7 + 12); /*0x1328a*/
  if ( n11 != 10 ) /*0x13290*/
  {
    if ( n11 == 11 ) /*0x13299*/
    {
      n50 = 2000; /*0x13312*/
      *(_QWORD *)v7 = *(_QWORD *)(v3 + 216); /*0x13318*/
      *(_BYTE *)(v7 + 15) = *v8; /*0x1331e*/
      v14 = (*(_DWORD *)(v7 + 12) ^ ((unsigned __int8)v8[1] << 9)) & 0x200; /*0x1332c*/
    }
    else
    {
      if ( n11 <= 11 ) /*0x1329b*/
        goto LABEL_18; /*0x1329b*/
      if ( n11 <= 13 ) /*0x132a4*/
      {
        *(_QWORD *)v7 = *(_QWORD *)(v3 + 216); /*0x132fb*/
        *(_BYTE *)(v7 + 15) = *v8; /*0x13301*/
        *(_DWORD *)(v7 + 12) &= ~0x200u; /*0x13304*/
        goto LABEL_18; /*0x13309*/
      }
      switch ( n11 ) /*0x132a9*/
      {
        case 14: /*0x132a9*/
          *(_DWORD *)(v7 + 12) = v12 & 0xFFFFFDFF; /*0x132d9*/
          break;
        case 15: /*0x132a9*/
          break;
        case 16: /*0x132a9*/
          *(_QWORD *)v7 = *(_QWORD *)v8; /*0x132bc*/
          *(_DWORD *)(v7 + 12) = v12 ^ (v12 ^ *((_DWORD *)v8 + 3)) & 0x1F0000; /*0x132cc*/
          v13 = v8[15]; /*0x132cf*/
          goto LABEL_17; /*0x132d3*/
        default:
          goto LABEL_18; /*0x132b3*/
      }
      *(_BYTE *)(v7 + 15) = *v8; /*0x132df*/
      v14 = (*(_DWORD *)(v7 + 12) ^ ((unsigned __int8)v8[1] << 16)) & 0x1F0000; /*0x132ed*/
    }
    *(_DWORD *)(v9 + 12) ^= v14; /*0x13331*/
    goto LABEL_18; /*0x13334*/
  }
  v13 = *v8; /*0x13336*/
LABEL_17:
  *(_BYTE *)(v9 + 15) = v13; /*0x13339*/
LABEL_18:
  *(_DWORD *)(v9 + 12) ^= (*(_DWORD *)(v9 + 12) ^ *(unsigned __int8 *)(v3 + 156)) & 1; /*0x1333c*/
  DebugLogPrint_14(UsbHcPtr, *(_DWORD *)(v3 + 28), 0); /*0x13355*/
  if ( DebugLogPrint_1(UsbHcPtr, (__int64 *)v9, 33, 0, 0, &n25, n50, &v24) == -1 )
  {
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI command[%d] completion error code: %d\n", n11, n25);
    if ( n25 == 0xFF ) /*0x133b3*/
    {
      DebugLogPrint_18(UsbHcPtr, v15, *(_QWORD *)(v3 + 40) + 24, 4); /*0x133c8*/
      n25 = 25; /*0x133f4*/
      DebugLogPrint_1(UsbHcPtr, (__int64 *)v9, 33, 0, 0, &n25, 0x32u, 0); /*0x133f9*/
    }
    return -1; /*0x13273*/
  }
  v16 = n11 - 9; /*0x13403*/
  if ( v16 )
  {
    v17 = v16 - 1; /*0x1340c*/
    if ( v17 )
    {
      v18 = v17 - 2; /*0x13415*/
      if ( v18 )
      {
        v19 = v18 - 1; /*0x1341a*/
        if ( v19 )
        {
          v20 = v19 - 1; /*0x1341f*/
          if ( v20 )
          {
            v21 = v20 - 1; /*0x13424*/
            if ( v21 )
            {
              if ( v21 == 1 )
                DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Set TR pointer command complete.\n");
            }
            else
            {
              DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Stop Endpoint command complete (slot#%x dci#%x).\n", *a3, a3[1]);
            }
          }
          else
          {
            DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Reset Endpoint command complete (slot#%x dci#%x).\n", *a3, a3[1]);
            (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x1347b*/
          }
        }
        else
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Evaluate Context command complete.\n");
        }
      }
      else
      {
        DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Configure Endpoint command complete.\n");
      }
    }
    else
    {
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: DisableSlot command complete.\n");
    }
  }
  else
  {
    v22 = v24; /*0x134a7*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Enable Slot command complete, SlotID %d\n", v24);
    *a3 = v22; /*0x134c2*/
  }
  return 0; /*0x134d3*/
}


// Function: UsbConfig_9 @ 0x134e0 (0xd3 bytes)

char __fastcall UsbConfig_9(_BYTE *UsbHcPtr, __int64 a2)
{
  char v4; // si
  unsigned __int8 k; // bl
  __int64 PortNum; // rdx
  __int64 EndpointAddr; // r8

  if ( *(_BYTE *)(UsbRtDispatchTable + 29872) != 1 ) /*0x13508*/
  {
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 1; /*0x1350e*/
    (*(void (__fastcall **)(void *))(BootServices + 248))(&loc_186A0); /*0x13521*/
    do /*0x13577*/
    {
      v4 = 0; /*0x13527*/
      k = 1; /*0x1352a*/
      if ( !*(_BYTE *)(a2 + 15) ) /*0x1352c*/
        break; /*0x1352f*/
      do /*0x13572*/
      {
        if ( (DebugLogPrint_13((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 16 * ((unsigned int)k + 63)) & 0x20000) != 0 ) /*0x1354f*/
        {
          LOBYTE(EndpointAddr) = k; /*0x13553*/
          LOBYTE(PortNum) = *UsbHcPtr | 0x80; /*0x13556*/
          DebugLogPrint_3((__int64)UsbHcPtr, PortNum, EndpointAddr); /*0x13559*/
          v4 = 1; /*0x1355e*/
        }
        else
        {
          XhciPortStatusChange((__int64)UsbHcPtr, k, 0); /*0x13568*/
        }
        ++k; /*0x1356d*/
      }
      while ( k <= *(_BYTE *)(a2 + 15) ); /*0x13572*/
    }
    while ( v4 ); /*0x13577*/
    DebugLogPrint_14((__int64)UsbHcPtr, (unsigned __int8)UsbHcPtr[50] + 4, 16); /*0x13589*/
    *(_BYTE *)(UsbRtDispatchTable + 29872) = 0; /*0x13595*/
  }
  return 0; /*0x135ad*/
}


// Function: UsbGetInfo_3 @ 0x135b4 (0x7d bytes)

char __fastcall UsbGetInfo_3(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, unsigned __int8 i)
{
  char v4; // bl
  __int16 v6; // [rsp+40h] [rbp+18h] BYREF

  v4 = 0; /*0x135c3*/
  if ( (*(_BYTE *)(*(unsigned __int8 *)(a1 + 113) * (unsigned __int64)i /*0x135f6*/
                 + 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1)
                 + *(_QWORD *)(a1 + 208))
      & 7) == 2 )
  {
    v6 = a3 + (i << 8); /*0x13613*/
    return DebugLogPrint_0(UsbHcPtr, 14, (unsigned __int8 *)&v6); /*0x13622*/
  }
  return v4; /*0x1362b*/
}


// Function: UsbGetInfo_0 @ 0x13634 (0xf7 bytes)

char __fastcall UsbGetInfo_0(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, unsigned __int8 i)
{
  _BYTE *v8; // rbx
  __int64 v9; // rcx
  unsigned __int8 v11[12]; // [rsp+20h] [rbp-28h] BYREF
  int v12; // [rsp+2Ch] [rbp-1Ch]
  __int16 v13; // [rsp+60h] [rbp+18h] BYREF

  v8 = (_BYTE *)(*(_QWORD *)(a1 + 208) /*0x13670*/
               + *(unsigned __int8 *)(a1 + 113) * (unsigned __int64)i
               + 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1));
  if ( (*v8 & 7) == 2 ) /*0x1367d*/
  {
    v13 = a3 + (i << 8); /*0x1369a*/
    DebugLogPrint_0(UsbHcPtr, 14, (unsigned __int8 *)&v13); /*0x136a4*/
  }
  if ( (*(_DWORD *)v8 & 7u) - 3 <= 1 ) /*0x136b4*/
  {
    v9 = *(_QWORD *)(a1 + 192) + 32 * ((unsigned __int8)(i - 1) + (__int64)(32 * a3 - 32)); /*0x136da*/
    *(_QWORD *)v11 = *(_QWORD *)(v9 + 20) + *(unsigned __int8 *)(v9 + 28); /*0x136e9*/
    v12 = v12 & 0xE0FFFF | (((a3 << 8) | i & 0x1F) << 16); /*0x1370a*/
    DebugLogPrint_0(UsbHcPtr, 16, v11); /*0x13711*/
  }
  return 0; /*0x13722*/
}


// Function: UsbConfig_4 @ 0x1372c (0x13e bytes)

__int64 __fastcall UsbConfig_4(__int64 a1, __int64 i, __int64 *a3, char a4, char ia)
{
  __int64 result; // rax
  unsigned int v9; // edi
  __int64 v10; // rbp
  unsigned int v11; // ecx
  unsigned int v12; // edx
  _DWORD *v13; // r15
  __int64 v14; // rax
  __int64 j; // rbx
  __int64 j_1; // rax

  result = UsbFindDeviceByPointer(*a3, 416); /*0x1375a*/
  v9 = 0; /*0x1375f*/
  v10 = result; /*0x13761*/
  if ( result ) /*0x13767*/
  {
    v11 = *(_DWORD *)(a1 + 168); /*0x1376d*/
    v12 = 0; /*0x13773*/
    v13 = *(_DWORD **)(result + 384); /*0x13775*/
    v14 = *(_QWORD *)(result + 400); /*0x1377c*/
    for ( j = *(_QWORD *)(a1 + 160); v12 < v11; j += 16 ) /*0x1378c*/
    {
      if ( *(_QWORD *)j == v14 ) /*0x13791*/
        break; /*0x13791*/
      ++v12; /*0x13793*/
    }
    if ( v12 >= v11 ) /*0x1379f*/
      Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 1172, (__int64)"i < Usb3Hc->EvtRing.Size"); /*0x137b4*/
    if ( *(_BYTE *)(j + 15) != a4 || (*(_BYTE *)(j + 14) & 0x1F) != ia ) /*0x137c9*/
      Assert( /*0x137de*/
        (UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c",
        1173,
        (__int64)"EvtTrb->SlotId == SlotId && EvtTrb->EndpointId == Dci");
    if ( *(_DWORD *)(a1 + 168) ) /*0x137e3*/
    {
      do /*0x1383f*/
      {
        if ( *(_BYTE *)(j + 15) == a4 && (*(_BYTE *)(j + 14) & 0x1F) == ia ) /*0x137fb*/
        {
          *v13++ = (*(_DWORD *)(*(_QWORD *)j + 8LL) & 0x1FFFF) - (*(_DWORD *)(j + 8) & 0xFFFFFF); /*0x13814*/
          if ( j == i ) /*0x1381e*/
            break; /*0x1381e*/
          j_1 = j; /*0x13820*/
          j += 16; /*0x13823*/
          if ( j_1 == *(_QWORD *)(a1 + 172) ) /*0x1382e*/
            j = *(_QWORD *)(a1 + 160); /*0x13830*/
        }
        ++v9; /*0x13837*/
      }
      while ( v9 < *(_DWORD *)(a1 + 168) ); /*0x1383f*/
    }
    result = *(_QWORD *)(v10 + 392); /*0x13841*/
    *(_BYTE *)result = 1; /*0x13848*/
  }
  return result; /*0x1385f*/
}


// Function: UsbConfig @ 0x1386c (0x253 bytes)

void __fastcall UsbConfig(__int64 a1, __int64 UsbHcPtr, __int64 i)
{
  int v3; // r15d
  __int64 *v6; // r14
  unsigned __int8 ia; // r12
  char n32; // bp
  __int64 v9; // r13
  __int64 v10; // rax
  __int64 v11; // rdx
  __int64 v12; // r8
  __int64 v13; // rbx
  unsigned int n2; // eax
  __int64 UsbHcPtr_1; // rsi
  int Info_12; // eax
  void (__fastcall *v17)(__int64, __int64, _QWORD); // r10
  __int64 n0x10; // rax
  _QWORD *v19; // rcx
  __int64 v20; // rax
  int v21; // r9d
  int v22; // r8d
  unsigned int v23; // ecx
  unsigned int v24; // [rsp+70h] [rbp+8h]

  v3 = *(unsigned __int8 *)(i + 15); /*0x13885*/
  v6 = *(__int64 **)i; /*0x1389a*/
  ia = *(_BYTE *)(i + 14) & 0x1F; /*0x1389d*/
  n32 = 32; /*0x138a5*/
  v24 = *(_DWORD *)(a1 + 28) + 4 * v3; /*0x138b2*/
  v9 = *(_QWORD *)(a1 + 192) + 32 * ((unsigned __int8)(ia - 1) + (__int64)(32 * v3 - 32)); /*0x138d1*/
  if ( (*(_DWORD *)(*(_QWORD *)i + 12LL) & 0xFC00) == 0x1400 ) /*0x138dd*/
  {
    UsbConfig_4(a1, i, v6, v3, ia); /*0x138ed*/
    return; /*0x138f2*/
  }
  v10 = UsbFindDeviceByPointer(*v6, 24); /*0x138ff*/
  v12 = 0; /*0x13904*/
  v13 = v10; /*0x13907*/
  if ( !v10 ) /*0x1390d*/
    return; /*0x1390d*/
  n2 = *(unsigned __int8 *)(i + 11); /*0x13913*/
  if ( n2 == 1 ) /*0x1391a*/
    goto LABEL_15; /*0x1391a*/
  if ( n2 <= 2 ) /*0x1391f*/
    goto LABEL_25; /*0x1391f*/
  if ( n2 > 4 && n2 != 6 ) /*0x1392d*/
  {
    if ( n2 != 13 ) /*0x13932*/
    {
      if ( n2 == 36 ) /*0x13937*/
        goto LABEL_10; /*0x13937*/
LABEL_25:
      UsbHcPtr_1 = UsbHcPtr; /*0x13a2d*/
LABEL_26:
      if ( (n32 & 0x20) != 0 && *(_QWORD *)(v13 + 24) ) /*0x13a38*/
      {
        v20 = XhciAllocTrbRing((__int64 *)v9); /*0x13a41*/
        if ( v20 ) /*0x13a4c*/
        {
          *(_DWORD *)(v20 + 12) &= 0xFFFF07FF; /*0x13a4e*/
          *(_DWORD *)(v20 + 12) |= 0x400u; /*0x13a55*/
          v21 = *(_DWORD *)(v20 + 12) | 0x24; /*0x13a62*/
          *(_QWORD *)v20 = *(_QWORD *)(v13 + 24); /*0x13a6a*/
          v22 = *(unsigned __int16 *)(v13 + 322); /*0x13a70*/
          v23 = *(_DWORD *)(v20 + 8) & 0xFFFE0000; /*0x13a78*/
          *(_DWORD *)(v20 + 12) = v21; /*0x13a7e*/
          *(_DWORD *)(v20 + 8) = v23 | v22; /*0x13a85*/
          *(_DWORD *)(v20 + 12) = v21 ^ ((unsigned __int8)v21 ^ *(_BYTE *)(v9 + 28)) & 1; /*0x13a9e*/
          DebugLogPrint_14(UsbHcPtr_1, v24, ia); /*0x13aa2*/
        }
      }
      return; /*0x13aa2*/
    }
LABEL_15:
    if ( (unsigned __int8)(*(_BYTE *)(v13 + 21) - 1) <= 0x31u ) /*0x1398f*/
    {
      if ( *(_QWORD *)(v13 + 24) ) /*0x13995*/
      {
        v17 = *(void (__fastcall **)(__int64, __int64, _QWORD))(UsbRtDispatchTable /*0x139ad*/
                                                              + 8LL * *(unsigned __int8 *)(v13 + 21)
                                                              + 29456);
        if ( v17 ) /*0x139b8*/
        {
          if ( !*(_BYTE *)(UsbRtDispatchTable + 30481) ) /*0x139ba*/
          {
            n0x10 = 0; /*0x139c3*/
            v19 = (_QWORD *)(a1 + 232); /*0x139c6*/
            do /*0x139db*/
            {
              if ( !*v19 ) /*0x139cd*/
                break; /*0x139d0*/
              n0x10 = (unsigned int)(n0x10 + 1); /*0x139d2*/
              v19 += 2; /*0x139d4*/
            }
            while ( (unsigned int)n0x10 < 0x10 ); /*0x139db*/
            if ( (_DWORD)n0x10 != 16 ) /*0x139e0*/
            {
              *(_QWORD *)(a1 + 16 * n0x10 + 232) = v6; /*0x139e7*/
              *(_WORD *)(a1 + 16 * ((unsigned int)n0x10 + 15LL)) = *(_WORD *)(v13 + 322) - *(_WORD *)(i + 8); /*0x13a01*/
              return; /*0x13a05*/
            }
          }
          UsbHcPtr_1 = UsbHcPtr; /*0x13a18*/
          v17(UsbHcPtr, v13, 0); /*0x13a25*/
          goto LABEL_26; /*0x13a28*/
        }
      }
    }
    goto LABEL_25; /*0x139b8*/
  }
LABEL_10:
  UsbHcPtr_1 = UsbHcPtr; /*0x1393d*/
  LOBYTE(v12) = *(_BYTE *)(v13 + 13); /*0x13945*/
  LOBYTE(v11) = *(_BYTE *)(v13 + 12); /*0x1394c*/
  Info_12 = UsbGetInfo_12(UsbHcPtr, v11, v12, 0); /*0x1394f*/
  n32 = Info_12; /*0x13959*/
  if ( Info_12 == 255 ) /*0x13961*/
    n32 = 0; /*0x13961*/
  if ( (n32 & 0x20) != 0 ) /*0x13969*/
  {
    UsbGetInfo_0(a1, UsbHcPtr, v3, ia); /*0x1397b*/
    goto LABEL_26; /*0x1397b*/
  }
}


// Function: XhciDriverInit @ 0x13ac0 (0x7de bytes)

char __fastcall XhciDriverInit(__int64 UsbHcPtr)
{
  __int64 v3; // rdi
  __int16 Config; // r14
  unsigned int v5; // eax
  unsigned __int64 v6; // rsi
  unsigned int v7; // eax
  unsigned __int64 v8; // rsi
  unsigned __int64 v9; // rsi
  __int64 TmpRdx; // rdx
  __int64 **v11; // r14
  __int64 n16; // r15
  __int64 v13; // rax
  __int64 v14; // rbp
  void (__fastcall *v15)(__int64, __int64, _QWORD); // r10
  char v16; // r8
  unsigned __int64 v17; // rax
  unsigned __int64 v18; // rdx
  unsigned __int8 v19; // al
  char v20; // r11
  unsigned int v21; // r12d
  __int64 v22; // rax
  __int64 v23; // r10
  unsigned __int8 v24; // r11
  int v25; // r8d
  int v26; // edx
  unsigned int v27; // ecx
  __int64 i; // r14
  __int64 UsbHcPtr_1; // rcx
  int v30; // edx
  __int16 v31; // ax
  unsigned int v32; // edx
  __int64 v33; // rdx
  __int64 n8; // r9
  __int64 v35; // rax
  __int64 v36; // rax
  const CHAR8 *CmdCompleteEvt_n; // rdx
  __int64 n54; // r8
  __int64 v39; // rcx
  __int64 ... [13244 chars total]


// Function: XhciPortStatusChange @ 0x142a0 (0x37d bytes)

__int64 __fastcall XhciPortStatusChange(__int64 UsbHcPtr, unsigned __int8 k, char a3)
{
  int n64; // esi
  int k_1; // r14d
  int v8; // ebp
  __int64 v10; // r12
  unsigned int v11; // edi
  unsigned int i; // r14d
  char n10; // di
  unsigned int n; // edi
  unsigned int m; // edi
  char n6; // al
  unsigned int j; // edi
  unsigned int v18; // eax
  unsigned int v19; // r14d
  int n64_1; // edi
  unsigned __int8 n6_1; // r15
  int n64_2; // edx
  int n64_3; // ecx
  int n64_4; // edx
  int n0x100000; // r8d
  int n64_5; // esi
  unsigned int n64_6; // edi
  int v28; // eax

  n64 = 64; /*0x142c6*/
  k_1 = k; /*0x142cb*/
  v8 = 16 * (k + 63); /*0x142d2*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x142dd*/
    return 255; /*0x142e4*/
  v10 = *(_QWORD *)(UsbHcPtr + 72); /*0x142f0*/
  v11 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x1430c*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI port[%d] status: %08x\n", k_1, v11);
  for ( i = 0; i < 0xC8; ++i ) /*0x14313*/
  {
    if ( (v11 & 0x10) == 0 ) /*0x1431a*/
      break; /*0x1431a*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x14328*/
    v11 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x1433f*/
  }
  n10 = (v11 >> 5) & 0xF; /*0x14350*/
  switch ( n10 ) /*0x14357*/
  {
    case 0: /*0x14357*/
      goto LABEL_30; /*0x14357*/
    case 3: /*0x14357*/
      n64 = 320; /*0x1446d*/
      goto LABEL_30; /*0x1446d*/
    case 5: /*0x14357*/
      goto LABEL_30; /*0x14369*/
    case 6: /*0x14357*/
      for ( j = 0; j < 0xC; ++j ) /*0x14438*/
      {
        (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x14446*/
        n6 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) /*0x1445d*/
           & 0xF;
        if ( n6 != 6 ) /*0x14462*/
          break; /*0x14462*/
      }
      goto LABEL_23; /*0x14469*/
    case 7: /*0x14357*/
      if ( !XhciCheckEndpointAddress(v10, k) ) /*0x143da*/
        goto LABEL_30; /*0x143da*/
      for ( m = 0; m < 0x1F4; ++m ) /*0x143e7*/
      {
        (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x143f5*/
        n6 = ((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) /*0x1440c*/
           & 0xF;
        if ( n6 != 7 ) /*0x14411*/
          break; /*0x14411*/
      }
      if ( !n6 ) /*0x1441f*/
        goto LABEL_30; /*0x1441f*/
LABEL_23:
      if ( n6 == 5 ) /*0x14423*/
        goto LABEL_30; /*0x14423*/
      goto LABEL_24; /*0x14423*/
  }
  if ( n10 != 8 ) /*0x14380*/
  {
    if ( n10 != 10 ) /*0x14385*/
    {
      n64 = 65; /*0x1438b*/
      goto LABEL_30; /*0x14390*/
    }
LABEL_24:
    UsbConfig_3(UsbHcPtr, v10, k, 1); /*0x14425*/
    goto LABEL_30; /*0x14436*/
  }
  for ( n = 0; n < 0xC8; ++n ) /*0x14395*/
  {
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x143a3*/
    if ( (((unsigned int)DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) >> 5) & 0xF) != 8 ) /*0x143bf*/
      break; /*0x143bf*/
  }
LABEL_30:
  v18 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x14472*/
  v19 = v18; /*0x14480*/
  if ( (v18 & 1) != 0 )
  {
    n64_1 = n64 | 1; /*0x14494*/
    n6_1 = (v18 >> 10) & 0xF; /*0x14497*/
    if ( n6_1 >= 6u ) /*0x1449f*/
      Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 4491, (__int64)"Speed < 6"); /*0x144b4*/
    if ( n6_1 )
    {
      if ( n6_1 == 1 )
      {
        n64_1 = n64 | 5; /*0x14507*/
      }
      else if ( n6_1 == 2 )
      {
        n64_1 = n64 | 3; /*0x14500*/
      }
      else if ( n6_1 != 3 )
      {
        if ( n6_1 == 4 )
        {
          n64_1 = n64 | 9; /*0x144f9*/
        }
        else if ( n6_1 == 5 )
        {
          n64_1 = n64 | 0x81; /*0x144ef*/
        }
        else
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI ERROR: unknown device speed.\n");
        }
      }
    }
    n64 = n64_1 | 0x10; /*0x14513*/
    if ( *(_BYTE *)(UsbRtDispatchTable + 30480) != 1 ) /*0x1451d*/
      n64 = n64_1; /*0x1451d*/
    if ( (v19 & 2) != 0 ) /*0x14524*/
      n64 |= 0x20u; /*0x14526*/
  }
  n64_2 = n64 | 0x200; /*0x14531*/
  if ( (v19 & 8) == 0 ) /*0x1453f*/
    n64_2 = n64; /*0x1453f*/
  n64_3 = n64_2 | 0x400; /*0x14544*/
  if ( (v19 & 0x80000010) == 0 ) /*0x14550*/
    n64_3 = n64_2; /*0x14550*/
  n64_4 = n64_3 | 0x800; /*0x14555*/
  n0x100000 = 0x100000; /*0x1455c*/
  if ( (v19 & 0x200) == 0 ) /*0x14565*/
    n64_4 = n64_3; /*0x14565*/
  n64_5 = n64_4 | 0x1000; /*0x1456a*/
  if ( (v19 & 0x40000) == 0 ) /*0x14573*/
    n64_5 = n64_4; /*0x14573*/
  if ( (v19 & 0x100000) != 0 ) /*0x14579*/
  {
    n64_5 |= 0x4000u; /*0x1457f*/
    if ( (v19 & 0x208) == 0 ) /*0x1458f*/
      n0x100000 = 1049088; /*0x14591*/
    DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), n0x100000); /*0x14597*/
  }
  n64_6 = n64_5 | 0x8000; /*0x145a1*/
  if ( (v19 & 0x280000) == 0 ) /*0x145aa*/
    n64_6 = n64_5; /*0x145aa*/
  if ( (v19 & 0x20000) != 0 ) /*0x145b2*/
  {
    n64_6 |= 0x10u; /*0x145b4*/
    if ( a3 != 1 ) /*0x145bb*/
      return n64_6; /*0x145bb*/
    if ( (v19 & 0x100000) != 0 ) /*0x145c0*/
    {
LABEL_67:
      v28 = DebugLogPrint_13(UsbHcPtr, v8 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x145dc*/
      DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), v28 & 0xFFFFFFFD); /*0x145f9*/
      return n64_6; /*0x145f9*/
    }
    DebugLogPrint_14(UsbHcPtr, v8 + *(unsigned __int8 *)(UsbHcPtr + 50), 131584); /*0x145d1*/
  }
  if ( a3 == 1 ) /*0x145da*/
    goto LABEL_67; /*0x145da*/
  return n64_6; /*0x1460f*/
}


// Function: XhciPortDisable2 @ 0x14620 (0xde bytes)

char __fastcall XhciPortDisable2(__int64 UsbHcPtr, unsigned __int8 k)
{
  int k_1; // ebp
  int v4; // esi
  unsigned __int8 n0xC8; // di
  __int64 v6; // r14

  k_1 = k; /*0x14639*/
  v4 = 16 * (k + 63); /*0x14645*/
  n0xC8 = 0; /*0x1464d*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL ) /*0x14652*/
  {
    v6 = *(_QWORD *)(UsbHcPtr + 72); /*0x14658*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Disable XHCI root port %d\n", k_1); /*0x1466a*/
    if ( (DebugLogPrint_13(UsbHcPtr, v4 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 2) != 0 ) /*0x1467f*/
    {
      if ( XhciCheckEndpointAddress(v6, k_1) ) /*0x14687*/
      {
        UsbConfig_3(UsbHcPtr, v6, k_1, 0); /*0x1469c*/
      }
      else
      {
        DebugLogPrint_14(UsbHcPtr, v4 + *(unsigned __int8 *)(UsbHcPtr + 50), 514); /*0x146af*/
        do /*0x146df*/
        {
          if ( (DebugLogPrint_13(UsbHcPtr, v4 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)) & 2) == 0 ) /*0x146c4*/
            break; /*0x146c4*/
          (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x146d2*/
          ++n0xC8; /*0x146d8*/
        }
        while ( n0xC8 < 0xC8u ); /*0x146df*/
      }
    }
  }
  return 0; /*0x146f7*/
}


// Function: UsbConfig_3 @ 0x14700 (0x160 bytes)

char __fastcall UsbConfig_3(__int64 UsbHcPtr, __int64 a2, unsigned __int8 k, char a4)
{
  unsigned int n0x1770; // ebx
  int v6; // esi
  int v8; // r14d
  int v10; // ebp

  n0x1770 = 0; /*0x1471d*/
  v6 = 16 * (k + 63); /*0x14725*/
  if ( a4 && XhciCheckEndpointAddress(a2, k) ) /*0x1473a*/
  {
    DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), -2147483136); /*0x14756*/
    do /*0x1478d*/
    {
      v8 = DebugLogPrint_13(UsbHcPtr, v6 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x14769*/
      if ( (v8 & 0x280000) != 0 ) /*0x14771*/
        break; /*0x14771*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x1477f*/
      ++n0x1770; /*0x14785*/
    }
    while ( n0x1770 < 0x1770 ); /*0x1478d*/
    if ( (v8 & 0x280000) == 0 ) /*0x14796*/
      return -1; /*0x1479a*/
    if ( *(_WORD *)(a2 + 100) == 7023 && *(_WORD *)(a2 + 102) == 28707 ) /*0x147b3*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(20000); /*0x147c1*/
  }
  else
  {
    DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), 528); /*0x147d8*/
    do /*0x14812*/
    {
      v10 = DebugLogPrint_13(UsbHcPtr, v6 + (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50)); /*0x147f1*/
      if ( (v10 & 0x200000) != 0 ) /*0x147f6*/
        break; /*0x147f6*/
      (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x14804*/
      ++n0x1770; /*0x1480a*/
    }
    while ( n0x1770 < 0xBB8 ); /*0x14812*/
    if ( (v10 & 0x200000) == 0 ) /*0x14817*/
      return -1; /*0x14817*/
  }
  DebugLogPrint_14(UsbHcPtr, v6 + *(unsigned __int8 *)(UsbHcPtr + 50), 2621952); /*0x1482c*/
  (*(void (__fastcall **)(__int64))(BootServices + 248))(10000); /*0x1483d*/
  return 0; /*0x14859*/
}


// Function: XhciEnableSlot @ 0x14860 (0x6f bytes)

char __fastcall XhciEnableSlot(__int64 a1, unsigned __int8 k)
{
  __int64 UsbHcPtr; // r10
  __int64 v5; // rbx
  char v6; // di

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x1487d*/
    return -1; /*0x1487f*/
  v5 = *(_QWORD *)(UsbHcPtr + 72); /*0x14883*/
  v6 = UsbConfig_3(UsbHcPtr, v5, k, 0); /*0x1489e*/
  if ( !XhciCheckEndpointAddress(v5, k) ) /*0x148a1*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(5000); /*0x148b6*/
  return v6; /*0x148c9*/
}


// Function: XhciPortStatus2 @ 0x148d0 (0x18b bytes)

char __fastcall XhciPortStatus2(__int64 a1)
{
  __int64 v3; // rsi
  unsigned int v4; // r14d
  int n1024; // ebp
  int v6; // edi
  unsigned int i; // edi
  unsigned int j; // edi
  unsigned int v9; // edx

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x14914*/
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
  {
    return -1; /*0x148f6*/
  }
  v3 = *(_QWORD *)(a1 + 72); /*0x14916*/
  v4 = 1; /*0x1491a*/
  if ( *(_BYTE *)(v3 + 15) )
  {
    n1024 = 1024; /*0x1492a*/
    do
    {
      v6 = DebugLogPrint_13(a1, n1024 + (unsigned int)*(unsigned __int8 *)(a1 + 50)); /*0x1494e*/
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI port[%d] status: %08x\n", v4, v6);
      if ( (v6 & 2) != 0 && (v6 & 0x1E0u) < 0x60 ) /*0x14966*/
      {
        DebugLogPrint_14(a1, n1024 + *(unsigned __int8 *)(a1 + 50), v6 & 0xFFFEFF9D | 0x10060); /*0x1497d*/
        for ( i = 0; i < 0xA; ++i ) /*0x14982*/
        {
          if ( (DebugLogPrint_13(a1, n1024 + (unsigned int)*(unsigned __int8 *)(a1 + 50)) & 0x1E0) == 0x60 ) /*0x1499a*/
            break; /*0x1499a*/
          (*(void (__fastcall **)(__int64))(BootServices + 248))(1000); /*0x149a8*/
        }
      }
      ++v4; /*0x149b9*/
      n1024 += 16; /*0x149bc*/
    }
    while ( v4 <= *(unsigned __int8 *)(v3 + 15) );
  }
  DebugLogPrint_19(a1, 0, 1); /*0x149d1*/
  for ( j = 0; j < 0x140; ++j ) /*0x149d6*/
  {
    if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 ) /*0x149e9*/
      break; /*0x149e9*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(100); /*0x149f7*/
  }
  v9 = *(_DWORD *)(v3 + 56); /*0x14a07*/
  if ( v9 ) /*0x14a0c*/
  {
    DebugLogPrint_20(a1, v9, 0x10000); /*0x14a17*/
    if ( (*(_BYTE *)(a1 + 64) & 0x90) == 0 ) /*0x14a20*/
      DebugLogPrint_14(a1, *(_DWORD *)(v3 + 56) + 4, -536870912); /*0x14a31*/
  }
  *(_DWORD *)(a1 + 64) &= ~1u; /*0x14a36*/
  *(_DWORD *)(a1 + 64) |= 2u; /*0x14a3a*/
  return 0; /*0x14a54*/
}


// Function: XhciDisableSlot @ 0x14a5c (0x5c bytes)

char __fastcall XhciDisableSlot(__int64 a1)
{
  __int64 v1; // r9
  char v2; // r10
  int v4; // edx
  unsigned int v5; // edx
  int v6; // r8d

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL || (*(_BYTE *)(v1 + 64) & 1) == 0 ) /*0x14a7d*/
    return -1; /*0x14a70*/
  v4 = *(_DWORD *)(*(_QWORD *)(v1 + 72) + 56LL); /*0x14a7f*/
  if ( v4 && (*(_BYTE *)(v1 + 64) & 0x10) == 0 && *(char *)(v1 + 64) >= 0 ) /*0x14a92*/
  {
    v5 = v4 + 4; /*0x14a94*/
    v6 = -536862719; /*0x14a9a*/
    if ( v2 != 1 ) /*0x14aa4*/
      v6 = -536805376; /*0x14aa6*/
    DebugLogPrint_14(v1, v5, v6); /*0x14aac*/
  }
  return 0; /*0x14ab3*/
}


// Function: XhciAddressDevice @ 0x14ab8 (0x4bc bytes)

__int64 __fastcall XhciAddressDevice(
        __int64 UsbHcPtr,
        __int64 a2,
        unsigned __int16 n258,
        __int16 a4,
        __int16 a5,
        __int64 a6,
        unsigned __int16 n8)
{
  unsigned __int16 n8_1; // si
  __int64 v12; // r13
  unsigned __int64 v13; // r8
  unsigned __int64 v14; // rcx
  unsigned __int8 v15; // bp
  __int64 UsbRtDispatchTable; // rcx
  bool v18; // cf
  __int64 v19; // r15
  __int64 v20; // rax
  __int64 v21; // rcx
  int v22; // eax
  unsigned int v23; // eax
  __int64 v24; // rax
  unsigned __int16 v25; // r8
  __int64 v26; // rcx
  int v27; // eax
  __int64 v28; // rax
  __int64 v29; // rax
  __int64 n0x80000; // r9
  __int64 *v31; // rbx
  __int64 v32; // r9
  char v33; // bl
  __int64 v34; // rbx
  __int64 v35; // rdx
  _DWORD *v36; // rcx
  __int64 v37; // r15
  __int16 v38; // bp
  int v39; // ecx
  unsigned __int64 v40; // rdx
  unsigned __int8 v41[2]; // [rsp+40h] [rbp-48h] BYREF
  __int64 v42; // [rsp+48h] [rbp-40h] BYREF
  __int64 v43; // [rsp+50h] [rbp-38h] BYREF
  __int64 v44; // [rsp+58h] [rbp-30h]
  unsigned __int8 v45; // [rsp+A8h] [rbp+20h]

  v45 = a4; /*0x14ac7*/
  n8_1 = 0; /*0x14ad9*/
  v42 = 0; /*0x14adf*/
  v43 = 0; /*0x14ae7*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x14af9*/
    return n8_1; /*0x14af9*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x14b0a*/
    return n8_1; /*0x14b0a*/
  v12 = *(_QWORD *)(UsbHcPtr + 72); /*0x14b14*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 /*0x14b2f*/
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
  {
    return n8_1; /*0x14b2f*/
  }
  if ( !a2 ) /*0x14b38*/
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 2397, (__int64)"DevInfo != ((void *) 0)"); /*0x14b4d*/
  if ( *(char *)a2 < 0 ) /*0x14b56*/
    return n8_1; /*0x14b56*/
  v13 = *(_QWORD *)(a2 + 216); /*0x14b5c*/
  v14 = *(_QWORD *)(v12 + 208); /*0x14b63*/
  if ( v13 < v14 || v13 > v14 + 32 * *(unsigned __int8 *)(v12 + 113) * (unsigned int)*(unsigned __int8 *)(v12 + 12) ) /*0x14b89*/
    return n8_1; /*0x14b89*/
  v15 = (v13 - v14) / (32 * (unsigned __int64)*(unsigned __int8 *)(v12 + 113)) + 1; /*0x14ba8*/
  if ( n258 != 1280 )
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x14bde*/
    v18 = *(_WORD *)(UsbRtDispatchTable + 30470) != 0; /*0x14bec*/
    *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x14bef*/
    *(_BYTE *)(UsbRtDispatchTable + 30472) &= ~4u; /*0x14bf8*/
    *(_WORD *)v41 = v18 ? 0x7D0 : 0;
    v19 = *(_QWORD *)(v12 + 192) + 32LL * (32 * v15 - 32); /*0x14c19*/
    v20 = XhciAllocTrbRing((__int64 *)v19); /*0x14c23*/
    v21 = v20; /*0x14c28*/
    if ( v20 ) /*0x14c2e*/
    {
      *(_DWORD *)(v20 + 12) &= 0xFFFF0BFF; /*0x14c34*/
      *(_DWORD *)(v20 + 8) &= 0xFFFE0008; /*0x14c46*/
      *(_DWORD *)(v20 + 12) |= 0x840u; /*0x14c4d*/
      n8_1 = n8; /*0x14c54*/
      v22 = *(_DWORD *)(v20 + 12); /*0x14c5c*/
      *(_WORD *)(v21 + 2) = a5; /*0x14c5f*/
      *(_DWORD *)(v21 + 8) |= 8u; /*0x14c68*/
      *(_WORD *)v21 = n258; /*0x14c70*/
      *(_WORD *)(v21 + 4) = a4; /*0x14c74*/
      *(_WORD *)(v21 + 6) = n8; /*0x14c78*/
      if ( *(_WORD *)(v12 + 10) >= 0x100u ) /*0x14c81*/
      {
        if ( n8 ) /*0x14c86*/
        {
          if ( (n258 & 0x80u) == 0 ) /*0x14c8b*/
            v23 = v22 & 0xFFFCFFFF | 0x20000; /*0x14c98*/
          else
            v23 = v22 | 0x30000; /*0x14c8d*/
        }
        else
        {
          v23 = v22 & 0xFFFCFFFF; /*0x14c9e*/
        }
        *(_DWORD *)(v21 + 12) = v23; /*0x14ca3*/
      }
      *(_DWORD *)(v21 + 12) ^= (*(_DWORD *)(v21 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14cb1*/
      if ( n8 ) /*0x14cb7*/
      {
        v24 = XhciAllocTrbRing((__int64 *)v19); /*0x14cc0*/
        v44 = v24; /*0x14cc5*/
        if ( !v24 ) /*0x14ccd*/
          return v25; /*0x14cd3*/
        *(_DWORD *)(v24 + 12) &= 0xFFFF0FFF; /*0x14cd8*/
        *(_DWORD *)(v24 + 12) |= 0xC00u; /*0x14ce2*/
        ElibReadNvStore(UsbHcPtr, n258 & 0x80, a6, n8, &v42, (__int64)&v43); /*0x14d11*/
        v26 = v44; /*0x14d16*/
        v27 = *(_DWORD *)(v44 + 12) ^ (n258 << 9); /*0x14d22*/
        *(_DWORD *)(v44 + 8) &= 0xFFFE0000; /*0x14d25*/
        *(_DWORD *)(v26 + 12) ^= v27 & 0x10000; /*0x14d31*/
        v28 = v42; /*0x14d34*/
        *(_DWORD *)(v26 + 8) |= n8; /*0x14d39*/
        *(_QWORD *)v26 = v28; /*0x14d3c*/
        *(_DWORD *)(v26 + 12) ^= (*(_DWORD *)(v26 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14d4a*/
      }
      v29 = XhciAllocTrbRing((__int64 *)v19); /*0x14d53*/
      v31 = (__int64 *)v29; /*0x14d58*/
      if ( !v29 ) /*0x14d5e*/
        return v25; /*0x14d5e*/
      *(_DWORD *)(v29 + 12) &= 0xFFFF13FF; /*0x14d64*/
      *(_DWORD *)(v29 + 12) |= 0x1020u; /*0x14d6b*/
      if ( (n258 & 0x80u) == 0 ) /*0x14d75*/
        *(_DWORD *)(v29 + 12) |= 0x10000u; /*0x14d77*/
      LOBYTE(n0x80000) = 1; /*0x14d81*/
      *(_DWORD *)(v29 + 12) ^= (*(_DWORD *)(v29 + 12) ^ *(unsigned __int8 *)(v19 + 28)) & 1; /*0x14d90*/
      if ( UsbGetInfo_2(v12, UsbHcPtr, v15, n0x80000) ) /*0x14d96*/
        return 0; /*0x14da6*/
      LOBYTE(v32) = v15; /*0x14db0*/
      v33 = DebugLogPrint_1(UsbHcPtr, v31, 32, v32, 1, v41, *(unsigned __int16 *)v41, 0); /*0x14ddd*/
      if ( n8 ) /*0x14de2*/
        (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v43); /*0x14df0*/
      if ( v33 ) /*0x14df6*/
      {
        if ( v41[0] >= 3u ) /*0x14dfe*/
        {
          if ( v41[0] <= 4u ) /*0x14e02*/
          {
            UsbGetInfo_0(v12, UsbHcPtr, v15, 1u); /*0x14e57*/
          }
          else if ( v41[0] == 6 ) /*0x14e06*/
          {
            UsbGetInfo_0(v12, UsbHcPtr, v15, 1u); /*0x14e36*/
            *(_BYTE *)(UsbRtDispatchTable + 30472) |= 4u; /*0x14e42*/
          }
          else if ( v41[0] == 0xFF ) /*0x14e0a*/
          {
            XhciAddContextEntry(UsbHcPtr, a2, 0); /*0x14e15*/
            *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x14e21*/
          }
        }
        n8_1 = 0; /*0x14e5c*/
      }
      if ( n258 != 1664 ) /*0x14e68*/
      {
        v37 = a6; /*0x14f15*/
LABEL_50:
        if ( n258 == 258 && !n8_1 && !a5 && !v37 ) /*0x14f3e*/
          XhciAddContextEntry(UsbHcPtr, a2, v45); /*0x14f4e*/
        return n8_1; /*0x14f4e*/
      }
      if ( n8_1 == 8 ) /*0x14e76*/
      {
        v34 = *(_QWORD *)(UsbHcPtr + 72); /*0x14e7c*/
        v41[0] = v15; /*0x14e87*/
        v35 = *(unsigned __int8 *)(v34 + 113); /*0x14e8c*/
        v36 = (_DWORD *)(*(_QWORD *)(v34 + 208) + 32 * (unsigned int)v35 * (v15 - 1)); /*0x14e9a*/
        if ( (*v36 & 0xF00000) == 0x100000 ) /*0x14ead*/
        {
          v37 = a6; /*0x14eb3*/
          v38 = *(unsigned __int8 *)(a6 + 7); /*0x14ebb*/
          if ( *(_WORD *)((char *)v36 + v35 + 6) != v38 ) /*0x14ec5*/
          {
            v39 = 33 * v35; /*0x14ecb*/
            v40 = (unsigned int)(33 * v35); /*0x14ed1*/
            if ( v39 ) /*0x14ed5*/
              MemGetInfo(*(_QWORD *)(v34 + 216), v40); /*0x14ede*/
            *(_DWORD *)(*(_QWORD *)(v34 + 216) + 4LL) = 2; /*0x14ef4*/
            *(_WORD *)(*(_QWORD *)(v34 + 216) + 2LL * *(unsigned __int8 *)(v34 + 113) + 6) = v38; /*0x14f06*/
            DebugLogPrint_0(UsbHcPtr, 13, v41); /*0x14f0e*/
            goto LABEL_50; /*0x14f13*/
          }
        }
      }
    }
    return n8_1; /*0x14f53*/
  }
  if ( (*(_DWORD *)(v13 + 12) & 0xF8000000) == 0x8000000 ) /*0x14bc1*/
    DebugLogPrint(UsbHcPtr, a2, v15); /*0x14bcc*/
  return n8; /*0x14f67*/
}


// Function: XhciConfigureEndpoint @ 0x14f74 (0x44c bytes)

__int64 __fastcall XhciConfigureEndpoint(
        __int64 UsbHcPtr,
        __int64 a2,
        signed __int8 a3,
        __int64 a4,
        unsigned int n0x80000)
{
  __int64 UsbRtDispatchTable; // rdx
  __int64 v10; // rbp
  unsigned __int64 v11; // r8
  unsigned __int64 v12; // r9
  __int16 v13; // ax
  unsigned int v14; // edx
  unsigned __int8 v15; // r12
  char v16; // r14
  unsigned __int16 v17; // ax
  int v18; // edx
  __int64 v19; // r13
  unsigned int n0x80000_6; // ebx
  unsigned int n0x80000_1; // eax
  unsigned int n0x80000_3; // r15d
  unsigned __int64 v23; // rbx
  unsigned __int64 v24; // r8
  __int64 n0x80000_4; // r9
  __int64 v26; // rax
  unsigned int n0x10000_1; // r9d
  unsigned int n0x8000; // r10d
  int v29; // r11d
  unsigned __int16 v30; // dx
  unsigned int n0x10000; // ecx
  int v32; // eax
  int v33; // eax
  unsigned int n0x10000_2; // edx
  unsigned int n0x80000_7; // r11d
  unsigned int n31; // ecx
  __int64 v37; // r9
  char v38; // al
  unsigned int ... [9403 chars total]


// Function: XhciSetupTrb @ 0x153c0 (0xa2 bytes)

__int64 __fastcall XhciSetupTrb(
        __int64 a1,
        __int64 a2,
        unsigned __int16 a3,
        char a4,
        __int64 a5,
        unsigned __int16 a6,
        _DWORD *a7)
{
  int v7; // r9d
  unsigned int n31_1; // eax
  __int64 result; // rax
  unsigned int n31; // eax

  *(_DWORD *)(a2 + 8) &= 0xFFFE0000; /*0x153c5*/
  *(_DWORD *)(a2 + 12) &= ~1u; /*0x153cf*/
  *(_DWORD *)(a2 + 12) |= a4 & 1; /*0x153de*/
  *(_DWORD *)(a2 + 8) |= a3; /*0x153ec*/
  v7 = *(_DWORD *)(a2 + 8); /*0x153f0*/
  *(_QWORD *)a2 = a5; /*0x153f4*/
  if ( *(_WORD *)(a1 + 10) < 0x100u ) /*0x15400*/
  {
    n31 = *a7 >> 10; /*0x1543b*/
    if ( n31 > 0x1F ) /*0x15441*/
      n31 = 31; /*0x15441*/
    result = v7 ^ (v7 ^ (n31 << 17)) & 0x3E0000; /*0x15450*/
    *a7 -= a3; /*0x15456*/
  }
  else
  {
    *a7 -= a3; /*0x1540e*/
    n31_1 = *a7 / (unsigned int)a6; /*0x15413*/
    if ( n31_1 > 0x1F ) /*0x15418*/
      n31_1 = 31; /*0x15418*/
    result = v7 ^ (v7 ^ (n31_1 << 17)) & 0x3E0000; /*0x15427*/
    *(_DWORD *)(a2 + 12) |= 0x200u; /*0x1542a*/
  }
  *(_DWORD *)(a2 + 8) = result; /*0x1545d*/
  return result; /*0x15461*/
}


// Function: XhciEvaluateContext @ 0x15464 (0x323 bytes)

__int64 __fastcall XhciEvaluateContext(
        __int64 UsbHcPtr,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        unsigned int a5,
        _BYTE *a6)
{
  __int64 v9; // r13
  unsigned int v10; // esi
  int v11; // ebp
  unsigned __int64 v12; // rdx
  unsigned __int64 v13; // r8
  __int64 n0x80000; // r9
  char v15; // r8
  unsigned __int64 v16; // rax
  unsigned __int64 v17; // r10
  int v18; // eax
  int v19; // ecx
  __int64 v20; // r12
  unsigned int n0x2000; // eax
  __int64 v22; // r12
  __int64 v23; // rbx
  __int64 v24; // rax
  __int64 v25; // r8
  int v26; // edx
  unsigned __int16 v27; // si
  __int64 v28; // rax
  __int64 v29; // rax
  unsigned int v31; // [rsp+40h] [rbp-48h] BYREF
  int v32; // [rsp+44h] [rbp-44h]
  int v33; // [rsp+48h] [rbp-40h]
  unsigned int v34; // [rsp+4Ch] [rbp-3Ch]
  int v35; // [rsp+50h] [rbp-38h]
  unsigned __int64 v36; // [rsp+58h] [rbp-30h]

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) == 0LL /*0x154af*/
    && (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) == 0LL
    && (*(_BYTE *)(UsbHcPtr + 64) & 1) != 0 )
  {
    v9 = *(_QWORD *)(UsbHcPtr + 72); /*0x154b5*/
    v10 = a5; /*0x154ce*/
    v11 = *(unsigned __int16 *)(a2 + 378) * *(unsigned __int8 *)(a2 + 380); /*0x154d5*/
    v31 = a5; /*0x154d8*/
    *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x154dc*/
    v12 = *(_QWORD *)(a2 + 216); /*0x154e2*/
    v13 = *(_QWORD *)(v9 + 208); /*0x154e9*/
    v35 = v11; /*0x154f0*/
    if ( v12 >= v13 /*0x15537*/
      && v12 <= v13 + 32 * *(unsigned __int8 *)(v9 + 12) * (unsigned int)*(unsigned __int8 *)(v9 + 113)
      && *(_BYTE *)(a2 + 376)
      && (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) == 0 )
    {
      if ( !a5 ) /*0x1553f*/
        Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 2954, (__int64)"Length > 0"); /*0x15554*/
      v15 = *(_BYTE *)(a2 + 376); /*0x1556e*/
      v16 = (*(_QWORD *)(a2 + 216) - *(_QWORD *)(v9 + 208)) / (32 * (unsigned __int64)*(unsigned __int8 *)(v9 + 113)); /*0x15579*/
      v32 = 0; /*0x1557f*/
      v17 = v16; /*0x15583*/
      LOBYTE(v17) = v16 + 1; /*0x1558b*/
      v18 = (unsigned __int8)(v16 + 1); /*0x15594*/
      v36 = v17; /*0x15598*/
      v19 = (unsigned __int8)(2 * (v15 & 0xF) + 1); /*0x155a0*/
      if ( v15 >= 0 ) /*0x155a3*/
        v19 = (unsigned __int8)(2 * (v15 & 0xF)); /*0x155a3*/
      v33 = v19; /*0x155ac*/
      v20 = (unsigned __int8)(v19 - 1) + (__int64)(32 * v18 - 32); /*0x155b9*/
      n0x2000 = 0; /*0x155bc*/
      v22 = *(_QWORD *)(v9 + 192) + 32 * v20; /*0x155c2*/
      *(_QWORD *)(a2 + 400) = 0; /*0x155c9*/
      v23 = v36; /*0x155d0*/
      if ( a5 ) /*0x155d7*/
      {
        while ( 1 ) /*0x155e0*/
        {
          if ( n0x2000 >= 0x2000 ) /*0x155e5*/
          {
LABEL_29:
            LOBYTE(v19) = v33; /*0x15720*/
            LOBYTE(v17) = v36; /*0x15724*/
            goto LABEL_30; /*0x15724*/
          }
          v24 = XhciAllocTrbRing((__int64 *)v22); /*0x155ee*/
          v23 = v24; /*0x155f3*/
          if ( !v24 ) /*0x155f9*/
            return 0; /*0x155f9*/
          if ( *(_QWORD *)(a2 + 400) == v25 ) /*0x15606*/
            *(_QWORD *)(a2 + 400) = v24; /*0x15608*/
          *(_DWORD *)(v24 + 12) |= 0x20u; /*0x1560f*/
          v26 = *(_DWORD *)(v24 + 12); /*0x15613*/
          v34 = (unsigned __int16)v11; /*0x1561b*/
          if ( v10 < (unsigned __int16)v11 ) /*0x15623*/
            LOWORD(v11) = v10; /*0x15623*/
          v27 = v25; /*0x15627*/
          if ( (unsigned __int16)v11 + (unsigned int)(unsigned __int16)a4 > 0x10000 ) /*0x15636*/
          {
            v27 = a4 + v11; /*0x15638*/
            LOWORD(v11) = -(__int16)a4; /*0x15640*/
          }
          *(_DWORD *)(v24 + 12) = v26 & 0x7FFF03FF | 0x80001400; /*0x15659*/
          XhciSetupTrb(v9, v24, v11, *(_BYTE *)(v22 + 28), a4, *(_WORD *)(a2 + 378), &v31); /*0x1567c*/
          if ( !v27 ) /*0x15687*/
            goto LABEL_25; /*0x15687*/
          if ( v31 - v27 > v34 ) /*0x15696*/
            break; /*0x15696*/
          v10 = 0; /*0x15716*/
          v31 = 0; /*0x15719*/
LABEL_26:
          a4 += 3072; /*0x156f8*/
          n0x2000 = ++v32; /*0x15703*/
          if ( !v10 ) /*0x1570b*/
            goto LABEL_29; /*0x1570b*/
          LOWORD(v11) = v35; /*0x1570d*/
        }
        *(_DWORD *)(v23 + 12) |= 0x10u; /*0x15698*/
        v28 = XhciAllocTrbRing((__int64 *)v22); /*0x1569f*/
        v23 = v28; /*0x156a4*/
        if ( !v28 ) /*0x156aa*/
          return 0; /*0x156aa*/
        *(_DWORD *)(v28 + 12) &= 0xFFFF07FF; /*0x156b0*/
        *(_DWORD *)(v28 + 12) |= 0x400u; /*0x156bb*/
        XhciSetupTrb(v9, v28, v27, *(_BYTE *)(v22 + 28), a4 + (unsigned __int16)v11, *(_WORD *)(a2 + 378), &v31); /*0x156ec*/
LABEL_25:
        v10 = v31; /*0x156f4*/
        goto LABEL_26; /*0x156f4*/
      }
LABEL_30:
      v29 = *(_QWORD *)v23; /*0x15729*/
      *(_DWORD *)(v23 + 12) &= ~0x200u; /*0x1572c*/
      *(_DWORD *)(v23 + 8) &= 0xFFC1FFFF; /*0x15731*/
      *(_QWORD *)(a2 + 416) = v29; /*0x15738*/
      if ( a6 ) /*0x1574a*/
      {
        *(_QWORD *)(a2 + 392) = a6; /*0x1574c*/
        *a6 = 0; /*0x15753*/
      }
      LOBYTE(n0x80000) = v19; /*0x15756*/
      UsbGetInfo_2(v9, UsbHcPtr, v17, n0x80000); /*0x15762*/
    }
  }
  return 0; /*0x1577a*/
}


// Function: XhciConfigureEndpoint2 @ 0x15788 (0x289 bytes)

__int64 __fastcall XhciConfigureEndpoint2(
        __int64 UsbHcPtr,
        __int64 a2,
        signed __int8 a3,
        __int64 a4,
        __int64 a5,
        unsigned __int16 a6)
{
  __int64 UsbRtDispatchTable; // r9
  __int64 v10; // rsi
  unsigned __int64 v11; // rdx
  unsigned __int64 v12; // r8
  unsigned int v13; // edx
  char i; // di
  unsigned __int8 v15; // r14
  __int64 v16; // rcx
  __int64 n0x80000; // r9
  __int64 v18; // r15
  __int64 result; // rax
  __int64 v20; // rax
  __int64 v21; // r9
  unsigned __int16 v22; // bp
  unsigned __int16 v23[2]; // [rsp+40h] [rbp-48h] BYREF
  int v24; // [rsp+44h] [rbp-44h] BYREF
  __int64 v25; // [rsp+48h] [rbp-40h] BYREF
  __int64 v26; // [rsp+50h] [rbp-38h] BYREF

  v25 = 0; /*0x157a9*/
  v26 = 0; /*0x157b0*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x157bf*/
    return 0; /*0x157bf*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x157d0*/
    return 0; /*0x157d0*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x157da*/
    return 0; /*0x157da*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x157e0*/
  *(_DWORD *)(UsbRtDispatchTable + 30476) = 0; /*0x157e7*/
  v10 = *(_QWORD *)(UsbHcPtr + 72); /*0x157ee*/
  v11 = *(_QWORD *)(a2 + 216); /*0x157f2*/
  v12 = *(_QWORD *)(v10 + 208); /*0x157f9*/
  if ( v11 < v12 ) /*0x15803*/
    return 0; /*0x15803*/
  if ( v11 > v12 + 32 * *(unsigned __int8 *)(v10 + 12) * (unsigned int)*(unsigned __int8 *)(v10 + 113) ) /*0x1581d*/
    return 0; /*0x1581d*/
  if ( !a3 ) /*0x15826*/
    return 0; /*0x15826*/
  v13 = *(unsigned __int8 *)(UsbHcPtr + 50) + 4; /*0x1583b*/
  v23[0] = *(_WORD *)(UsbRtDispatchTable + 30470); /*0x1583e*/
  if ( (DebugLogPrint_13(UsbHcPtr, v13) & 1) != 0 ) /*0x1584a*/
    return 0; /*0x159f0*/
  i = 2 * (a3 & 0xF); /*0x1586f*/
  v15 = (*(_QWORD *)(a2 + 216) - *(_QWORD *)(v10 + 208)) / (32 * (unsigned __int64)*(unsigned __int8 *)(v10 + 113)) + 1; /*0x1587b*/
  if ( a3 < 0 ) /*0x15881*/
    ++i; /*0x15883*/
  v24 = a6; /*0x158b0*/
  ElibReadNvStore(UsbHcPtr, a3 & 0x80, a5, a6, &v25, (__int64)&v26); /*0x158b4*/
  v18 = XhciAllocTrbRing((__int64 *)(*(_QWORD *)(v10 + 192) + 32 * ((unsigned __int8)(i - 1) + (__int64)(32 * v15 - 32)))); /*0x158df*/
  result = 0; /*0x158e2*/
  if ( v18 ) /*0x158e7*/
  {
    *(_DWORD *)(v18 + 12) &= 0xFFFF07FF; /*0x158ed*/
    LOBYTE(n0x80000) = i; /*0x158f5*/
    *(_DWORD *)(v18 + 12) |= 0x424u; /*0x158f8*/
    v20 = v25; /*0x15903*/
    *(_DWORD *)(v18 + 8) &= 0xFFFE0000; /*0x1590b*/
    *(_QWORD *)v18 = v20; /*0x15913*/
    *(_DWORD *)(v18 + 8) |= a6; /*0x15918*/
    *(_DWORD *)(v18 + 12) ^= (*(_DWORD *)(v18 + 12) ^ *(unsigned __int8 *)(v16 + 28)) & 1; /*0x1592a*/
    if ( UsbGetInfo_2(v10, UsbHcPtr, v15, n0x80000) ) /*0x1592e*/
    {
      return 0; /*0x15939*/
    }
    else
    {
      LOBYTE(v21) = v15; /*0x15946*/
      if ( DebugLogPrint_1(UsbHcPtr, (__int64 *)v18, 32, v21, i, v23, v23[0], &v24) ) /*0x15973*/
      {
        if ( LOBYTE(v23[0]) >= 3u ) /*0x15982*/
        {
          if ( LOBYTE(v23[0]) <= 4u ) /*0x15986*/
          {
            UsbGetInfo_0(v10, UsbHcPtr, v15, i); /*0x159cd*/
          }
          else if ( LOBYTE(v23[0]) == 6 ) /*0x1598a*/
          {
            UsbGetInfo_3(v10, UsbHcPtr, v15, i); /*0x159ba*/
          }
          else if ( LOBYTE(v23[0]) == 0xFF ) /*0x1598e*/
          {
            XhciAddContextEntry(UsbHcPtr, a2, a3); /*0x15999*/
            *(_DWORD *)(UsbRtDispatchTable + 30476) |= 0x40u; /*0x159a5*/
          }
        }
        v22 = 0; /*0x159d2*/
      }
      else
      {
        v22 = a6 - v24; /*0x159d6*/
      }
      (*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(UsbHcPtr + 104) + 80LL))(*(_QWORD *)(UsbHcPtr + 104), v26); /*0x159e7*/
      return v22; /*0x159eb*/
    }
  }
  return result; /*0x15a04*/
}


// Function: XhciResetEndpoint @ 0x15a14 (0x1ba bytes)

char __fastcall XhciResetEndpoint(__int64 UsbHcPtr, __int64 a2)
{
  unsigned __int64 v4; // rcx
  char v5; // r9
  unsigned __int64 v6; // r10
  __int64 v7; // rbp
  unsigned __int64 v8; // rdi
  __int64 v9; // r11
  unsigned __int8 v10; // r14
  unsigned __int8 v11; // dl
  unsigned __int8 v12; // si
  _BYTE *v13; // rdi
  __int64 v14; // rcx
  unsigned __int8 v16[12]; // [rsp+20h] [rbp-28h] BYREF
  int v17; // [rsp+2Ch] [rbp-1Ch]
  __int16 v18; // [rsp+60h] [rbp+18h] BYREF

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x15a34*/
    return -1; /*0x15a34*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x15a45*/
    return -1; /*0x15a45*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x15a4f*/
    return -1; /*0x15a4f*/
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x15a66*/
    return -1; /*0x15a66*/
  v4 = *(_QWORD *)(a2 + 24); /*0x15a6c*/
  if ( !v4 ) /*0x15a73*/
    return -1; /*0x15a73*/
  FwVolConfig(v4, ((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x15a8b*/
  v5 = *(_BYTE *)(a2 + 64); /*0x15a90*/
  *(_QWORD *)(a2 + 24) = 0; /*0x15a94*/
  if ( !v5 ) /*0x15a9c*/
    return -1; /*0x15a9c*/
  v6 = *(_QWORD *)(a2 + 216); /*0x15aa2*/
  v7 = *(_QWORD *)(UsbHcPtr + 72); /*0x15aab*/
  v8 = *(_QWORD *)(v7 + 208); /*0x15ab2*/
  v9 = *(unsigned __int8 *)(v7 + 113); /*0x15ab9*/
  v10 = (v6 - v8) / (32 * v9) + 1; /*0x15ad6*/
  v11 = 2 * (v5 & 0xF) + 1; /*0x15ae9*/
  if ( v5 >= 0 ) /*0x15aec*/
    v11 = 2 * (v5 & 0xF); /*0x15aec*/
  v12 = v11; /*0x15af0*/
  v18 = v10 + (v11 << 8); /*0x15aff*/
  if ( v6 < v8 || v6 > v8 + 32 * *(unsigned __int8 *)(v7 + 12) * (unsigned int)v9 ) /*0x15b20*/
    return -1; /*0x15bb9*/
  v13 = (_BYTE *)(v6 + v9 * v11); /*0x15b2e*/
  if ( (*v13 & 7) == 1 ) /*0x15b37*/
    DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v18); /*0x15b46*/
  if ( (*(_DWORD *)v13 & 7u) - 3 <= 1 ) /*0x15b56*/
  {
    v14 = *(_QWORD *)(v7 + 192) + 32 * ((unsigned __int8)(v12 - 1) + (__int64)(32 * v10 - 32)); /*0x15b7c*/
    *(_QWORD *)v16 = *(_QWORD *)(v14 + 20) + *(unsigned __int8 *)(v14 + 28); /*0x15b8e*/
    v17 = v17 & 0xE0FFFF | ((v12 | (v10 << 8)) << 16); /*0x15ba7*/
    DebugLogPrint_0(UsbHcPtr, 16, v16); /*0x15bb0*/
  }
  return 0; /*0x15bc5*/
}


// Function: XhciStopEndpoint @ 0x15bd0 (0x195 bytes)

char __fastcall XhciStopEndpoint(__int64 a1, __int64 a2)
{
  __int64 v2; // rbp
  char v5; // r8
  unsigned __int64 v6; // rax
  unsigned __int64 v7; // rdx
  unsigned __int8 v8; // bl
  unsigned __int8 v9; // r14
  __int64 v10; // rax
  __int64 v11; // r9
  int v12; // r10d
  int v14; // edx
  int v15; // ecx
  unsigned int v16; // ecx

  v2 = *(_QWORD *)(a1 + 72); /*0x15be9*/
  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL ) /*0x15bfb*/
    return -1; /*0x15bfb*/
  if ( (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL ) /*0x15c0c*/
    return -1; /*0x15c0c*/
  if ( (*(_BYTE *)(a1 + 64) & 1) == 0 ) /*0x15c16*/
    return -1; /*0x15c16*/
  if ( (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 ) /*0x15c2d*/
    return -1; /*0x15c2d*/
  v5 = *(_BYTE *)(a2 + 64); /*0x15c33*/
  if ( !v5 ) /*0x15c3a*/
    return -1; /*0x15c3a*/
  v6 = *(_QWORD *)(a2 + 216); /*0x15c40*/
  v7 = *(_QWORD *)(v2 + 208); /*0x15c47*/
  if ( v6 < v7 || v6 > v7 + 32 * *(unsigned __int8 *)(v2 + 113) * (unsigned int)*(unsigned __int8 *)(v2 + 12) ) /*0x15c6d*/
    return -1; /*0x15d48*/
  v8 = (v6 - v7) / (32 * (unsigned __int64)*(unsigned __int8 *)(v2 + 113)) + 1; /*0x15c90*/
  v9 = 2 * (v5 & 0xF) + 1; /*0x15c96*/
  if ( v5 >= 0 ) /*0x15ca1*/
    v9 = 2 * (v5 & 0xF); /*0x15ca1*/
  *(_QWORD *)(a2 + 24) = UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(a2 + 322) + 31) >> 5); /*0x15cb2*/
  v10 = XhciAllocTrbRing((__int64 *)(*(_QWORD *)(v2 + 192) + 32 * ((unsigned __int8)(v9 - 1) + (__int64)(32 * v8 - 32)))); /*0x15cde*/
  if ( v10 ) /*0x15ce9*/
  {
    *(_DWORD *)(v10 + 12) &= 0xFFFF07FF; /*0x15cef*/
    *(_DWORD *)(v10 + 12) |= 0x400u; /*0x15cf6*/
    v14 = *(_DWORD *)(v10 + 12) | 0x24; /*0x15d02*/
    v15 = *(_DWORD *)(v10 + 8); /*0x15d05*/
    *(_QWORD *)v10 = *(_QWORD *)(a2 + 24); /*0x15d09*/
    v16 = *(unsigned __int16 *)(a2 + 322) | v15 & 0xFFFE0000; /*0x15d19*/
    *(_DWORD *)(v10 + 12) = v14; /*0x15d1b*/
    *(_DWORD *)(v10 + 8) = v16; /*0x15d1f*/
    *(_DWORD *)(v10 + 12) = v14 ^ ((unsigned __int8)v14 ^ *(_BYTE *)(v11 + 28)) & 1; /*0x15d32*/
    DebugLogPrint_14(a1, *(_DWORD *)(v2 + 28) + 4 * v12, v9); /*0x15d41*/
  }
  return 0; /*0x15d5e*/
}


// Function: XhciSetTrDequeuePtr @ 0x15d68 (0x77 bytes)

char __fastcall XhciSetTrDequeuePtr(__int64 a1)
{
  __int64 v3; // rdx
  __int64 v4; // rbx

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x15d9a*/
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
  {
    return -1; /*0x15d7f*/
  }
  v4 = *(_QWORD *)(a1 + 72); /*0x15d9c*/
  DebugLogPrint_18(a1, v3, *(_QWORD *)(v4 + 48) + 56LL, *(_QWORD *)(v4 + 180) | 8LL); /*0x15db6*/
  DebugLogPrint_14(a1, *(_DWORD *)(v4 + 48) - *(_DWORD *)(a1 + 16) + 36, 4000); /*0x15dcd*/
  return 0; /*0x15dd9*/
}


// Function: XhciSetTrDequeuePtrSub @ 0x15de0 (0x72 bytes)

char __fastcall XhciSetTrDequeuePtrSub(__int64 a1)
{
  __int64 v3; // rdx
  __int64 v4; // rbx

  if ( (HcCheckInit(a1) & 0x8000000000000000uLL) != 0LL /*0x15e12*/
    || (*(_BYTE *)(a1 + 64) & 1) == 0
    || (DebugLogPrint_13(a1, (unsigned int)*(unsigned __int8 *)(a1 + 50) + 4) & 1) != 0 )
  {
    return -1; /*0x15df7*/
  }
  v4 = *(_QWORD *)(a1 + 72); /*0x15e14*/
  DebugLogPrint_18(a1, v3, *(_QWORD *)(v4 + 48) + 56LL, 8); /*0x15e29*/
  DebugLogPrint_14(a1, *(_DWORD *)(v4 + 48) - *(_DWORD *)(a1 + 16) + 36, 2097184000); /*0x15e40*/
  return 0; /*0x15e4c*/
}


// Function: XhciAllocTrbFromRing @ 0x15e54 (0x5f bytes)

__int64 __fastcall XhciAllocTrbFromRing(__int64 a1, unsigned __int8 a2, unsigned __int8 a3)
{
  __int64 v4; // r9
  __int64 v5; // rbx
  int v6; // ecx

  v4 = 32 * (unsigned int)a2; /*0x15e61*/
  v5 = *(_QWORD *)(a1 + 192) + 32 * (a3 + (__int64)((int)v4 - 32)); /*0x15e77*/
  v6 = v4 + a3 - 32; /*0x15e8b*/
  LOBYTE(v4) = 1; /*0x15e8e*/
  XhciInitTrbRing(v5, *(_QWORD *)(a1 + 200) + 16LL * (v6 << 6), 64, v4); /*0x15ea5*/
  return v5; /*0x15ead*/
}


// Function: XhciConfigureEndpointFull @ 0x15eb4 (0x539 bytes)

char __fastcall XhciConfigureEndpointFull(__int64 UsbHcPtr, __int64 dst, __int64 a3)
{
  __int64 v3; // r15
  __int64 dst_1; // rbx
  __int64 UsbHcPtr_1; // rdi
  unsigned __int64 v7; // rax
  unsigned __int16 n2047; // r13
  _DWORD *v9; // rcx
  unsigned __int64 v10; // rdx
  int v11; // r8d
  int n3_1; // r14d
  int *v13; // rsi
  unsigned int n2047_1; // r14d
  unsigned __int16 n2047_3; // r8
  __int64 n2047_4; // r12
  unsigned __int8 v17; // al
  char n5; // al
  unsigned __int8 n4; // dl
  unsigned __int8 v20; // r14
  int v21; // ecx
  unsigned int v22; // eax
  unsigned __int64 v23; // rdi
  char n4_1; // al
  unsigned __int64 v25; // rax
  __int16 v26; // cx
  __int16 v27; // r8
  unsigned int v28; // ecx
  unsigned int v29; // ecx
  char v30; // bl
  char v31; // bl
  unsigned __int8 v32; // al
  int v33; // eax
  _QWORD *v34; // rbx
  unsigned __int8 v35; // al
  char v36; // bl
  char v37; // cl
  __int64 v38; // rbx
  bool v39; // zf
  bool v41; // [rsp+40h] [rbp-58h]
  un... [10840 chars total]


// Function: UsbConfig_21 @ 0x163f0 (0x75 bytes)

char __fastcall UsbConfig_21(__int64 a1)
{
  char v1; // dl
  unsigned __int8 i; // cl
  __int64 v3; // r9

  v1 = *(_BYTE *)(a1 + 12); /*0x163f4*/
  if ( v1 >= 0 ) /*0x163f9*/
  {
    while ( 2 ) /*0x16402*/
    {
      for ( i = 1; ; ++i ) /*0x16402*/
      {
        if ( i >= 0x37u ) /*0x16407*/
        {
          Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\Xhci.c", 3931, (__int64)"((BOOLEAN)(0==1))"); /*0x1645c*/
          return 0; /*0x16461*/
        }
        v3 = 448LL * i; /*0x1640c*/
        if ( (*(_BYTE *)(v3 + UsbRtDispatchTable + 3056) & 3) == 3 && *(_BYTE *)(v3 + UsbRtDispatchTable + 3066) == v1 ) /*0x1642a*/
          break; /*0x1642a*/
      }
      a1 = v3 + UsbRtDispatchTable + 3056; /*0x16437*/
      v1 = *(_BYTE *)(a1 + 12); /*0x1643a*/
      if ( v1 >= 0 ) /*0x1643f*/
        continue; /*0x1643f*/
      break;
    }
  }
  return *(_BYTE *)(a1 + 13); /*0x16444*/
}


// Function: XhciEnableSlotDone @ 0x16468 (0xfd bytes)

char __fastcall XhciEnableSlotDone(__int64 UsbHcPtr, __int64 a2, __int64 a3, __int64 *a4)
{
  char result; // al
  __int64 v8; // rsi
  int v9; // ecx
  unsigned int v10; // edi
  unsigned int v11; // ecx
  __int64 v12; // rdi
  int v13; // r8d
  unsigned __int8 v14[24]; // [rsp+20h] [rbp-18h] BYREF

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x164bf*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
  {
    return -1; /*0x16494*/
  }
  v8 = *(_QWORD *)(UsbHcPtr + 72); /*0x164c1*/
  result = DebugLogPrint_0(UsbHcPtr, 9, v14); /*0x164d2*/
  if ( !result )
  {
    v9 = *(unsigned __int8 *)(v8 + 113); /*0x164db*/
    v10 = v9 * (32 * v14[0] - 32); /*0x164ec*/
    v11 = 32 * v9; /*0x164f0*/
    v12 = *(_QWORD *)(v8 + 208) + v10; /*0x164f5*/
    if ( v11 ) /*0x16500*/
      MemGetInfo(v12, v11); /*0x16505*/
    v13 = v14[0]; /*0x1650a*/
    *(_QWORD *)(*(_QWORD *)(v8 + 120) + 8LL * (v14[0] - 1) + 8) = v12; /*0x16525*/
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: Slot[%d] enabled, device context at %x\n", v13, v12);
    result = DebugLogPrint(UsbHcPtr, a2, v14[0]); /*0x1653e*/
    if ( !result ) /*0x16545*/
      *a4 = v12; /*0x16547*/
  }
  return result; /*0x1655e*/
}


// Function: XhciAddressDeviceDone @ 0x16568 (0x1a9 bytes)

char __fastcall XhciAddressDeviceDone(__int64 UsbHcPtr, __int64 a2)
{
  __int64 v5; // rsi
  _DWORD *v6; // r14
  unsigned __int64 v7; // rdx
  __int64 v8; // rcx
  unsigned __int8 v9; // r15
  unsigned __int8 v10; // bp
  unsigned __int64 v11; // rcx
  unsigned __int8 v12; // [rsp+60h] [rbp+18h] BYREF
  __int16 v13; // [rsp+68h] [rbp+20h] BYREF

  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL /*0x165b9*/
    || (UsbValidateDeviceEntry(a2) & 0x8000000000000000uLL) != 0LL
    || (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0
    || (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 )
  {
    return -1; /*0x1658e*/
  }
  v5 = *(_QWORD *)(UsbHcPtr + 72); /*0x165bb*/
  v6 = *(_DWORD **)(a2 + 216); /*0x165bf*/
  v7 = *(_QWORD *)(v5 + 208); /*0x165c6*/
  if ( (unsigned __int64)v6 >= v7 ) /*0x165d0*/
  {
    v8 = *(unsigned __int8 *)(v5 + 113); /*0x165da*/
    if ( (unsigned __int64)v6 <= v7 + 32 * (unsigned int)v8 * *(unsigned __int8 *)(v5 + 12) ) /*0x165ea*/
    {
      v9 = ((unsigned __int64)v6 - v7) / (32 * v8) + 1; /*0x16602*/
      v12 = v9; /*0x16609*/
      if ( *(_QWORD *)(*(_QWORD *)(v5 + 120) + 8LL * (v9 - 1) + 8) ) /*0x16619*/
      {
        v10 = 1; /*0x16628*/
        if ( (*v6 & 0xF8000000) >= 0x8000000 ) /*0x16635*/
        {
          do /*0x166c4*/
          {
            v11 = *(_QWORD *)(a2 + 216) + *(unsigned __int8 *)(v5 + 113) * (unsigned __int64)v10; /*0x16647*/
            if ( *(_QWORD *)(v11 + 8) ) /*0x1664e*/
            {
              if ( (*(_BYTE *)v11 & 7) == 1 ) /*0x1665b*/
              {
                v13 = v9 + (v10 << 8); /*0x16678*/
                DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v13); /*0x16682*/
              }
              MemGetInfo( /*0x166b0*/
                *(_QWORD *)(32 * ((unsigned __int8)(v10 - 1) + (__int64)(32 * v9 - 32)) + *(_QWORD *)(v5 + 192)),
                0x400u);
            }
            ++v10; /*0x166b8*/
          }
          while ( (unsigned int)v10 <= *v6 >> 27 ); /*0x166c4*/
        }
        DebugLogPrint_0(UsbHcPtr, 10, &v12); /*0x166d7*/
        *(_QWORD *)(*(_QWORD *)(v5 + 120) + 8LL * (v12 - 1) + 8) = 0; /*0x166ea*/
      }
      *(_QWORD *)(a2 + 216) = 0; /*0x166f0*/
    }
  }
  return 0; /*0x16704*/
}


// Function: XhciAddContextEntry @ 0x16714 (0x186 bytes)

char __fastcall XhciAddContextEntry(__int64 UsbHcPtr, __int64 a2, unsigned __int8 a3)
{
  char v6; // bp
  __int64 v7; // r14
  unsigned __int64 v8; // r8
  unsigned __int64 v9; // rcx
  unsigned __int8 v10; // r15
  unsigned __int8 v11; // bl
  _BYTE *v12; // rsi
  __int64 v13; // rcx
  unsigned __int8 v15[12]; // [rsp+20h] [rbp-28h] BYREF
  int v16; // [rsp+2Ch] [rbp-1Ch]
  __int16 v17; // [rsp+68h] [rbp+20h] BYREF

  v6 = 0; /*0x16735*/
  if ( (HcCheckInit(UsbHcPtr) & 0x8000000000000000uLL) != 0LL ) /*0x1673f*/
    return -1; /*0x1673f*/
  if ( (*(_BYTE *)(UsbHcPtr + 64) & 1) == 0 ) /*0x16749*/
    return -1; /*0x16749*/
  if ( (DebugLogPrint_13(UsbHcPtr, (unsigned int)*(unsigned __int8 *)(UsbHcPtr + 50) + 4) & 1) != 0 ) /*0x16760*/
    return -1; /*0x16760*/
  v7 = *(_QWORD *)(UsbHcPtr + 72); /*0x16766*/
  v8 = *(_QWORD *)(a2 + 216); /*0x1676a*/
  v9 = *(_QWORD *)(v7 + 208); /*0x16771*/
  if ( v8 < v9 || v8 > v9 + 32 * *(unsigned __int8 *)(v7 + 113) * (unsigned int)*(unsigned __int8 *)(v7 + 12) ) /*0x16797*/
    return -1; /*0x1687f*/
  v10 = (v8 - v9) / (32 * (unsigned __int64)*(unsigned __int8 *)(v7 + 113)) + 1; /*0x167b7*/
  if ( a3 ) /*0x167bd*/
    v11 = (a3 >> 7) + 2 * (a3 & 0xF); /*0x167ca*/
  else
    v11 = 1; /*0x167cf*/
  v12 = (_BYTE *)(v8 + *(unsigned __int8 *)(v7 + 113) * (unsigned __int64)v11); /*0x167d8*/
  if ( (*v12 & 7) == 1 ) /*0x167e1*/
  {
    v17 = v10 + (v11 << 8); /*0x167fb*/
    v6 = DebugLogPrint_0(UsbHcPtr, 15, (unsigned __int8 *)&v17); /*0x1680b*/
  }
  if ( (*(_DWORD *)v12 & 7u) - 3 <= 1 ) /*0x16819*/
  {
    v13 = *(_QWORD *)(v7 + 192) + 32 * ((unsigned __int8)(v11 - 1) + (__int64)(32 * v10 - 32)); /*0x1683f*/
    *(_QWORD *)v15 = *(_QWORD *)(v13 + 20) + *(unsigned __int8 *)(v13 + 28); /*0x16851*/
    v16 = v16 & 0xE0FFFF | ((v11 | (v10 << 8)) << 16); /*0x16869*/
    return DebugLogPrint_0(UsbHcPtr, 16, v15); /*0x16877*/
  }
  return v6; /*0x16890*/
}


// Function: DebugLogPrint @ 0x1689c (0x2f8 bytes)

char __fastcall DebugLogPrint(__int64 UsbHcPtr, __int64 a2, unsigned __int8 a3)
{
  __int64 v3; // rdi
  __int64 v4; // rbp
  int v5; // r15d
  int v8; // r8d
  __int64 v9; // rsi
  __int64 v10; // r14
  __int64 v12; // rbx
  __int64 v13; // rax
  unsigned __int64 v14; // r8
  unsigned __int64 v15; // r10
  unsigned __int8 n15; // cl
  int v17; // ecx
  int n2; // ecx
  __int64 v19; // rdx
  __int64 v20; // rcx
  bool v21; // bl
  char v22; // si
  __int16 v23; // [rsp+60h] [rbp+8h] BYREF
  unsigned __int8 v24; // [rsp+70h] [rbp+18h] BYREF

  v24 = a3; /*0x168a1*/
  v3 = *(_QWORD *)(UsbHcPtr + 72); /*0x168b5*/
  v4 = 0; /*0x168b9*/
  v5 = a3; /*0x168bb*/
  v8 = *(unsigned __int8 *)(v3 + 113); /*0x168c5*/
  v9 = *(_QWORD *)(v3 + 216); /*0x168ca*/
  v10 = *(_QWORD *)(v3 + 208) + (unsigned int)(32 * v8 * (v5 - 1)); /*0x168e0*/
  if ( (*(_DWORD *)(v10 + 12) & 0xF8000000) >= 0x10000000 ) /*0x168f5*/
    return -1; /*0x168f9*/
  if ( 33 * v8 ) /*0x168fe*/
    MemGetInfo(*(_QWORD *)(v3 + 216), (unsigned int)(33 * v8)); /*0x1690b*/
  *(_DWORD *)(v9 + 4) = 3; /*0x16910*/
  v12 = v9 + *(unsigned __int8 *)(v3 + 113); /*0x1691e*/
  *(_DWORD *)v12 &= 0x7F00000u; /*0x16921*/
  *(_DWORD *)v12 |= 0x8000000u; /*0x16927*/
  *(_BYTE *)(v12 + 6) = UsbConfig_21(a2); /*0x16930*/
  if ( *(_BYTE *)(a2 + 14) ) /*0x16933*/
  {
    switch ( *(_BYTE *)(a2 + 14) ) /*0x1693f*/
    {
      case 1: /*0x1693f*/
        *(_DWORD *)v12 &= 0xFF2FFFFF; /*0x16976*/
        *(_DWORD *)v12 |= 0x200000u; /*0x1697c*/
        break;
      case 2: /*0x1693f*/
        *(_DWORD *)v12 &= 0xFF1FFFFF; /*0x1696a*/
        *(_DWORD *)v12 |= 0x100000u; /*0x16970*/
        break;
      case 4: /*0x1693f*/
        *(_DWORD *)v12 &= 0xFF4FFFFF; /*0x1695e*/
        *(_DWORD *)v12 |= 0x400000u; /*0x16964*/
        break;
      case 0x40: /*0x1693f*/
        *(_DWORD *)v12 &= 0xFF5FFFFF; /*0x16950*/
        *(_DWORD *)v12 |= 0x500000u; /*0x16956*/
        break;
    }
  }
  else
  {
    *(_DWORD *)v12 &= 0xFF3FFFFF; /*0x16982*/
    *(_DWORD *)v12 |= 0x300000u; /*0x16988*/
  }
  v13 = FwVolDriverEntry(16, 0, *(_BYTE *)(a2 + 12), 0); /*0x16999*/
  if ( v13 ) /*0x169aa*/
  {
    v14 = *(_QWORD *)(v13 + 216); /*0x169b0*/
    v15 = *(_QWORD *)(v3 + 208); /*0x169b7*/
    if ( v14 < v15 || v14 > v15 + 32 * *(unsigned __int8 *)(v3 + 113) * (unsigned int)*(unsigned __int8 *)(v3 + 12) ) /*0x169db*/
      return 0; /*0x169db*/
    n15 = *(_BYTE *)(a2 + 13); /*0x169e1*/
    if ( n15 > 0xFu ) /*0x169ed*/
      n15 = 15; /*0x169ed*/
    *(_DWORD *)v12 ^= (*(_DWORD *)v12 ^ (*(_DWORD *)v14 | (n15 << (4 * *(_BYTE *)(v13 + 224))))) & 0xFFFFF; /*0x16a0d*/
    if ( (((*(_DWORD *)v12 & 0xF00000) - 0x100000) & 0xFFEFFFFF) == 0 ) /*0x16a1e*/
    {
      if ( (*(_DWORD *)v14 & 0xF00000) == 0x300000 ) /*0x16a2b*/
      {
        *(_BYTE *)(v12 + 8) = (*(_QWORD *)(v13 + 216) - *(_QWORD *)(v3 + 208)) /*0x16a4a*/
                            / (32
                             * (unsigned __int64)*(unsigned __int8 *)(v3 + 113))
                            + 1;
        LOBYTE(v13) = *(_BYTE *)(a2 + 13); /*0x16a4d*/
      }
      else
      {
        *(_BYTE *)(v12 + 8) = *(_BYTE *)(v14 + 8); /*0x16a57*/
        LODWORD(v13) = *(_DWORD *)(v14 + 8) >> 8; /*0x16a5e*/
      }
      *(_BYTE *)(v12 + 9) = v13; /*0x16a61*/
      *(_DWORD *)v12 ^= (*(_DWORD *)v12 ^ *(_DWORD *)v14) & 0x2000000; /*0x16a6e*/
    }
  }
  v17 = *(_DWORD *)(*(unsigned __int8 *)(v3 + 113) + v10) & 7; /*0x16a78*/
  if ( v17 ) /*0x16a7b*/
  {
    n2 = v17 - 1; /*0x16a7d*/
    if ( !n2 || n2 == 2 ) /*0x16a85*/
      v4 = *(_QWORD *)(v3 + 192) + 32LL * (32 * (unsigned __int8)v5 - 32); /*0x16a98*/
  }
  else
  {
    v4 = XhciAllocTrbFromRing(v3, v5, 0); /*0x16aaf*/
  }
  v19 = *(unsigned __int8 *)(v3 + 113); /*0x16ab8*/
  *(_DWORD *)(v9 + 2 * v19 + 4) &= 0xFFFFFFE7; /*0x16ac1*/
  *(_DWORD *)(v9 + 2 * v19 + 4) |= 0x20u; /*0x16ac6*/
  *(_WORD *)(v9 + 2 * v19 + 6) = *(_WORD *)(a2 + 16); /*0x16ad0*/
  v20 = *(_QWORD *)(v4 + 20) | *(unsigned __int8 *)(v4 + 28); /*0x16ad9*/
  *(_DWORD *)(v9 + 2 * v19 + 4) |= 6u; /*0x16add*/
  *(_WORD *)(v9 + 2 * v19 + 16) = 8; /*0x16ae2*/
  *(_QWORD *)(v9 + 2 * v19 + 8) = v20; /*0x16ae7*/
  v21 = (((*(_DWORD *)v12 & 0xF00000) - 0x400000) & 0xFFEFFFFF) != 0 && *(_DWORD *)(v10 + 12) < 0x8000000u; /*0x16b07*/
  v23 = (unsigned __int8)v5 | (v21 << 8); /*0x16b25*/
  v22 = DebugLogPrint_0(UsbHcPtr, 11, (unsigned __int8 *)&v23); /*0x16b32*/
  if ( v22 ) /*0x16b37*/
  {
    DebugLogPrint_0(UsbHcPtr, 10, &v24); /*0x16b46*/
    *(_QWORD *)(*(_QWORD *)(v3 + 120) + 8LL * (v24 - 1) + 8) = 0; /*0x16b5c*/
    return v22; /*0x16b62*/
  }
  if ( !v21 )
    DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "XHCI: new device address %d\n", *(unsigned __int8 *)(v10 + 12));
  return 0; /*0x16b84*/
}


// Function: UsbGetInfo_2 @ 0x16b94 (0xa9 bytes)

char __fastcall UsbGetInfo_2(__int64 a1, __int64 UsbHcPtr, unsigned __int8 a3, __int64 n0x80000)
{
  unsigned __int8 n0x80000_1; // bp
  unsigned int n0x2710; // ebx
  _BYTE *v9; // rdi

  n0x80000_1 = n0x80000; /*0x16bb5*/
  DebugLogPrint_14(UsbHcPtr, *(_DWORD *)(a1 + 28) + 4 * a3, (unsigned __int8)n0x80000); /*0x16bc2*/
  n0x2710 = 0; /*0x16bc7*/
  if ( !a3 ) /*0x16bcc*/
    return -1; /*0x16bce*/
  v9 = (_BYTE *)(*(_QWORD *)(a1 + 208) /*0x16bf2*/
               + *(unsigned __int8 *)(a1 + 113) * (unsigned __int64)n0x80000_1
               + 32 * *(unsigned __int8 *)(a1 + 113) * ((unsigned int)a3 - 1));
  do /*0x16c1b*/
  {
    if ( (*v9 & 7) == 1 ) /*0x16bff*/
      break; /*0x16bff*/
    (*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0x16c0d*/
    ++n0x2710; /*0x16c13*/
  }
  while ( n0x2710 < 0x2710 ); /*0x16c1b*/
  return -((*v9 & 7) != 1); /*0x16c37*/
}


// Function: UsbGetInfo_8 @ 0x16c40 (0x55 bytes)

unsigned __int64 __fastcall sub_16C40(__int64 UsbHcPtr, __int64 TmpRdx, int a3)
{
  unsigned int v4; // edi
  __int64 v6; // rbx

  v4 = a3 - *(_DWORD *)(UsbHcPtr + 16); /*0x16c55*/
  if ( (unsigned __int64)v4 + 8 > *(_QWORD *)(UsbHcPtr + 24) ) /*0x16c62*/
    return 0; /*0x16c64*/
  v6 = (unsigned int)DebugLogPrint_13(UsbHcPtr, v4); /*0x16c72*/
  return v6 | ((unsigned __int64)(unsigned int)DebugLogPrint_13(UsbHcPtr, v4 + 4) << 32); /*0x16c8f*/
}


// Function: DebugLogPrint_18 @ 0x16c98 (0x53 bytes)

void __fastcall sub_16C98(__int64 a1, __int64 a2, int a3, __int64 a4)
{
  int v4; // rdi^4
  unsigned int v5; // ebx

  v4 = HIDWORD(a4); /*0x16caa*/
  v5 = a3 - *(_DWORD *)(a1 + 16); /*0x16cad*/
  if ( (unsigned __int64)v5 + 8 <= *(_QWORD *)(a1 + 24) ) /*0x16cbd*/
  {
    DebugLogPrint_14(a1, v5, a4); /*0x16cc4*/
    DebugLogPrint_14(a1, v5 + 4, v4); /*0x16cd6*/
  }
}


// Function: XhciInitTrbRing @ 0x16cec (0x76 bytes)

__int64 __fastcall XhciInitTrbRing(__int64 a1, int *buf, unsigned int n64, char a4)
{
  unsigned __int64 n4; // r8
  __int64 v8; // rcx
  unsigned int v9; // eax

  *(_DWORD *)(a1 + 8) = n64; /*0x16cfb*/
  n4 = 16LL * n64; /*0x16d09*/
  *(_QWORD *)a1 = buf; /*0x16d13*/
  *(_QWORD *)(a1 + 12) = &buf[n4 / 4 - 4]; /*0x16d16*/
  *(_BYTE *)(a1 + 28) = 1; /*0x16d1d*/
  *(_QWORD *)(a1 + 20) = buf; /*0x16d21*/
  if ( n4 ) /*0x16d28*/
    MemZero(buf, 0, n4); /*0x16d2f*/
  if ( a4 ) /*0x16d37*/
  {
    v8 = *(_QWORD *)(a1 + 12); /*0x16d39*/
    v9 = *(_DWORD *)(v8 + 12) & 0xFFFF1BFF; /*0x16d40*/
    *(_QWORD *)v8 = buf; /*0x16d45*/
    *(_DWORD *)(v8 + 12) = v9 | 0x1802; /*0x16d4d*/
  }
  return 0; /*0x16d5c*/
}


// Function: XhciCheckEndpointAddress @ 0x16d64 (0x75 bytes)

char __fastcall XhciCheckEndpointAddress(__int64 a1, unsigned __int8 k)
{
  unsigned __int8 v2; // al
  unsigned int k_1; // r8d
  unsigned __int8 v6; // r8
  unsigned __int8 v7; // dl
  __int64 v8; // r9
  unsigned __int8 v9; // al
  unsigned int k_2; // ecx

  v2 = *(_BYTE *)(a1 + 81); /*0x16d64*/
  if ( v2 ) /*0x16d6c*/
  {
    k_1 = (unsigned __int8)*(_DWORD *)(a1 + 80); /*0x16d72*/
    if ( k >= k_1 && k < k_1 + v2 ) /*0x16d88*/
      return 1; /*0x16d8c*/
  }
  v6 = *(_BYTE *)(a1 + 488); /*0x16d8d*/
  if ( v6 ) /*0x16d97*/
  {
    v7 = 0; /*0x16d99*/
    v8 = *(_QWORD *)(a1 + 88); /*0x16da0*/
    while ( 1 ) /*0x16dab*/
    {
      v9 = *(_BYTE *)(v8 + 12LL * v7 + 9); /*0x16dab*/
      if ( v9 ) /*0x16db2*/
      {
        k_2 = (unsigned __int8)*(_DWORD *)(v8 + 12LL * v7 + 8); /*0x16db9*/
        if ( k >= k_2 && k < k_2 + v9 ) /*0x16dcd*/
          break; /*0x16dcd*/
      }
      if ( ++v7 >= v6 ) /*0x16dd4*/
        return 0; /*0x16dd4*/
    }
    return 1; /*0x16dcd*/
  }
  return 0; /*0x16d8c*/
}


// Function: UsbFindDeviceByPointer @ 0x16ddc (0x53 bytes)

__int64 __fastcall UsbFindDeviceByPointer(__int64 a1, __int64 n24)
{
  unsigned __int8 v3; // dl
  __int64 v4; // r8

  if ( !a1 ) /*0x16de2*/
    return 0; /*0x16e24*/
  v3 = 1; /*0x16deb*/
  while ( 1 ) /*0x16df7*/
  {
    v4 = UsbRtDispatchTable + 448LL * v3; /*0x16df7*/
    if ( (*(_BYTE *)(v4 + 3056) & 3) == 3 && *(_QWORD *)(v4 + n24 + 3056) && *(_QWORD *)(v4 + n24 + 3056) == a1 ) /*0x16e1b*/
      break; /*0x16e1b*/
    if ( ++v3 >= 0x37u ) /*0x16e22*/
      return 0; /*0x16e22*/
  }
  return v4 + 3056; /*0x16e26*/
}


// Function: UsbMsIsrHandler @ 0x16e30 (0x33 bytes)

__int64 (__fastcall *__fastcall UsbMsIsrHandler(__int64 a1))()
{
  *(_DWORD *)a1 = 769; /*0x16e37*/
  *(_QWORD *)(a1 + 8) = UsbMsInitialize; /*0x16e3d*/
  *(_QWORD *)(a1 + 16) = UsbMsEmptyFunc; /*0x16e48*/
  *(_QWORD *)(a1 + 24) = UsbHidConfigureDevice; /*0x16e53*/
  *(_QWORD *)(a1 + 32) = UsbHidGetReportDesc; /*0x16e5e*/
  return UsbHidGetReportDesc; /*0x16e62*/
}


// Function: UsbMsInitialize @ 0x16e64 (0xa4 bytes)

__int64 UsbMsInitialize()
{
  __int64 UsbRtDispatchTable; // rcx

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x16e68*/
  *(_BYTE *)(UsbRtDispatchTable + 30091) = 0; /*0x16e71*/
  *(_QWORD *)(UsbRtDispatchTable + 30120) = UsbRtDispatchTable + 29940; /*0x16e7e*/
  *(_QWORD *)(UsbRtDispatchTable + 30160) = 0; /*0x16e8c*/
  *(_QWORD *)(UsbRtDispatchTable + 30104) = UsbRtDispatchTable + 29956; /*0x16e9a*/
  *(_QWORD *)(UsbRtDispatchTable + 30112) = UsbRtDispatchTable + 29956; /*0x16ea1*/
  *(_WORD *)(UsbRtDispatchTable + 30094) |= 0x18Au; /*0x16ead*/
  *(_BYTE *)(UsbRtDispatchTable + 30085) = 0; /*0x16eb4*/
  *(_BYTE *)(UsbRtDispatchTable + 30146) = 64; /*0x16eba*/
  dword_1C480 = 0; /*0x16ec1*/
  word_1C484 = 0; /*0x16ec7*/
  LOBYTE(byte_1C487) = 0; /*0x16ece*/
  *(_DWORD *)(UsbRtDispatchTable + 31456) = 0; /*0x16ed4*/
  *(_QWORD *)(UsbRtDispatchTable + 30320) = UsbRtDispatchTable + 30304; /*0x16ee1*/
  *(_QWORD *)(UsbRtDispatchTable + 30328) = UsbRtDispatchTable + 30304; /*0x16ee8*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBMSInitialize: Head and Tail are at %x\n", UsbRtDispatchTable + 30304);
  return UsbRegisterNotifyFunc((__int64)UsbHidGetReportDescDispatch); /*0x16eff*/
}


// Function: UsbMsEmptyFunc @ 0x16f08 (0x1e bytes)

char __fastcall UsbMsEmptyFunc(__int64 a1, char n3, char a3, char a4)
{
  char result; // al

  if ( n3 != 3 ) /*0x16f0b*/
    return -1; /*0x16f0b*/
  result = 1; /*0x16f12*/
  if ( *(__int16 *)(a1 + 108) < 0 && (a3 != 1 || (unsigned __int8)(a4 - 1) > 1u) ) /*0x16f21*/
    return -1; /*0x16f23*/
  return result; /*0x16f25*/
}


// Function: UsbHidConfigureDevice @ 0x16f28 (0x4ed bytes)

__int64 __fastcall UsbHidConfigureDevice(__int64 a1, __int64 DevEntry, __int64 a3, unsigned __int16 a4)
{
  __int64 v5; // rbx
  _BYTE *v6; // r13
  unsigned __int8 *v8; // r14
  unsigned __int8 *v10; // rbx
  unsigned __int64 v11; // r15
  unsigned __int8 n5; // al
  unsigned __int8 v13; // dl
  unsigned int v14; // ecx
  __int64 v15; // r9
  char v16; // di
  unsigned __int8 *v18; // rbx
  char v19; // r15
  unsigned __int16 v20; // ax
  int v21; // ecx
  int v22; // ecx
  __int64 v23; // rdx
  unsigned __int16 v24; // bx
  __int64 UsbRtDispatchTable; // r9
  __int64 DevEntry_1; // rax
  __int64 v27; // rdx
  __int64 n2047; // rdx
  __int64 n1047; // rcx
  unsigned __int64 n0x37; // rcx
  __int64 v31; // rdx
  __int64 v32; // rax
  __int64 v33; // rax
  unsigned __int64 v34; // [rsp+68h] [rbp+38h]
  unsigned __int64 v35; // [rsp+68h] [rbp+38h]
  unsigned __int64 v36; // [rsp+68h] [rbp+38h]

  *(_BYTE *)(DevEntry + 4) = 1; /*0x16f4a*/
  v5 = a4; /*0x16f50*/
  *(_QWORD *)(DevEntry + 312) = 0; /*0x16f54*/
  v6 = (_BYTE *)(DevEntry + 288); /*0x16f5b*/
  *(_BYTE *)(DevEntry + 64) = 0; /*0x16f62*/
  *(_BYTE *)(DevEntry + 68) = 0; /*0x16f67*/
  v8 = 0; /*0x16f74*/
  MemGetInfo(DevEntry + 288, 0x18u); /*0x16f84*/
  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "USBHIDConfigureDevice...  \n"); /*0x16f94*/
  *(_BYTE *)(DevEntry + 21) = UsbRegisterNotifyFunc((__int64)UsbHidGetReportDescDispatch); /*0x16fa5*/
  v10 = (unsigned __int8 *)(a3 + v5 + *(unsigned __int8 *)(a3 + v5)); /*0x16fb4*/
  v11 = a3 + *(unsigned __int16 *)(a3 + 2); /*0x16fb7*/
  n5 = v10[1]; /*0x16fba*/
  if ( n5 != 4 )
  {
    do
    {
      if ( (unsigned __int64)v10 >= v11 || !*v10 ) /*0x16fd5*/
        break; /*0x16fd8*/
      if ( n5 == 33 )
      {
        v8 = v10; /*0x16fde*/
      }
      else if ( n5 == 5 && (v10[3] & 3) == 3 )
      {
        v13 = v10[2]; /*0x16ff0*/
        if ( (v13 & 0x80u) == 0 )
        {
          if ( !*(_BYTE *)(DevEntry + 68) )
          {
            *(_BYTE *)(DevEntry + 68) = v13; /*0x17027*/
            v15 = *((unsigned __int16 *)v10 + 2); /*0x17032*/
            *(_WORD *)(DevEntry + 66) = *((_WORD *)v10 + 2); /*0x17035*/
            DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "interrupt out endpoint addr: %x, max packet size: %x\n", v13, v15);
          }
        }
        else if ( !*(_BYTE *)(DevEntry + 64) )
        {
          *(_BYTE *)(DevEntry + 64) = v13; /*0x16ffd*/
          v14 = *((unsigned __int16 *)v10 + 2); /*0x17000*/
          *(_WORD *)(DevEntry + 62) = v14; /*0x17004*/
          *(_BYTE *)(DevEntry + 320) = v10[6]; /*0x17019*/
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "interrupt in endpoint addr: %x, max packet size: %x\n", v13, v14);
        }
      }
      v10 += *v10; /*0x1704b*/
      n5 = v10[1]; /*0x1704e*/
    }
    while ( n5 != 4 );
    v6 = (_BYTE *)(DevEntry + 288); /*0x17059*/
  }
  v16 = 0; /*0x17060*/
  if ( !*(_BYTE *)(DevEntry + 64) ) /*0x17062*/
    return 0; /*0x17066*/
  if ( *(__int16 *)(DevEntry + 108) < 0 ) /*0x17078*/
  {
    HIDWORD(v34) = *(unsigned __int8 *)(DevEntry + 19); /*0x17081*/
    LODWORD(v34) = 2849; /*0x17088*/
    SataDriverEntry(a1, DevEntry, v34, 100, 0); /*0x1709f*/
  }
  HIDWORD(v35) = *(unsigned __int8 *)(DevEntry + 19); /*0x170ab*/
  LODWORD(v35) = 2593; /*0x170b2*/
  SataDriverEntry(a1, DevEntry, v35, 100, 0); /*0x170c9*/
  if ( *(__int16 *)(DevEntry + 108) < 0 ) /*0x170d2*/
  {
    v21 = *(unsigned __int8 *)(DevEntry + 73); /*0x171d0*/
    *(_WORD *)(DevEntry + 322) = *(_WORD *)(DevEntry + 62); /*0x171d8*/
    v22 = v21 - 1; /*0x171df*/
    if ( v22 ) /*0x171e2*/
    {
      if ( v22 == 1 ) /*0x171e7*/
        *(_QWORD *)(DevEntry + 312) = 2; /*0x171e9*/
    }
    else
    {
      *(_QWORD *)(DevEntry + 312) = 1; /*0x171f6*/
    }
  }
  else
  {
    if ( !v8 ) /*0x170e8*/
      return 0; /*0x170e8*/
    if ( *(_WORD *)(v8 + 7) ) /*0x170ee*/
    {
      v18 = (unsigned __int8 *)UsbConfig_1(((unsigned __int64)*(unsigned __int16 *)(v8 + 7) + 31) >> 5); /*0x1710b*/
      if ( !v18 ) /*0x17111*/
        return 0; /*0x17111*/
      WORD2(v36) = *(unsigned __int8 *)(DevEntry + 19); /*0x1711b*/
      HIWORD(v36) = *(_WORD *)(v8 + 7); /*0x17124*/
      LODWORD(v36) = 570427009; /*0x17128*/
      while ( 1 ) /*0x17149*/
      {
        v19 = SataDriverEntry(a1, DevEntry, v36, 500, (__int64)v18); /*0x17149*/
        if ( !v19 ) /*0x1714e*/
          break; /*0x1714e*/
        if ( (unsigned __int8)++v16 >= 3u ) /*0x17157*/
        {
          DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "Failed to get the report descriptor\n"); /*0x17164*/
          goto LABEL_28; /*0x17169*/
        }
      }
      *(_WORD *)(DevEntry + 294) = *(_WORD *)(v8 + 7); /*0x17176*/
      UsbHidParseReportDescriptor(DevEntry, v18); /*0x1717d*/
      *(_WORD *)(DevEntry + 322) = UsbCalculateEndpointBandwidth(DevEntry); /*0x1718a*/
LABEL_28:
      FwVolConfig((unsigned __int64)v18, ((unsigned __int64)*(unsigned __int16 *)(v8 + 7) + 31) >> 5); /*0x171a4*/
      if ( v19 == -1 ) /*0x171ad*/
        return 0; /*0x171ad*/
    }
    *v6 |= 1u; /*0x171b5*/
    v20 = *(_WORD *)(DevEntry + 62); /*0x171ba*/
    if ( *(_WORD *)(DevEntry + 322) < v20 ) /*0x171c5*/
      *(_WORD *)(DevEntry + 322) = v20; /*0x171c7*/
  }
  DebugPrint(
    0xFFFFFFFFFFFFFFFFuLL,
    "UsbHidDevType: %x, PollingLength: %x, PollInterval: %x\n",
    *(_QWORD *)(DevEntry + 312),
    *(unsigned __int16 *)(DevEntry + 322),
    *(unsigned __int8 *)(DevEntry + 320));
  if ( (*(_BYTE *)(DevEntry + 312) & 1) != 0 ) /*0x17232*/
  {
    *(_QWORD *)(DevEntry + 24) = 0; /*0x1723b*/
    v24 = DebugLogPrint_16((_BYTE *)DevEntry); /*0x1724a*/
    if ( v24 == 0xFFFF && (v24 = DebugLogPrint_16(0), v24 == 0xFFFF) ) /*0x17261*/
    {
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x17263*/
      DevEntry_1 = 0; /*0x1726a*/
    }
    else
    {
      if ( SataConfig(DevEntry + 328, v23, 1) == -1 || SataConfig(DevEntry + 344, v27, 2) == -1 ) /*0x1729d*/
        return 0; /*0x1729d*/
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x172a3*/
      *(_QWORD *)(UsbRtDispatchTable + 8LL * v24 + 30168) = DevEntry; /*0x172ad*/
      if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 && ((*v6 & 8) != 0 || *(__int16 *)(DevEntry + 108) < 0) ) /*0x172c7*/
      {
        FwVolDriverEntry_0(n1047, n2047); /*0x172c9*/
        UsbRtDispatchTable = UsbRtDispatchTable; /*0x172ce*/
      }
      DevEntry_1 = DevEntry; /*0x172d5*/
    }
    if ( !DevEntry_1 ) /*0x172db*/
      return 0; /*0x1706a*/
  }
  else
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x172e2*/
  }
  if ( *(_WORD *)(DevEntry + 6) != 1118 || *(_WORD *)(DevEntry + 8) != 1872 ) /*0x17310*/
    goto LABEL_64; /*0x17310*/
  if ( *(_BYTE *)(DevEntry + 64) != 0x81 ) /*0x1731a*/
  {
    n0x37 = 1; /*0x17320*/
    v31 = UsbRtDispatchTable + 3504; /*0x17325*/
    while ( (*(_BYTE *)v31 & 3) != 3 /*0x17341*/
         || *(_BYTE *)(v31 + 10) != *(_BYTE *)(DevEntry + 10)
         || *(_BYTE *)(v31 + 64) != 0x81 )
    {
      ++n0x37; /*0x17343*/
      v31 += 448; /*0x17346*/
      if ( n0x37 >= 0x37 ) /*0x17351*/
        goto LABEL_64; /*0x17351*/
    }
    v32 = *(_QWORD *)(v31 + 312); /*0x17355*/
    if ( (v32 & 0x8000000000000017uLL) != 0 /*0x1737b*/
      && *(_WORD *)(v31 + 322)
      && *(_BYTE *)(v31 + 320)
      && ((v32 & 2) == 0 || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x8000) == 0) )
    {
      (*(void (__fastcall **)(__int64))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x17398*/
                                      + UsbRtDispatchTable
                                      + 232))(a1);
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x173a0*/
    }
LABEL_64:
    v33 = *(_QWORD *)(DevEntry + 312); /*0x173a7*/
    if ( (v33 & 0x8000000000000017uLL) != 0 /*0x173cd*/
      && *(_WORD *)(DevEntry + 322)
      && *(_BYTE *)(DevEntry + 320)
      && ((v33 & 2) == 0 || (*(_DWORD *)(UsbRtDispatchTable + 4) & 0x8000) == 0) )
    {
      (*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(a1 + 1) - 16) >> 4) + 4) /*0x173ed*/
                                               + UsbRtDispatchTable
                                               + 232))(
        a1,
        DevEntry);
    }
  }
  return DevEntry; /*0x17407*/
}


// Function: UsbHidGetReportDesc @ 0x17418 (0x144 bytes)

char __fastcall UsbHidGetReportDesc(__int64 a1)
{
  __int64 v2; // rcx
  unsigned __int16 i; // di
  __int64 i_1; // rsi
  __int64 v5; // rdx
  unsigned __int64 v6; // rcx

  v2 = *(_QWORD *)(*(_QWORD *)(UsbRtDispatchTable + 27696) + 8LL * (*(unsigned __int8 *)(a1 + 11) - 1)); /*0x17452*/
  (*(void (__fastcall **)(__int64, __int64))(200LL * (((*(unsigned __int8 *)(v2 + 1) - 16) >> 4) + 4) /*0x1746f*/
                                           + UsbRtDispatchTable
                                           + 224))(
    v2,
    a1);
  *(_BYTE *)(a1 + 64) = 0; /*0x17479*/
  if ( (*(_BYTE *)(a1 + 312) & 1) != 0 ) /*0x17484*/
    DebugLogPrint_17((_BYTE *)a1); /*0x17489*/
  if ( *(_QWORD *)(a1 + 304) ) /*0x1748e*/
  {
    for ( i = 0; i < *(unsigned __int8 *)(a1 + 296); *(_QWORD *)(*(_QWORD *)(a1 + 304) + 8 * i_1) = 0 ) /*0x1749e*/
    {
      i_1 = i; /*0x174ae*/
      v5 = *(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i); /*0x174b1*/
      v6 = *(_QWORD *)(v5 + 32); /*0x174b5*/
      if ( v6 ) /*0x174bc*/
      {
        FwVolConfig(v6, (2 * (unsigned __int64)*(unsigned __int16 *)(v5 + 30) + 31) >> 5); /*0x174ce*/
        *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i) + 32LL) = 0; /*0x174de*/
      }
      FwVolConfig(*(_QWORD *)(*(_QWORD *)(a1 + 304) + 8LL * i++), 2u); /*0x174f2*/
    }
    FwVolConfig(*(_QWORD *)(a1 + 304), (unsigned __int16)(8 * *(unsigned __int8 *)(a1 + 296) + 31) >> 5); /*0x1752c*/
    *(_QWORD *)(a1 + 304) = 0; /*0x17531*/
    *(_WORD *)(a1 + 294) = 0; /*0x17538*/
  }
  return 0; /*0x17555*/
}


// Function: UsbHidParseReportDescriptor @ 0x17b30 (0x125 bytes)

char __fastcall UsbHidParseReportDescriptor(__int64 DevEntry, unsigned __int8 *a2)
{
  unsigned __int8 *v2; // rbx
  unsigned __int8 *v3; // rdi
  char result; // al
  unsigned __int8 v5; // cl
  char *src; // rbx
  unsigned __int8 dst_1; // dl
  __int64 count; // rcx
  int buf_1[8]; // [rsp+20h] [rbp-E0h] BYREF
  int *buf_2; // [rsp+40h] [rbp-C0h]
  __int16 n768; // [rsp+48h] [rbp-B8h]
  int buf[388]; // [rsp+50h] [rbp-B0h] BYREF
  int n67240192; // [rsp+670h] [rbp+570h]
  char count_1; // [rsp+678h] [rbp+578h]
  int dst; // [rsp+679h] [rbp+579h] BYREF
  __int16 v16; // [rsp+67Dh] [rbp+57Dh]
  char v17; // [rsp+67Fh] [rbp+57Fh]

  v2 = a2; /*0x17b4e*/
  v3 = &a2[*(unsigned __int16 *)(DevEntry + 294)]; /*0x17b51*/
  MemZero(buf, 0, 0x600u); /*0x17b64*/
  MemZero(buf_1, 0, 0x30u); /*0x17b74*/
  count_1 = 0; /*0x17b7b*/
  dst = 0; /*0x17b82*/
  v16 = 0; /*0x17b88*/
  v17 = 0; /*0x17b8f*/
  buf_2 = buf; /*0x17b9a*/
  result = 0; /*0x17b9f*/
  n768 = 768; /*0x17ba4*/
  n67240192 = 67240192; /*0x17ba9*/
  while ( v2 < v3 ) /*0x17c3c*/
  {
    v5 = *v2; /*0x17bb8*/
    src = (char *)(v2 + 1); /*0x17bbb*/
    BYTE1(dst) = v5 >> 4; /*0x17bc5*/
    dst_1 = (v5 >> 2) & 3; /*0x17bd3*/
    LOBYTE(dst) = dst_1; /*0x17bd6*/
    count = *((unsigned __int8 *)&n67240192 + (v5 & 3)); /*0x17bdc*/
    count_1 = count; /*0x17be4*/
    result = count + (_BYTE)src; /*0x17bed*/
    if ( &src[count] > (char *)v3 ) /*0x17bf4*/
      break; /*0x17bf4*/
    if ( count ) /*0x17bf9*/
    {
      MemConfig((char *)&dst + 3, src, (unsigned int)count); /*0x17c05*/
      dst_1 = dst; /*0x17c0a*/
      LOBYTE(count) = count_1; /*0x17c10*/
    }
    v2 = (unsigned __int8 *)&src[(unsigned __int8)count]; /*0x17c20*/
    result = ((char (__fastcall *)())funcs_17C35[dst_1])(); /*0x17c35*/
  }
  return result; /*0x17c4a*/
}


// Function: UsbCalculateEndpointBandwidth @ 0x17c58 (0xbf bytes)

__int64 __fastcall UsbCalculateEndpointBandwidth(__int64 DevEntry)
{
  unsigned __int8 v2; // al
  unsigned __int16 v3; // r9
  __int64 v4; // r10
  __int64 v5; // r11
  unsigned __int16 n0x100; // ax
  int *buf_1; // rdx
  unsigned int v8; // ecx
  int buf[128]; // [rsp+20h] [rbp-208h] BYREF

  MemZero(buf, 0, 0x200u); /*0x17c7a*/
  v2 = *(_BYTE *)(DevEntry + 296); /*0x17c7f*/
  v3 = 0; /*0x17c87*/
  if ( v2 ) /*0x17c90*/
  {
    v4 = *(_QWORD *)(DevEntry + 304); /*0x17c92*/
    v5 = v2; /*0x17c99*/
    do /*0x17cc4*/
    {
      if ( (**(_BYTE **)v4 & 0x10) != 0 ) /*0x17ca3*/
        *((_WORD *)buf + *(unsigned __int8 *)(*(_QWORD *)v4 + 1LL)) += *(_WORD *)(*(_QWORD *)v4 + 4LL) /*0x17cb7*/
                                                                     * *(unsigned __int8 *)(*(_QWORD *)v4 + 8LL);
      v4 += 8; /*0x17cbd*/
      --v5; /*0x17cc1*/
    }
    while ( v5 ); /*0x17cc4*/
  }
  n0x100 = 0; /*0x17cc6*/
  buf_1 = buf; /*0x17cc9*/
  do /*0x17cfc*/
  {
    if ( *(_WORD *)buf_1 ) /*0x17cce*/
    {
      v8 = ((unsigned int)*(unsigned __int16 *)buf_1 + 7) >> 3; /*0x17cd9*/
      if ( n0x100 ) /*0x17cdf*/
        LOWORD(v8) = v8 + 1; /*0x17ce1*/
      if ( v3 < (unsigned __int16)v8 ) /*0x17ce8*/
        v3 = v8; /*0x17ce8*/
    }
    ++n0x100; /*0x17ced*/
    buf_1 = (int *)((char *)buf_1 + 2); /*0x17cf0*/
  }
  while ( n0x100 < 0x100u ); /*0x17cfc*/
  return v3; /*0x17d12*/
}


// Function: UsbHidGetReportDescDispatch @ 0x17d18 (0x13b bytes)

char __fastcall UsbHidGetReportDescDispatch(__int64 a1, __int64 a2, _WORD *a3, unsigned __int8 *n44, unsigned __int16 a5)
{
  __int16 v7; // si
  __int64 *v8; // rax
  unsigned __int8 v9; // cl
  unsigned __int8 v10; // al
  char **v11; // r9
  __int64 v12; // r11
  char *v13; // rax
  char v14; // si
  char v15; // dl
  unsigned __int16 v16; // dx
  __int64 v17; // r10
  __int64 v18; // rcx
  __int64 v19; // rcx
  int v21; // [rsp+20h] [rbp-28h]

  v7 = 0; /*0x17d3f*/
  if ( qword_1C3D8[0] ) /*0x17d46*/
  {
    v8 = qword_1C3D8; /*0x17d4f*/
    while ( !((unsigned __int8 (__fastcall *)(__int64, unsigned __int8 *, _QWORD))*v8)(a2, n44, a5) ) /*0x17d62*/
    {
      v8 = &qword_1C3D8[(unsigned __int16)++v7]; /*0x17d6f*/
      if ( !*v8 ) /*0x17d73*/
        goto LABEL_5; /*0x17d76*/
    }
  }
  else
  {
LABEL_5:
    v9 = *(_BYTE *)(a2 + 73); /*0x17d78*/
    if ( (*(_BYTE *)(a2 + 288) & 1) != 0 ) /*0x17d82*/
    {
      v10 = *(_BYTE *)(a2 + 296); /*0x17d84*/
      if ( v10 ) /*0x17d8c*/
      {
        v11 = *(char ***)(a2 + 304); /*0x17d8e*/
        v12 = v10; /*0x17d95*/
        do /*0x17dff*/
        {
          v13 = *v11; /*0x17d99*/
          v14 = **v11; /*0x17d9c*/
          if ( (v14 & 0x10) != 0 ) /*0x17da3*/
          {
            v15 = v13[1]; /*0x17da5*/
            if ( !v15 || v15 == *n44 ) /*0x17dae*/
            {
              if ( *((_WORD *)v13 + 1) == 7 ) /*0x17db8*/
                v9 = 1; /*0x17db8*/
              if ( *((_WORD *)v13 + 1) == 1 ) /*0x17dc1*/
              {
                v16 = *((_WORD *)v13 + 15); /*0x17dc3*/
                if ( v16 ) /*0x17dca*/
                {
                  a3 = (_WORD *)*((_QWORD *)v13 + 4); /*0x17dd1*/
                  v17 = v16; /*0x17dd5*/
                  do /*0x17df6*/
                  {
                    if ( *a3 == 48 ) /*0x17dde*/
                      v9 = ((v14 & 4) == 0) | 2; /*0x17ded*/
                    ++a3; /*0x17def*/
                    --v17; /*0x17df3*/
                  }
                  while ( v17 ); /*0x17df6*/
                }
              }
            }
          }
          ++v11; /*0x17df8*/
          --v12; /*0x17dfc*/
        }
        while ( v12 ); /*0x17dff*/
      }
    }
    v18 = (unsigned int)v9 - 1; /*0x17e04*/
    if ( (_DWORD)v18 ) /*0x17e07*/
    {
      v19 = (unsigned int)(v18 - 1); /*0x17e09*/
      if ( (_DWORD)v19 ) /*0x17e0c*/
      {
        if ( (_DWORD)v19 == 1 ) /*0x17e11*/
          UsbPointParseHidReportEx(v19, a2, (__int64)a3, n44); /*0x17e19*/
      }
      else
      {
        UsbPointParseHidReport(v19, a2, (__int64)a3, n44); /*0x17e26*/
      }
    }
    else
    {
      UsbHidProcessReport(v18, a2, (__int64)a3, n44, v21); /*0x17e33*/
    }
  }
  return 0; /*0x17e49*/
}


// Function: UsbHidMatchDeviceTopology @ 0x17f60 (0x1f9 bytes)

char __fastcall UsbHidMatchDeviceTopology(__int64 TmpRcx, __int64 TmpRdx, __int16 a3, char a4, char SkipMatch)
{
  __int64 v6; // rbx
  __int16 v7; // di
  unsigned int v8; // r15d
  unsigned __int16 n5; // si
  unsigned int v10; // eax
  signed __int8 TmpRcx_2; // r8
  unsigned __int8 TmpRdx_2; // r13
  __int16 n5_1; // bp
  unsigned int v14; // r14d
  __int64 v15; // rax
  bool v16; // zf
  char v17; // al
  char v19; // al
  unsigned __int16 i; // dx
  char v21; // al
  char v22; // al
  char TmpRcx_1; // [rsp+60h] [rbp+8h]
  char TmpRdx_1; // [rsp+68h] [rbp+10h]

  TmpRdx_1 = TmpRdx; /*0x17f6c*/
  TmpRcx_1 = TmpRcx; /*0x17f6f*/
  v6 = *(_QWORD *)(UsbRtDispatchTable + 31376); /*0x17f8e*/
  if ( v6 ) /*0x17f98*/
  {
    v7 = *(_WORD *)(v6 + 2); /*0x17f9e*/
    if ( v7 ) /*0x17fa5*/
    {
      while ( 1 ) /*0x17faf*/
      {
        v8 = *(_DWORD *)(v6 + 8); /*0x17faf*/
        n5 = 1; /*0x17fb3*/
        v10 = v8; /*0x17fb7*/
        do /*0x17fc9*/
        {
          if ( !v10 ) /*0x17fbc*/
            break; /*0x17fbc*/
          ++n5; /*0x17fbe*/
          v10 >>= 4; /*0x17fc2*/
        }
        while ( n5 < 5u ); /*0x17fc9*/
        TmpRcx_2 = TmpRcx; /*0x17fcb*/
        TmpRdx_2 = TmpRdx; /*0x17fce*/
        n5_1 = 1; /*0x17fd1*/
        v14 = 0; /*0x17fd5*/
        do /*0x18010*/
        {
          if ( TmpRcx_2 < 0 ) /*0x17fdb*/
            break; /*0x17fdb*/
          v14 = TmpRdx_2 | (16 * v14); /*0x17fec*/
          v15 = FwVolDriverEntry(16, 0, TmpRcx_2, 0); /*0x17fef*/
          if ( !v15 ) /*0x17ffe*/
            break; /*0x17ffe*/
          TmpRcx_2 = *(_BYTE *)(v15 + 12); /*0x18000*/
          ++n5_1; /*0x18004*/
          TmpRdx_2 = *(_BYTE *)(v15 + 13); /*0x18008*/
        }
        while ( (unsigned __int16)n5_1 < 5u ); /*0x18010*/
        if ( *(_BYTE *)v6 == 1 ) /*0x18015*/
          break; /*0x18015*/
        if ( v7 != a3 ) /*0x18043*/
          goto LABEL_43; /*0x18043*/
        if ( !*(_BYTE *)(v6 + 4) ) /*0x1804d*/
          goto LABEL_14; /*0x1804d*/
        if ( *(_BYTE *)(v6 + 1) == 3 ) /*0x18053*/
        {
          if ( (v14 & (0xFFFFFFFF >> (4 * (8 - n5)) >> 4)) != v8 ) /*0x18070*/
            goto LABEL_43; /*0x18070*/
          v16 = TmpRdx_2 == *(_BYTE *)(v6 + 4); /*0x18076*/
LABEL_13:
          if ( !v16 ) /*0x18020*/
            goto LABEL_43; /*0x18020*/
LABEL_14:
          v17 = *(_BYTE *)(v6 + 12); /*0x18026*/
          if ( !v17 || v17 == a4 ) /*0x18030*/
            return 1; /*0x18030*/
          goto LABEL_43; /*0x18030*/
        }
        if ( n5 == n5_1 ) /*0x1807f*/
        {
          if ( *(_BYTE *)(v6 + 1) == 2 ) /*0x18089*/
          {
            v19 = *(_BYTE *)(v6 + 12); /*0x1808b*/
            if ( !v19 || v19 == a4 ) /*0x18095*/
              return 1; /*0x18039*/
          }
          for ( i = 0; i < n5; v8 >>= 4 ) /*0x1809f*/
          {
            if ( i == n5 - 1 ) /*0x180b2*/
            {
              if ( *(_BYTE *)(v6 + 1) ) /*0x180b4*/
              {
                if ( *(_BYTE *)(v6 + 1) == 1 && TmpRdx_2 == *(_BYTE *)(v6 + 4) ) /*0x180c5*/
                {
                  if ( v14 != v8 ) /*0x180ca*/
                    return 1; /*0x180ca*/
                  v21 = *(_BYTE *)(v6 + 12); /*0x180d0*/
                  if ( v21 ) /*0x180d5*/
                  {
                    if ( SkipMatch == 1 && v21 != a4 ) /*0x180e4*/
                      return 1; /*0x180e4*/
                  }
                }
              }
              else if ( v14 == v8 && TmpRdx_2 == *(_BYTE *)(v6 + 4) ) /*0x180f5*/
              {
                v22 = *(_BYTE *)(v6 + 12); /*0x180f7*/
                if ( !v22 || v22 == a4 ) /*0x18105*/
                  return 1; /*0x18105*/
              }
            }
            else if ( (((unsigned __int8)v8 ^ (unsigned __int8)v14) & 0xF) != 0 ) /*0x18115*/
            {
              break; /*0x18115*/
            }
            ++i; /*0x18117*/
            v14 >>= 4; /*0x1811b*/
          }
        }
LABEL_43:
        v7 = *(_WORD *)(v6 + 18); /*0x18128*/
        v6 += 16; /*0x1812c*/
        if ( !v7 ) /*0x18133*/
          return 0; /*0x18133*/
        LOBYTE(TmpRdx) = TmpRdx_1; /*0x18135*/
        LOBYTE(TmpRcx) = TmpRcx_1; /*0x18139*/
      }
      if ( *(_BYTE *)(v6 + 1) == 2 ) /*0x1801b*/
      {
        v16 = n5 == (unsigned __int16)n5_1; /*0x1801d*/
        goto LABEL_13; /*0x1801d*/
      }
      goto LABEL_14; /*0x1801b*/
    }
  }
  return 0; /*0x18149*/
}


// Function: UsbPointDecodeWheel @ 0x18360 (0x72 bytes)

__int16 __fastcall UsbPointDecodeWheel(unsigned __int8 a1)
{
  unsigned __int8 v1; // r8
  bool v2; // al
  __int16 v3; // ax

  v1 = 0; /*0x18370*/
  if ( (n44 & 2) != 0 ) /*0x1837e*/
    v2 = (n44 & 0x20) == 0; /*0x18393*/
  else
    v2 = (n44 & 0x20) != 0; /*0x18385*/
  if ( v2 ) /*0x18399*/
    v1 = byte_1C220[4 * a1 + 1]; /*0x1839b*/
  if ( (n44 & 8) != 0 ) /*0x183a3*/
  {
    v3 = byte_1C220[4 * a1 + 2]; /*0x183a5*/
    return v3 << 8; /*0x183af*/
  }
  if ( (n44 & 0x10) != 0 ) /*0x183b3*/
  {
    v3 = byte_1C220[4 * a1 + 3]; /*0x183b5*/
    return v3 << 8; /*0x183bb*/
  }
  return v1 + (byte_1C220[4 * a1] << 8); /*0x183af*/
}


// Function: UsbPointProcessAxis @ 0x183e8 (0xdb bytes)

char __fastcall UsbPointProcessAxis(_BYTE *UsbHcPtr, __int64 n2047)
{
  __int64 UsbRtDispatchTable; // rcx
  unsigned __int64 v3; // rax
  char v4; // al
  __int64 n44; // rcx
  char result; // al
  char v7; // bl

  UsbRtDispatchTable = UsbRtDispatchTable; /*0x183ee*/
  ++*(_WORD *)(UsbRtDispatchTable + 30096); /*0x18402*/
  if ( *(_WORD *)(UsbRtDispatchTable + 30096) >= *(_WORD *)(UsbRtDispatchTable + 30098) ) /*0x18418*/
  {
    LOBYTE(n2047) = 6; /*0x1842c*/
    v3 = ((unsigned __int64)*(unsigned __int16 *)(UsbRtDispatchTable + 30094) >> 2) & 7; /*0x1842e*/
    *(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x18434*/
    *(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[(_QWORD)&_ImageBase + v3]; /*0x18445*/
    do /*0x18462*/
    {
      UsbRtDispatchTable = (unsigned __int8)n2047 - 1; /*0x18452*/
      if ( *((_BYTE *)&dword_1C480 + (_QWORD)&_ImageBase + UsbRtDispatchTable) ) /*0x18455*/
        break; /*0x1845d*/
      LOBYTE(n2047) = n2047 - 1; /*0x1845f*/
    }
    while ( (_BYTE)n2047 ); /*0x18462*/
    if ( (_BYTE)n2047 ) /*0x18466*/
    {
      n44 = (unsigned __int8)n2047 - 1; /*0x1846e*/
      v4 = *((_BYTE *)&dword_1C480 + (_QWORD)&_ImageBase + n44); /*0x18471*/
      LOBYTE(n44) = byte_1C487; /*0x18479*/
      if ( v4 == (_BYTE)byte_1C487 ) /*0x18481*/
        UsbPointDecodeTouch(n44); /*0x18483*/
      else
        LOBYTE(byte_1C487) = v4; /*0x1848a*/
      UsbServiceHcPolling(0, 2u); /*0x18494*/
    }
  }
  result = n44 & 7; /*0x184a4*/
  v7 = (*(&loc_416 + 1) >> 4) & 7; /*0x184a6*/
  if ( v7 != (n44 & 7) ) /*0x184ab*/
  {
    n44 = v7 | n44 & 0xF8; /*0x184b2*/
    LOBYTE(UsbRtDispatchTable) = n44; /*0x184b0*/
    return UsbPointDecodeAxis3(UsbRtDispatchTable, n2047); /*0x184b8*/
  }
  return result; /*0x184bd*/
}


// Function: UsbPointDecodeAxis3 @ 0x184c4 (0x9e bytes)

// write access to const memory has been detected, the output may be wrong!
char __fastcall UsbPointDecodeAxis3(__int64 n44, __int64 n2047)
{
  __int64 n30168; // rbx
  __int64 n15; // rdi
  char v4; // r8
  char v5; // si
  char UsbRtDispatchTable; // al
  __int64 DevEntry; // rcx

  n30168 = 30168; /*0x184da*/
  n15 = 15; /*0x184e7*/
  v4 = (::n44 & 2) != 0; /*0x184f1*/
  if ( (::n44 & 4) != 0 ) /*0x184fd*/
    v4 |= 2u; /*0x184fd*/
  v5 = v4; /*0x18507*/
  if ( (::n44 & 1) != 0 ) /*0x18513*/
    v5 = v4 | 4; /*0x18513*/
  *(&loc_491 + 6) ^= (::n44 ^ *(&loc_491 + 6)) & 7; /*0x18529*/
  do /*0x18550*/
  {
    UsbRtDispatchTable = UsbRtDispatchTable; /*0x18530*/
    DevEntry = *(_QWORD *)(n30168 + UsbRtDispatchTable); /*0x18537*/
    if ( DevEntry ) /*0x1853e*/
    {
      LOBYTE(n2047) = v5; /*0x18540*/
      UsbRtDispatchTable = EhciCtrlAsync(DevEntry, n2047); /*0x18543*/
    }
    n30168 += 8; /*0x18548*/
    --n15; /*0x1854c*/
  }
  while ( n15 ); /*0x18550*/
  return UsbRtDispatchTable; /*0x1855c*/
}


// Function: UsbPointDecodeTouch @ 0x18564 (0xaa bytes)

// write access to const memory has been detected, the output may be wrong!
__int16 __fastcall UsbPointDecodeTouch(__int64 n44)
{
  __int16 n14624; // r8
  _QWORD *n14624_1; // rax
  bool i; // zf
  __int16 v4; // r9

  if ( (_BYTE)n44 == 44 ) /*0x1856d*/
  {
    n14624 = 14624; /*0x1856f*/
LABEL_13:
    LOWORD(n14624_1) = *(&loc_480 + 1); /*0x185c2*/
    *(_WORD *)((char *)ModuleEntryPoint + *(&loc_418 + 2)) = n14624; /*0x185e3*/
    v4 = *(&loc_418 + 2) + 2; /*0x185eb*/
    if ( (unsigned __int16)(*(&loc_418 + 2) + 2) >= *(&loc_480 + 1) ) /*0x185f4*/
      v4 = loc_480; /*0x185f4*/
    if ( v4 != *(&loc_418 + 1) ) /*0x185fd*/
      *(&loc_418 + 2) = v4; /*0x185ff*/
    return (__int16)n14624_1; /*0x185ff*/
  }
  n14624_1 = &unk_1C270; /*0x18579*/
  for ( i = off_1C278 == 0; ; i = n14624_1[1] == 0 ) /*0x18580*/
  {
    if ( i ) /*0x18587*/
    {
      n14624 = 0; /*0x185b8*/
      goto LABEL_12; /*0x185b8*/
    }
    if ( (unsigned __int8)n44 >= *(_BYTE *)n14624_1 && (unsigned __int8)n44 <= *((_BYTE *)n14624_1 + 1) ) /*0x18590*/
      break; /*0x18590*/
    n14624_1 += 2; /*0x18592*/
  }
  LOBYTE(n44) = n44 - *(_BYTE *)n14624_1; /*0x1859c*/
  LOWORD(n14624_1) = ((__int64 (__fastcall *)(__int64))n14624_1[1])(n44); /*0x1859e*/
  if ( (::n44 & 0x10) != 0 ) /*0x185a8*/
    LOWORD(n14624_1) = (unsigned __int16)n14624_1 & 0xFF00; /*0x185af*/
  n14624 = (__int16)n14624_1; /*0x185b2*/
LABEL_12:
  if ( n14624 ) /*0x185c0*/
    goto LABEL_13; /*0x185c0*/
  return (__int16)n14624_1; /*0x18608*/
}


// Function: UsbPointProcessHidReport @ 0x18610 (0x20f bytes)

// write access to const memory has been detected, the output may be wrong!
void __fastcall UsbPointProcessHidReport(__int64 n44)
{
  _BYTE *n44_2; // rsi
  int v2; // r11d
  int *n2047; // rdx
  __int16 v4; // di
  __int64 n6; // rbx
  _BYTE *n44_1; // rbp
  __int64 n6_1; // r10
  __int64 n6_2; // r9
  char v9; // al
  char v10; // di
  _BYTE *n44_3; // rdx
  __int64 n6_3; // r8
  char n44_4; // cl
  char v14; // al
  unsigned __int8 i; // cl
  __int64 UsbRtDispatchTable; // rcx
  unsigned __int8 n2; // dl
  unsigned __int64 v18; // rax

  n44_2 = (_BYTE *)(n44 + 2); /*0x18630*/
  v2 = *(_DWORD *)(n44 + 2); /*0x18634*/
  n2047 = &dword_1C480; /*0x18637*/
  v4 = *(_WORD *)(n44 + 6); /*0x1863e*/
  n6 = 6; /*0x18642*/
  n44_1 = (_BYTE *)n44; /*0x1864a*/
  n6_1 = 6; /*0x18650*/
  do /*0x1867e*/
  {
    if ( *(_BYTE *)n2047 ) /*0x18653*/
    {
      n44 = (__int64)n44_2; /*0x18658*/
      n6_2 = 6; /*0x1865b*/
      do /*0x18675*/
      {
        if ( *(_BYTE *)n44 && *(_BYTE *)n44 == *(_BYTE *)n2047 ) /*0x18669*/
          *(_BYTE *)n44 = 0; /*0x1866b*/
        ++n44; /*0x1866e*/
        --n6_2; /*0x18671*/
      }
      while ( n6_2 ); /*0x18675*/
    }
    n2047 = (int *)((char *)n2047 + 1); /*0x18677*/
    --n6_1; /*0x1867a*/
  }
  while ( n6_1 ); /*0x1867e*/
  LOBYTE(n44) = ::n44; /*0x18680*/
  v9 = (*(&loc_416 + 1) >> 4) & 7; /*0x18686*/
  word_1C484 = v4; /*0x18688*/
  v10 = ::n44 & 7; /*0x18692*/
  dword_1C480 = v2; /*0x18696*/
  if ( v9 != (::n44 & 7) ) /*0x186a0*/
  {
    ::n44 = v9 | ::n44 & 0xF8; /*0x186a7*/
    LOBYTE(n44) = ::n44; /*0x186a5*/
    UsbPointDecodeAxis3(n44, (__int64)n2047); /*0x186ad*/
    LOBYTE(n44) = ::n44; /*0x186b2*/
    v10 = ::n44 & 7; /*0x186bb*/
  }
  n44_3 = n44_2; /*0x186c5*/
  n6_3 = 6; /*0x186c8*/
  do /*0x18723*/
  {
    switch ( *n44_3 ) /*0x186ce*/
    {
      case '9': /*0x186ce*/
        *(&loc_416 + 1) ^= 0x40u; /*0x18702*/
        n44_4 = ::n44; /*0x18706*/
        v14 = (::n44 ^ ~::n44) & 4; /*0x18712*/
        break;
      case 'G': /*0x186ce*/
        *(&loc_416 + 1) ^= 0x10u; /*0x186ee*/
        n44_4 = ::n44; /*0x186f2*/
        v14 = (::n44 ^ ~::n44) & 1; /*0x186fe*/
        break;
      case 'S': /*0x186ce*/
        *(&loc_416 + 1) ^= 0x20u; /*0x186da*/
        n44_4 = ::n44; /*0x186de*/
        v14 = (::n44 ^ ~::n44) & 2; /*0x186ea*/
        break;
      default:
        goto LABEL_19; /*0x186d8*/
    }
    LOBYTE(n44) = v14 ^ n44_4; /*0x18714*/
    ::n44 = n44; /*0x18716*/
LABEL_19:
    ++n44_3; /*0x1871c*/
    --n6_3; /*0x1871f*/
  }
  while ( n6_3 ); /*0x18723*/
  ::n44 = n44 & 0xF7 | (8 * ((*n44_1 & 0x11) != 0)); /*0x18734*/
  ::n44 = ::n44 & 0xDF | (32 * ((*n44_1 & 0x22) != 0)); /*0x18748*/
  ::n44 = ::n44 & 0xEF | (16 * ((*n44_1 & 0x44) != 0)); /*0x1875d*/
  if ( (::n44 & 0x18) == 0x18 ) /*0x18767*/
  {
    n44_3 = (_BYTE *)UsbRtDispatchTable; /*0x18769*/
    for ( i = 2; i < 6u; ++i ) /*0x18770*/
    {
      if ( (n44_1[i] == 76 || n44_1[i] == 99) && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) == 0 ) /*0x18785*/
      {
        __outbyte(0xCF9u, 6u); /*0x1881c*/
        while ( 1 ) /*0x1881d*/
          ; /*0x1881d*/
      }
    }
  }
  do /*0x187a3*/
  {
    LOBYTE(n44) = *n44_2; /*0x18791*/
    if ( *n44_2 ) /*0x18791*/
      UsbPointDecodeTouch(n44); /*0x18797*/
    ++n44_2; /*0x1879c*/
    --n6; /*0x1879f*/
  }
  while ( n6 ); /*0x187a3*/
  if ( v10 != (::n44 & 7) ) /*0x187b0*/
    UsbPointDecodeAxis3(n44, (__int64)n44_3); /*0x187b2*/
  UsbRtDispatchTable = UsbRtDispatchTable; /*0x187b7*/
  n2 = 1; /*0x187c5*/
  v18 = ((unsigned __int64)*(unsigned __int16 *)(UsbRtDispatchTable + 30094) >> 6) & 7; /*0x187d2*/
  *(_WORD *)(UsbRtDispatchTable + 30096) = 0; /*0x187d5*/
  *(_WORD *)(UsbRtDispatchTable + 30098) = (unsigned __int8)byte_1A678[v18]; /*0x187e2*/
  if ( (_BYTE)dword_1C480 ) /*0x187f2*/
    n2 = 2; /*0x187f4*/
  UsbServiceHcPolling(0, n2); /*0x18810*/
}


// Function: UsbPointParseHidReportEx @ 0x18820 (0x34f bytes)

char __fastcall UsbPointParseHidReportEx(__int64 a1, __int64 a2, __int64 a3, _BYTE *n44)
{
  __int64 v4; // rdi
  _BYTE *n44_1; // r10
  char v6; // dl
  char v7; // r14
  char v8; // r13
  unsigned __int8 v9; // r12
  __int64 n0xFFFF; // r8
  __int64 v11; // rbx
  char v12; // al
  unsigned __int16 v13; // si
  char v14; // dl
  char v15; // dl
  unsigned __int16 v16; // si
  char v17; // r13
  char v18; // cl
  char v19; // cl
  __int16 v20; // cx
  __int16 v21; // r8
  char v23; // [rsp+30h] [rbp-28h]
  __int16 v24; // [rsp+34h] [rbp-24h]
  __int16 v25; // [rsp+38h] [rbp-20h]
  __int16 v26; // [rsp+40h] [rbp-18h] BYREF
  int v27; // [rsp+42h] [rbp-16h] BYREF
  char v28; // [rsp+A0h] [rbp+48h]
  char v30; // [rsp+B0h] [rbp+58h]
  char v32; // [rsp+C0h] [rbp+68h]

  v4 = a2; /*0x18846*/
  n44_1 = n44; /*0x18849*/
  v6 = 0; /*0x1884f*/
  v32 = 0; /*0x18852*/
  v7 = 0; /*0x18856*/
  v28 = 0; /*0x18859*/
  v8 = 0; /*0x1885d*/
  v23 = 0; /*0x18860*/
  v9 = 0; /*0x18864*/
  v27 = 0; /*0x18867*/
  LOBYTE(v26) = 0; /*0x1886b*/
  v30 = 0; /*0x1886e*/
  if ( *(_BYTE *)(v4 + 296) ) /*0x18872*/
  {
    n0xFFFF = 0xFFFF; /*0x1887f*/
    do /*0x18afe*/
    {
      v11 = *(_QWORD *)(*(_QWORD *)(v4 + 304) + 8LL * v9); /*0x18890*/
      if ( (*(_BYTE *)v11 & 0x10) != 0 ) /*0x18897*/
      {
        v12 = *(_BYTE *)(v11 + 1); /*0x1889d*/
        if ( !v12 || v12 == *n44_1 ) /*0x188a7*/
        {
          if ( (*(_BYTE *)v11 & 1) == 0 ) /*0x188b0*/
          {
            if ( *(_WORD *)(v11 + 2) == 13 && *(_WORD *)(v11 + 30) ) /*0x188c1*/
            {
              v13 = 0; /*0x188ce*/
              do /*0x18947*/
              {
                if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v13) == 66 ) /*0x188ef*/
                {
                  if ( v8 == 1 ) /*0x188f5*/
                    break; /*0x188f5*/
                  v14 = v7 + 8; /*0x18907*/
                  if ( !*(_BYTE *)(v11 + 1) ) /*0x188f7*/
                    v14 = v7; /*0x1890e*/
                  LOBYTE(n0xFFFF) = v14; /*0x1891b*/
                  UsbHidExtractBits(n44, &v26, n0xFFFF, v14 + *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8), 0xFFFFu); /*0x18929*/
                  v8 = 1; /*0x18931*/
                  v6 = v26 & 3; /*0x18934*/
                  n0xFFFF = 0xFFFF; /*0x18937*/
                  LOBYTE(v26) = v26 & 3; /*0x1893d*/
                }
                ++v13; /*0x18940*/
              }
              while ( v13 < *(_WORD *)(v11 + 30) ); /*0x18947*/
              v4 = a2; /*0x18949*/
              v9 = v30; /*0x18950*/
              n44_1 = n44; /*0x18954*/
              v32 = v8; /*0x18958*/
            }
            if ( *(_WORD *)(v11 + 2) == 9 && *(_WORD *)(v11 + 30) && **(_WORD **)(v11 + 32) == 1 ) /*0x18972*/
            {
              if ( v8 == 1 ) /*0x18978*/
                break; /*0x18978*/
              v15 = v7 + 8; /*0x1898e*/
              if ( !*(_BYTE *)(v11 + 1) ) /*0x1897e*/
                v15 = v7; /*0x18995*/
              LOBYTE(n0xFFFF) = v15; /*0x189a2*/
              UsbHidExtractBits(n44_1, &v26, n0xFFFF, v15 + *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8), 0xFFFFu); /*0x189b0*/
              v6 = v26; /*0x189b5*/
              v8 = 1; /*0x189b8*/
              v32 = 1; /*0x189bb*/
            }
            if ( *(_WORD *)(v11 + 2) == 1 && *(_WORD *)(v11 + 30) ) /*0x189cd*/
            {
              v16 = 0; /*0x189da*/
              v17 = v23; /*0x189ec*/
              do /*0x18ac0*/
              {
                if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v16) == 48 ) /*0x189fe*/
                {
                  if ( v28 == 1 ) /*0x18a04*/
                    break; /*0x18a04*/
                  v18 = v7 + v16 * *(_BYTE *)(v11 + 8) + 8; /*0x18a22*/
                  if ( !*(_BYTE *)(v11 + 1) ) /*0x18a18*/
                    v18 = v7 + v16 * *(_BYTE *)(v11 + 8); /*0x18a29*/
                  LOBYTE(n0xFFFF) = v18; /*0x18a3c*/
                  UsbHidExtractBits(n44, &v27, n0xFFFF, *(_BYTE *)(v11 + 8) + v18, *(_WORD *)(v11 + 16)); /*0x18a42*/
                  v24 = *(_WORD *)(v11 + 16); /*0x18a4e*/
                  v28 = 1; /*0x18a52*/
                }
                if ( *(_WORD *)(*(_QWORD *)(v11 + 32) + 2LL * v16) == 49 ) /*0x18a60*/
                {
                  if ( v17 == 1 ) /*0x18a66*/
                    break; /*0x18a66*/
                  v25 = *(_WORD *)(v11 + 16); /*0x18a78*/
                  v19 = v7 + v16 * *(_BYTE *)(v11 + 8) + 8; /*0x18a90*/
                  if ( !*(_BYTE *)(v11 + 1) ) /*0x18a86*/
                    v19 = v7 + v16 * *(_BYTE *)(v11 + 8); /*0x18a93*/
                  LOBYTE(n0xFFFF) = v19; /*0x18a9d*/
                  UsbHidExtractBits(n44, (_WORD *)&v27 + 1, n0xFFFF, *(_BYTE *)(v11 + 8) + v19, *(_WORD *)(v11 + 16)); /*0x18aa7*/
                  v17 = 1; /*0x18aac*/
                  v23 = 1; /*0x18aaf*/
                }
                ++v16; /*0x18ab3*/
              }
              while ( v16 < *(_WORD *)(v11 + 30) ); /*0x18ac0*/
              v6 = v26; /*0x18ac6*/
              v4 = a2; /*0x18acc*/
              v9 = v30; /*0x18ad0*/
              v8 = v32; /*0x18ad4*/
            }
            n44_1 = n44; /*0x18ad8*/
            n0xFFFF = 0xFFFF; /*0x18adc*/
          }
          v7 += *(_BYTE *)(v11 + 4) * *(_BYTE *)(v11 + 8); /*0x18aed*/
        }
      }
      v30 = ++v9; /*0x18af3*/
    }
    while ( v9 < *(_BYTE *)(v4 + 296) ); /*0x18afe*/
    v20 = HIWORD(v27); /*0x18b04*/
    v21 = v27; /*0x18b08*/
    if ( (v6 || v27) && (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x18b27*/
    {
      *(_WORD *)(v4 + 368) = v24; /*0x18b2d*/
      *(_WORD *)(v4 + 370) = v25; /*0x18b38*/
      *(_BYTE *)(v4 + 361) = v6; /*0x18b3f*/
      *(_WORD *)(v4 + 362) = v21; /*0x18b45*/
      *(_WORD *)(v4 + 364) = v20; /*0x18b4d*/
      *(_WORD *)(v4 + 366) = 0; /*0x18b54*/
    }
  }
  return 0; /*0x18b5e*/
}


// Function: UsbHidExtractBits @ 0x18b70 (0xd3 bytes)

__int64 __fastcall UsbHidExtractBits(_BYTE *n44, _WORD *a2, __int64 n0xFFFF, char a4, unsigned __int16 n0xFFFFa)
{
  unsigned int dst_1; // r11d
  char v6; // r10
  unsigned __int8 n0xFFFF_1; // bl
  int count_1; // r8d
  int count; // esi
  __int64 n0xFFFFa_1; // rax
  char v14; // di
  char v15; // bl
  unsigned int dst; // [rsp+50h] [rbp+18h] BYREF

  dst_1 = 0; /*0x18b82*/
  v6 = a4 - n0xFFFF; /*0x18b88*/
  dst = 0; /*0x18b8b*/
  n0xFFFF_1 = n0xFFFF; /*0x18b93*/
  count_1 = (unsigned __int8)(a4 - n0xFFFF) >> 3; /*0x18b9c*/
  count = (unsigned __int8)(count_1 + 1); /*0x18bae*/
  if ( (v6 & 7) == 0 ) /*0x18bb1*/
    count = count_1; /*0x18bb1*/
  if ( (unsigned __int8)(count - 1) > 3u ) /*0x18bba*/
  {
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\UsbPoint.c", 238, (__int64)"Size > 0 && Size <= sizeof(TempData)"); /*0x18bcf*/
    dst_1 = dst; /*0x18bd4*/
  }
  n0xFFFFa_1 = (unsigned int)(count - 1); /*0x18bd9*/
  if ( (unsigned __int8)(count - 1) <= 3u ) /*0x18bde*/
  {
    if ( (_BYTE)count ) /*0x18be7*/
    {
      MemConfig((char *)&dst, &n44[(unsigned __int64)n0xFFFF_1 >> 3], (unsigned __int8)count); /*0x18bf8*/
      dst_1 = dst; /*0x18bfd*/
    }
    v14 = a4 & 7; /*0x18c02*/
    v15 = n0xFFFF_1 & 7; /*0x18c06*/
    if ( v15 ) /*0x18c09*/
      dst_1 >>= v15; /*0x18c0d*/
    if ( v14 ) /*0x18c13*/
      dst_1 = dst_1 << v14 >> v14; /*0x18c1c*/
    n0xFFFFa_1 = n0xFFFFa; /*0x18c1f*/
    if ( dst_1 > n0xFFFFa ) /*0x18c27*/
      LOWORD(dst_1) = n0xFFFFa & dst_1; /*0x18c29*/
    *a2 = dst_1; /*0x18c2c*/
  }
  return n0xFFFFa_1; /*0x18c3a*/
}


// Function: UsbPointParseHidReport @ 0x18c44 (0x401 bytes)

char __fastcall UsbPointParseHidReport(__int64 a1, __int64 a2, __int64 a3, _BYTE *n44)
{
  char v4; // r15
  char v5; // di
  char v6; // r13
  char v7; // r12
  unsigned __int8 v8; // r14
  __int64 v10; // rsi
  unsigned __int8 v11; // r13
  __int64 v12; // rdi
  char v13; // dl
  unsigned __int8 v14; // cl
  unsigned __int16 v15; // r15
  unsigned __int8 v16; // cl
  char v17; // r9
  unsigned __int8 v18; // cl
  char v19; // r9
  unsigned int v20; // ecx
  __int64 UsbRtDispatchTable; // r8
  char v22; // al
  char n0x80; // di
  char n0x80_1; // cl
  unsigned __int64 v25; // r9
  unsigned __int64 v26; // r11
  unsigned __int8 v27; // al
  char n0x80_2; // r10
  __int64 v29; // r8
  char v31; // [rsp+30h] [rbp-20h]
  char v32; // [rsp+31h] [rbp-1Fh]
  _BYTE v33[3]; // [rsp+38h] [rbp-18h] BYREF
  char v34; // [rsp+3Bh] [rbp-15h]
  __int16 v35; // [rsp+3Ch] [rbp-14h]
  __int16 v36; // [rsp+3Eh] [rbp-12h]
  __int64 v37; // [rsp+40h] [rbp-10h]
  char v38; // [rsp+90h] [rbp+40h]
  char v40; // [rsp+A0h] [rbp+50h]
  char v41; // [rsp+B0h] [rbp+60h]

  v4 = 0; /*0x18c70*/
  v5 = 0; /*0x18c73*/
  v38 = 0; /*0x18c76*/
  v6 = 0; /*0x18c7a*/
  v31 = 0; /*0x18c7d*/
  v7 = 0; /*0x18c81*/
  v32 = 0; /*0x18c84*/
  v8 = 0; /*0x18c88*/
  v41 = 0; /*0x18c8b*/
  v10 = a2; /*0x18c92*/
  if ( !*(_BYTE *)(UsbRtDispatchTable + 31458) ) /*0x18c95*/
  {
    MemGetInfo((__int64)v33, 0xAu); /*0x18cab*/
    if ( (*(_BYTE *)(v10 + 288) & 1) != 0 ) /*0x18cc0*/
    {
      v11 = 0; /*0x18cc6*/
      v40 = 0; /*0x18cc9*/
      if ( *(_BYTE *)(v10 + 296) ) /*0x18ccd*/
      {
        do /*0x18e86*/
        {
          v12 = *(_QWORD *)(*(_QWORD *)(v10 + 304) + 8LL * v11); /*0x18ce5*/
          if ( (*(_BYTE *)v12 & 0x10) != 0 ) /*0x18cec*/
          {
            v13 = *(_BYTE *)(v12 + 1); /*0x18cf2*/
            if ( !v13 || v13 == *n44 ) /*0x18cfb*/
            {
              if ( (*(_BYTE *)v12 & 1) == 0 ) /*0x18d04*/
              {
                if ( *(_WORD *)(v12 + 2) == 9 && *(_WORD *)(v12 + 30) && **(_WORD **)(v12 + 32) == 1 ) /*0x18d20*/
                {
                  v38 = 1; /*0x18d26*/
                  v14 = v8 + 8; /*0x18d2a*/
                  if ( !v13 ) /*0x18d33*/
                    v14 = v8; /*0x18d33*/
                  v33[0] = n44[(unsigned __int64)v14 >> 3]; /*0x18d40*/
                }
                if ( *(_WORD *)(v12 + 2) == 1 && *(_WORD *)(v12 + 30) ) /*0x18d4e*/
                {
                  v15 = 0; /*0x18d5b*/
                  do /*0x18e55*/
                  {
                    if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 48 ) /*0x18d7d*/
                    {
                      v31 = 1; /*0x18d8a*/
                      v16 = v8 + v15 * *(_BYTE *)(v12 + 8) + 8; /*0x18da0*/
                      if ( !*(_BYTE *)(v12 + 1) ) /*0x18d96*/
                        v16 = v8 + v15 * *(_BYTE *)(v12 + 8); /*0x18da3*/
                      v17 = *(_BYTE *)(v12 + 8) + v16; /*0x18db0*/
                      LOBYTE(v37) = 48; /*0x18db7*/
                      UsbMsExtractFieldValue(n44, (__int64)v33, v16, v17, (_DWORD *)v12); /*0x18dbb*/
                    }
                    if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 49 ) /*0x18dca*/
                    {
                      v32 = 1; /*0x18dd7*/
                      v18 = v8 + v15 * *(_BYTE *)(v12 + 8) + 8; /*0x18ded*/
                      if ( !*(_BYTE *)(v12 + 1) ) /*0x18de3*/
                        v18 = v8 + v15 * *(_BYTE *)(v12 + 8); /*0x18df0*/
                      v19 = *(_BYTE *)(v12 + 8) + v18; /*0x18dfd*/
                      LOBYTE(v37) = 49; /*0x18e04*/
                      UsbMsExtractFieldValue(n44, (__int64)v33, v18, v19, (_DWORD *)v12); /*0x18e08*/
                    }
                    if ( *(_WORD *)(*(_QWORD *)(v12 + 32) + 2LL * v15) == 56 ) /*0x18e17*/
                    {
                      v7 = 1; /*0x18e1d*/
                      v41 = 1; /*0x18e2b*/
                      v20 = (v8 + v15 * (unsigned int)*(unsigned __int8 *)(v12 + 8)) >> 3; /*0x18e31*/
                      if ( *(_BYTE *)(v12 + 1) ) /*0x18e34*/
                        LOBYTE(v20) = v20 + 1; /*0x18e3a*/
                      v34 = n44[(unsigned __int8)v20]; /*0x18e43*/
                    }
                    else
                    {
                      v7 = v41; /*0x18e48*/
                    }
                    ++v15; /*0x18e4c*/
                  }
                  while ( v15 < *(_WORD *)(v12 + 30) ); /*0x18e55*/
                  v10 = a2; /*0x18e5b*/
                  v11 = v40; /*0x18e62*/
                }
              }
              v8 += *(_BYTE *)(v12 + 4) * *(_BYTE *)(v12 + 8); /*0x18e75*/
            }
          }
          v40 = ++v11; /*0x18e7b*/
        }
        while ( v11 < *(_BYTE *)(v10 + 296) ); /*0x18e86*/
        v4 = v38; /*0x18e8c*/
        v5 = v31; /*0x18e90*/
      }
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x18e94*/
      *(_QWORD *)n44 = 0; /*0x18e9b*/
      if ( v4 ) /*0x18ea1*/
      {
        v22 = v33[0]; /*0x18ea3*/
        *n44 = v33[0]; /*0x18ea6*/
        *(_BYTE *)(UsbRtDispatchTable + 31459) = v22; /*0x18ea8*/
      }
      else
      {
        *n44 = *(_BYTE *)(UsbRtDispatchTable + 31459); /*0x18eb8*/
      }
      if ( v5 == 1 ) /*0x18ebd*/
        n44[1] = v33[1]; /*0x18ec2*/
      v6 = v32; /*0x18ec5*/
      if ( v32 == 1 ) /*0x18ecc*/
        n44[2] = v33[2]; /*0x18ed1*/
      if ( v7 == 1 ) /*0x18ed7*/
        n44[3] = v34; /*0x18edc*/
    }
    else
    {
      UsbRtDispatchTable = UsbRtDispatchTable; /*0x18ee5*/
      v35 = (char)n44[1]; /*0x18eec*/
      v36 = (char)n44[2]; /*0x18ef4*/
    }
    if ( (*(_BYTE *)(v10 + 288) & 1) == 0 && (*(_WORD *)(v10 + 108) & 0x2000) != 0 ) /*0x18f0a*/
      ++n44; /*0x18f0c*/
    if ( *(__int16 *)(v10 + 108) < 0 || v4 || v5 || v6 || v7 ) /*0x18f28*/
    {
      if ( (*(_BYTE *)(UsbRtDispatchTable + 4) & 2) != 0 ) /*0x18f33*/
      {
        *(_BYTE *)(UsbRtDispatchTable + 30288) = *n44; /*0x18f37*/
        *(_DWORD *)(UsbRtDispatchTable + 30292) += v35; /*0x18f42*/
        *(_DWORD *)(UsbRtDispatchTable + 30296) += v36; /*0x18f4d*/
        *(_DWORD *)(UsbRtDispatchTable + 30300) += (char)n44[3]; /*0x18f58*/
      }
      else if ( (*(&loc_40E + 2) & 4) != 0 && qword_1C3B0 ) /*0x18f79*/
      {
        n0x80 = n44[1]; /*0x18f88*/
        n0x80_1 = *n44 & 7 | 8; /*0x18f8c*/
        if ( (unsigned __int8)n0x80 >= 0x80u ) /*0x18f96*/
          n0x80_1 = *n44 & 7 | 0x18; /*0x18f98*/
        if ( (unsigned __int8)-n44[2] >= 0x80u ) /*0x18f9f*/
          n0x80_1 |= 0x20u; /*0x18fa1*/
        if ( *(_BYTE *)(UsbRtDispatchTable + 30496) || (*(_BYTE *)(UsbRtDispatchTable + 4) & 8) != 0 ) /*0x18fb2*/
        {
          v25 = *(_QWORD *)(UsbRtDispatchTable + 30320); /*0x18fbc*/
          v26 = *(_QWORD *)(UsbRtDispatchTable + 30328); /*0x18fc3*/
          v27 = ((*(_BYTE *)(UsbRtDispatchTable + 30336) & 0x10) != 0) + 3; /*0x18fcd*/
          if ( v26 == v25 ) /*0x18fd2*/
            goto LABEL_68; /*0x18fd2*/
          if ( v27 + v25 > UsbRtDispatchTable + 30316 ) /*0x18fe5*/
            v25 = UsbRtDispatchTable + 30304; /*0x18fe7*/
          if ( v25 > v26 || v27 + v25 < v26 ) /*0x18ffa*/
          {
LABEL_68:
            UsbPointOutputData(n0x80_1); /*0x18ffc*/
            UsbPointOutputData(n0x80); /*0x19004*/
            UsbPointOutputData(n0x80_2); /*0x1900c*/
            if ( (*(_BYTE *)(v29 + 30336) & 0x10) != 0 ) /*0x19019*/
              UsbPointOutputData(0); /*0x1901d*/
          }
          UsbServiceHcPolling(0, 2u); /*0x19026*/
        }
      }
    }
  }
  return 0; /*0x19035*/
}


// Function: UsbMsExtractFieldValue @ 0x19048 (0x145 bytes)

char __fastcall UsbMsExtractFieldValue(_BYTE *n44, __int64 a2, unsigned __int8 a3, char a4, _DWORD *a5)
{
  _DWORD *v5; // rbx
  unsigned __int16 dst_1; // r8
  __int16 v11; // r15
  unsigned __int8 count; // r14
  char n48; // al
  char v14; // si
  char v15; // bp
  unsigned __int16 dst; // [rsp+60h] [rbp+18h] BYREF

  v5 = a5; /*0x19064*/
  dst = 0; /*0x1906f*/
  dst_1 = 0; /*0x1907d*/
  if ( !*(_QWORD *)(a5 + 5) ) /*0x19081*/
  {
    a5[5] = a5[4]; /*0x19090*/
    v5[6] = v5[3]; /*0x19096*/
  }
  v11 = (unsigned __int16)(-1 >> (a4 - a3)) << (a4 - a3); /*0x190b1*/
  count = ((unsigned __int8)(a4 - a3) >> 3) + 1; /*0x190bf*/
  if ( ((a4 - a3) & 7) == 0 ) /*0x190c3*/
    count = (unsigned __int8)(a4 - a3) >> 3; /*0x190c3*/
  if ( (unsigned __int8)(count - 1) > 1u ) /*0x190d0*/
  {
    Assert((UINTN)"e:\\hs\\AmiModulePkg\\Usb\\Rt\\UsbMs.c", 380, (__int64)"Size > 0 && Size <= sizeof(TempData)"); /*0x190e5*/
    dst_1 = dst; /*0x190ea*/
  }
  n48 = count - 1; /*0x190f6*/
  if ( (unsigned __int8)(count - 1) <= 1u ) /*0x190fc*/
  {
    if ( count ) /*0x19105*/
    {
      MemConfig((char *)&dst, &n44[(unsigned __int64)a3 >> 3], count); /*0x1911a*/
      dst_1 = dst; /*0x1911f*/
    }
    v14 = a4 & 7; /*0x19125*/
    v15 = a3 & 7; /*0x19129*/
    if ( v15 ) /*0x1912d*/
      dst_1 >>= v15; /*0x19132*/
    if ( v14 ) /*0x19139*/
      dst_1 = (unsigned __int16)(dst_1 << v14) >> v14; /*0x19142*/
    if ( (unsigned int)dst_1 > v5[4] ) /*0x1914d*/
      dst_1 |= v11; /*0x1914f*/
    n48 = *(_BYTE *)(a2 + 8); /*0x19153*/
    if ( n48 == 48 ) /*0x19158*/
    {
      *(_WORD *)(a2 + 4) = dst_1; /*0x1915a*/
      *(_BYTE *)(a2 + 1) = dst_1; /*0x1915f*/
    }
    if ( n48 == 49 ) /*0x19165*/
    {
      *(_WORD *)(a2 + 6) = dst_1; /*0x19167*/
      *(_BYTE *)(a2 + 2) = dst_1; /*0x1916c*/
    }
  }
  return n48; /*0x1917f*/
}


// Function: Assert_0 @ 0x19190 (0x42 bytes)

__int64 __fastcall Assert_0(__int64 a1, unsigned __int64 i)
{
  char i_1; // di

  i_1 = i; /*0x1919a*/
  if ( i >= 0x40 ) /*0x191a4*/
    Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseLib\\LShiftU64.c", 39, (__int64)"Count < 64"); /*0x191b9*/
  return a1 << i_1; /*0x191cc*/
}


// Function: IoRead32 @ 0x19214 (0x30 bytes)

UINT32 __cdecl IoRead32(UINTN Port)
{
  unsigned __int16 Port_1; // bx

  Port_1 = Port; /*0x1921a*/
  if ( (Port & 3) != 0 ) /*0x19220*/
    Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 193, (__int64)"(Port & 3) == 0"); /*0x19235*/
  return __indword(Port_1); /*0x1923e*/
}


// Function: IoWrite8 @ 0x19244 (0x34 bytes)

UINT8 __cdecl IoWrite8(UINTN Port, UINT8 Value)
{
  if ( (Port & 1) != 0 ) /*0x19250*/
    Assert((__int64)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 183, (__int64)"(Address & 1) == 0"); /*0x19265*/
  *(_WORD *)Port = 1280; /*0x1926f*/
  return 0; /*0x19272*/
}


// Function: IoWrite16 @ 0x19278 (0x7f bytes)

UINT16 __cdecl IoWrite16(UINTN Port, UINT16 Value)
{
  UINT16 result; // ax
  unsigned __int64 n0x10; // rbx
  __int64 v4; // rax
  __int64 v5; // rcx

  result = qword_1C408; /*0x19282*/
  if ( !qword_1C408 ) /*0x1928e*/
  {
    n0x10 = (*(__int64 (__fastcall **)(__int64, UINT16))(BootServices + 24))(31, Value); /*0x192a7*/
    (*(void (__fastcall **)(unsigned __int64))(BootServices + 32))(n0x10); /*0x192aa*/
    if ( n0x10 <= 0x10 ) /*0x192b1*/
    {
      v4 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_1C080, 0, &qword_1C408); /*0x192ce*/
      v5 = qword_1C408; /*0x192d4*/
      if ( v4 < 0 ) /*0x192de*/
        v5 = 0; /*0x192de*/
      qword_1C408 = v5; /*0x192e2*/
      return v5; /*0x192e9*/
    }
    else
    {
      return 0; /*0x192b3*/
    }
  }
  return result; /*0x192f1*/
}


// Function: DebugPrint @ 0x192f8 (0x47 bytes)

void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
  __int64 v3; // rax
  void (__fastcall **v4)(UINTN, const CHAR8 *, __int64 *); // r10
  va_list va; // [rsp+40h] [rbp+18h] BYREF

  va_start(va, Format);
  LOWORD(v3) = IoWrite16(ErrorLevel, (UINT16)Format); /*0x1930f*/
  if ( v3 ) /*0x1931a*/
  {
    if ( ((unsigned int)PciExpressWrite() & (unsigned int)ErrorLevel) != 0 ) /*0x19327*/
      (*v4)(ErrorLevel, Format, (__int64 *)va); /*0x19336*/
  }
}


// Function: Assert @ 0x19340 (0x3e bytes)

__int16 __fastcall Assert(UINTN Port, __int64 Value, __int64 a3)
{
  __int64 v6; // rax

  LOWORD(v6) = IoWrite16(Port, Value); /*0x19358*/
  if ( v6 ) /*0x19360*/
    LOWORD(v6) = (*(__int64 (__fastcall **)(UINTN, __int64, __int64))(v6 + 8))(Port, Value, a3); /*0x1936b*/
  return v6; /*0x19378*/
}


// Function: MemGetInfo @ 0x19380 (0x63 bytes)

void __fastcall sub_19380(__int64 a1, unsigned __int64 a2)
{
  if ( !a1 ) /*0x19393*/
    Assert( /*0x193a6*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      53,
      (__int64)"Buffer != ((void *) 0)");
  if ( a2 > -a1 ) /*0x193b4*/
    Assert( /*0x193c9*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      54,
      (__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
  JUMPOUT(0x2C0); /*0x2c0*/
}


// Function: SetMem @ 0x193e4 (0x50 bytes)

void *__cdecl SetMem(void *Buffer, UINTN Length, UINT8 Value)
{
  if ( Length - 1 > -1 - (__int64)Buffer ) /*0x19402*/
    Assert( /*0x19417*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
      54,
      (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)");
  JUMPOUT(0x2E0); /*0x2e0*/
}


// Function: MemConfig @ 0x19434 (0x9e bytes)

char *__fastcall MemConfig(char *dst, char *src, unsigned __int64 count)
{
  unsigned __int64 v3; // rbp

  v3 = count - 1; /*0x19451*/
  if ( count - 1 > -1 - (__int64)dst ) /*0x19467*/
    Assert( /*0x1947a*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
      56,
      (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
  if ( v3 > -1 - (__int64)src ) /*0x19485*/
    Assert( /*0x1949a*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
      57,
      (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
  if ( dst == src ) /*0x194a2*/
    return dst; /*0x194a4*/
  else
    return MemMove(dst, src, count); /*0x194b2*/
}


// Function: HobLibGetHobList @ 0x194d4 (0xd6 bytes)

__int64 __fastcall HobLibGetHobList(__int64 ImageHandle)
{
  __int64 result; // rax
  __int64 SystemTable; // rdi
  unsigned __int64 v3; // rbx
  __int64 v4; // rsi

  result = qword_1C410; /*0x194e3*/
  if ( !qword_1C410 ) /*0x194ed*/
  {
    SystemTable = SystemTable_0; /*0x194f3*/
    v3 = 0; /*0x194fa*/
    qword_1C410 = 0; /*0x194fc*/
    if ( *(_QWORD *)(SystemTable_0 + 104) ) /*0x19503*/
    {
      v4 = 0; /*0x19509*/
      while ( !UnalignedRead32(ImageHandle, v4 + *(_QWORD *)(SystemTable + 112)) ) /*0x19519*/
      {
        ++v3; /*0x1951b*/
        v4 += 24; /*0x1951e*/
        if ( v3 >= *(_QWORD *)(SystemTable + 104) ) /*0x19526*/
          goto LABEL_6; /*0x19526*/
      }
      result = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v3 + 16); /*0x1959c*/
      qword_1C410 = result; /*0x195a1*/
    }
    else
    {
LABEL_6:
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x19528*/
      Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x19556*/
      result = qword_1C410; /*0x1955b*/
    }
    if ( !result ) /*0x19565*/
    {
      Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x19578*/
      return qword_1C410; /*0x1957d*/
    }
  }
  return result; /*0x1958e*/
}


// Function: PciExpressRead @ 0x195ac (0x3a bytes)

__int64 __fastcall PciExpressRead(__int64 n1024064)
{
  if ( (n1024064 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x195bc*/
    Assert( /*0x195d1*/
      (UINTN)"e:\\hs\\MdePkg\\Library\\SmmPciExpressLib\\PciExpressLib.c",
      118,
      (__int64)"((Address) & ~0xfffffff) == 0");
  return n1024064 + gXhciBase; /*0x195e0*/
}


// Function: PciExpressWrite @ 0x195e8 (0x4e bytes)

__int64 PciExpressWrite()
{
  unsigned __int8 v0; // al
  char n3_1; // al
  char n3; // cl
  __int64 result; // rax

  v0 = __inbyte(0x70u); /*0x195ed*/
  __outbyte(0x70u, v0 & 0x80 | 0x4B); /*0x195f2*/
  n3_1 = __inbyte(0x71u); /*0x195f8*/
  n3 = n3_1; /*0x195f9*/
  if ( (unsigned __int8)n3_1 > 3u ) /*0x19600*/
  {
    n3 = n3; /*0x19602*/
    if ( !n3 ) /*0x1960a*/
      n3 = MEMORY[0xFDAF0490] & 2 | 1; /*0x19616*/
  }
  if ( (unsigned __int8)(n3 - 1) > 0xFDu ) /*0x19620*/
    return 0; /*0x19633*/
  result = 2147483718LL; /*0x19625*/
  if ( n3 == 1 ) /*0x1962f*/
    return 2147483652LL; /*0x1962f*/
  return result; /*0x19632*/
}


// Function: PcdGet32 @ 0x19638 (0x8c bytes)

__int64 PcdGet32()
{
  __int64 result; // rax
  __int64 v1; // rax

  result = qword_1C430; /*0x1963c*/
  if ( !qword_1C430 ) /*0x19646*/
  {
    v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_1C090, 0, &qword_1C430); /*0x1965f*/
    if ( v1 < 0 ) /*0x19668*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0x19679*/
      Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 78, (__int64)"!EFI_ERROR (Status)"); /*0x19691*/
    }
    result = qword_1C430; /*0x19696*/
    if ( !qword_1C430 ) /*0x196a0*/
    {
      Assert((UINTN)"e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 79, (__int64)"mPcd != ((void *) 0)"); /*0x196b3*/
      return qword_1C430; /*0x196b8*/
    }
  }
  return result; /*0x196bf*/
}


// Function: Assert_1 @ 0x196c4 (0x2f bytes)

__int64 __fastcall sub_196C4(__int64 a1)
{
  if ( !a1 ) /*0x196d0*/
    Assert((UINTN)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0x196e5*/
  return *(_QWORD *)a1; /*0x196ed*/
}


// Function: UnalignedRead32 @ 0x196f4 (0x6e bytes)

bool __fastcall UnalignedRead32(__int64 ImageHandle, __int64 a2)
{
  __int64 v3; // rdi
  __int64 v4; // rbx
  __int64 v5; // rbp
  __int64 v6; // rax

  v3 = Assert_1((__int64)&unk_1C0B0); /*0x1971a*/
  v4 = Assert_1(a2); /*0x19729*/
  v5 = Assert_1((__int64)&unk_1C0B8); /*0x19735*/
  v6 = Assert_1(a2 + 8); /*0x19738*/
  return v3 == v4 && v5 == v6; /*0x1975c*/
}


// Function: MemZero @ 0x197c0 (0x5d bytes)

int *__fastcall MemZero(int *buf, int value, unsigned __int64 n4)
{
  int *buf_1; // rdi
  int value_1; // eax
  unsigned __int64 n4_1; // rcx
  __int16 value_2; // bx
  int v7; // eax
  __int64 v8; // rdx
  char n4_2; // dl
  unsigned __int64 i; // rcx

  buf_1 = buf; /*0x197c3*/
  value_1 = value; /*0x197c6*/
  n4_1 = n4; /*0x197c9*/
  BYTE1(value_1) = value; /*0x197da*/
  value_2 = value_1; /*0x197dc*/
  v7 = value_1 << 16; /*0x197df*/
  LOWORD(v7) = value_2; /*0x197e3*/
  if ( n4 >= 4 ) /*0x197ea*/
  {
    v8 = (unsigned __int8)buf_1 & 3; /*0x197ef*/
    if ( ((unsigned __int8)buf_1 & 3) != 0 ) /*0x197f3*/
    {
      memset(buf_1, value_2, 4 - v8); /*0x19802*/
      buf_1 = (int *)((char *)buf_1 + 4 - v8); /*0x19802*/
      n4_1 = n4 - (4 - v8); /*0x19804*/
    }
    n4_2 = n4_1; /*0x19807*/
    for ( i = n4_1 >> 2; i; --i ) /*0x1980a*/
      *buf_1++ = v7; /*0x1980e*/
    n4_1 = n4_2 & 3; /*0x19814*/
  }
  memset(buf_1, value_2, n4_1); /*0x19817*/
  return buf; /*0x1981a*/
}