User:Haxar/NV2A
From xboxdevwiki
NV2A register access from D3D8
I wanted to know how NV2A registers were being accessed from Xbox executables. So, I loaded IDA with Turok with the applied Xbox Flirt Signatures v.2 and took references from pbkit to help me out with this.
D3D::CMiniport::MapRegisters is where it all begins. This is just a handful of subroutines from the D3D::CMiniport namespace.
Every single access is annotated from pbkit. It has been very useful.
// turok // using pbkit/outer.h // gpu == 0xfd000000
signed int __thiscall D3D::CMiniport::MapRegisters(void *this)
{
*(_DWORD *)this = 0xFD000000u; // VIDEO_BASE
vFD001804 |= 4u; // NV_PBUS_PCI_NV_1_BUS_MASTER_ENABLED
vFD600140 = 0; // PCRTC_INTR_EN_VBLANK_DISABLED
vFD009140 = 0; // NV_PTIMER_INTR_EN_0_ALARM_DISABLED
return 1;
}
signed int __thiscall D3D::CMiniport::LoadEngines(void *this)
{
void *v1; // edi@1
int gpu; // esi@1
int v3; // eax@1
int v4; // ecx@1
v1 = this;
gpu = *(_DWORD *)this;
v3 = *(_DWORD *)this + 6220;
v4 = *(_DWORD *)v3;
*(_DWORD *)v3 &= 0xFFFFFCFFu;
*(_DWORD *)v3 = v4;
*(_DWORD *)(gpu + 0x200) = 0xFFFFFFFFu; // NV_PMC_ENABLE_ALL_ENABLE
*(_DWORD *)(gpu + 0x140) = *((_DWORD *)v1 + 45);// NV_PMC_INTR_EN_0
D3D::CMiniport::HalDacLoad(v1); // PCRTC_INTR_EN_VBLANK_ENABLED
*(_DWORD *)(gpu + 0x9400) = 0; // NV_PTIMER_TIME_0
*(_DWORD *)(gpu + 0x9410) = 0; // NV_PTIMER_TIME_1
*(_DWORD *)(gpu + 0x400720) = 0; // NV_PGRAPH_FIFO_ACCESS_DISABLE
D3D::CMiniport::HalGrControlLoad(v1);
*(_DWORD *)(gpu + 0x400100) = 0xFFFFFFFFu; // NV_PGRAPH_INTR_ALL_ENABLE
*(_DWORD *)(gpu + 0x400140) = 0xFFFFFFFFu; // NV_PGRAPH_INTR_EN_ALL_ENABLE
D3D::CMiniport::HalFifoControlLoad(v1);
*(_DWORD *)(gpu + 0x2100) = 0xFFFFFFFFu; // NV_PFIFO_INTR_0_ALL_RESET
*(_DWORD *)(gpu + 0x2140) = *((_DWORD *)v1 + 71);// NV_PFIFO_INTR_EN_0
*((_DWORD *)v1 + 528) = 0xFFFFFFFFu;
*((_DWORD *)v1 + 529) = 0xFFFFFFFFu;
*((_DWORD *)v1 + 520) = 0;
*((_DWORD *)v1 + 521) = 0;
return 1;
}
int __thiscall D3D::CMiniport::HalDacLoad(void *this)
{
int gpu; // eax@1
gpu = *(_DWORD *)this;
*(_DWORD *)(*(_DWORD *)this + 6291712) = 1;
*(_DWORD *)(gpu + 0x600140) = 1; // PCRTC_INTR_EN_VBLANK_ENABLED
return gpu;
}
int __thiscall D3D::CMiniport::HalGrControlLoad(int this)
{
int v1; // edi@1
int gpu; // esi@1
int v3; // eax@1
signed int v4; // edx@1
int v5; // eax@1
int v6; // ebp@2
int v7; // ebp@2
int v8; // ebp@2
int v9; // eax@3
int v10; // edx@4
int v11; // ebp@4
char v12; // zf@4
int v13; // eax@5
int v14; // eax@5
int v15; // eax@5
signed int v17; // [sp+14h] [bp-4h]@3
v1 = this;
gpu = *(_DWORD *)this;
v3 = *(_DWORD *)this + 512;
*(_DWORD *)v3 &= 0xFFFFEFFFu;
*(_DWORD *)v3 |= 0x1000u;
*(_DWORD *)(this + 2028) = 0;
*(_DWORD *)(this + 2044) = 0; // NV_PGRAPH_DEBUG_4
*(_DWORD *)(this + 2056) = 0; // NV_PGRAPH_UNKNOWN_400B84
*(_DWORD *)(this + 2068) = 0; // NV_PGRAPH_UNKNOWN_400B88
*(_DWORD *)(this + 2032) = 0x118700u; // NV_PGRAPH_DEBUG_1
*(_DWORD *)(this + 2036) = 0x28C3FFu; // NV_PGRAPH_DEBUG_7
*(_DWORD *)(this + 2040) = 0xF3DE0479u; // NV_PGRAPH_DEBUG_3
*(_DWORD *)(this + 2048) = 4; // NV_PGRAPH_DEBUG_5
*(_DWORD *)(this + 2052) = 0x45EAD10Eu; // NV_PGRAPH_UNKNOWN_400B80
*(_DWORD *)(this + 2060) = 0x78u; // NV_PGRAPH_UNKNOWN_400098
*(_DWORD *)(this + 2064) = 0x40u; // NV_PGRAPH_UNKNOWN_40009C
*(_DWORD *)(gpu + 0x400080) = 0; // NV_PGRAPH_DEBUG_0_NO_RESET
*(_DWORD *)(gpu + 0x400084) = *(_DWORD *)(this + 2032);// NV_PGRAPH_DEBUG_1
*(_DWORD *)(gpu + 0x400880) = *(_DWORD *)(this + 2036);// NV_PGRAPH_DEBUG_7
*(_DWORD *)(gpu + 0x40008C) = *(_DWORD *)(this + 2040);// NV_PGRAPH_DEBUG_3
*(_DWORD *)(gpu + 0x400090) = *(_DWORD *)(this + 2044);// NV_PGRAPH_DEBUG_4
*(_DWORD *)(gpu + 0x400094) = *(_DWORD *)(this + 2048);// NV_PGRAPH_DEBUG_5
*(_DWORD *)(gpu + 0x400B80) = *(_DWORD *)(this + 2052);// NV_PGRAPH_UNKNOWN_400B80
*(_DWORD *)(gpu + 0x400B84) = *(_DWORD *)(this + 2056);// NV_PGRAPH_UNKNOWN_400B84
*(_DWORD *)(gpu + 0x400098) = *(_DWORD *)(this + 2060);// NV_PGRAPH_UNKNOWN_400098
*(_DWORD *)(gpu + 0x40009C) = *(_DWORD *)(this + 2064);// NV_PGRAPH_UNKNOWN_40009C
*(_DWORD *)(gpu + 0x400B88) = *(_DWORD *)(this + 2068);// NV_PGRAPH_UNKNOWN_400B88
*(_DWORD *)(gpu + 0x400780) = *(_DWORD *)(this + 320) & 0xFFFF;// NV_PGRAPH_CHANNEL_CTX_TABLE
D3D::CMiniport::HalGrIdle((void *)this);
v4 = 80;
v5 = gpu + 0x400904; // NV_PGRAPH_TLIMIT_XBOX
do
{
v6 = *(_DWORD *)(v5 - 0x3006C0); // NV_PFB_TLIMIT
*(_DWORD *)v5 = v6; // NV_PGRAPH_TLIMIT_XBOX
*(_DWORD *)(gpu + 0x400750) = (v4 - 32) & 0x1FFC | 0xEA0000;// NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v6; // NV_PGRAPH_RDI_DATA
v7 = *(_DWORD *)(v5 - 0x3006BC); // NV_PFB_TSIZE
*(_DWORD *)(v5 + 4) = v7; // NV_PGRAPH_TSIZE_XBOX
*(_DWORD *)(gpu + 0x400750) = v4 & 0x1FFC | 0xEA0000;// NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v7; // NV_PGRAPH_RDI_DATA
v8 = *(_DWORD *)(v5 - 0x3006C4); // NV_PFB_TILE
*(_DWORD *)(v5 - 4) = v8; // NV_PGRAPH_TILE_XBOX
*(_DWORD *)(gpu + 0x400750) = (v4 - 64) & 0x1FFC | 0xEA0000;// NV_PGRAPH_RDI_INDEX
v4 += 4;
v5 += 0x10u;
*(_DWORD *)(gpu + 0x400754) = v8; // NV_PGRAPH_RDI_DATA
}
while ( v4 < 112 );
v9 = gpu + 0x400980; // NV_PGRAPH_ZCOMP_XBOX
v17 = 8;
do
{
v10 = *(_DWORD *)(v9 - 0x300680); // NV_PFB_ZCOMP
*(_DWORD *)v9 = v10; // NV_PGRAPH_ZCOMP_XBOX
v11 = (v9 + 0xFFBFF710 - gpu) & 0x1FFC | 0xEA0000;// (0x90) & 0x1FFC | 0xEA0000
v9 += 4;
v12 = v17-- == 1;
*(_DWORD *)(gpu + 0x400750) = v11; // NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v10; // NV_PGRAPH_RDI_DATA
}
while ( !v12 );
v13 = *(_DWORD *)(gpu + 0x100324); // NV_PFB_ZCOMP_OFFSET
*(_DWORD *)(gpu + 0x4009A0) = v13; // NV_PGRAPH_ZCOMP_OFFSET_XBOX
*(_DWORD *)(gpu + 0x400750) = 0xEA000Cu; // NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v13; // NV_PGRAPH_RDI_DATA
v14 = *(_DWORD *)(gpu + 0x100200); // NV_PFB_CFG0
*(_DWORD *)(gpu + 0x4009A4) = v14; // NV_PGRAPH_CFG0_XBOX
*(_DWORD *)(gpu + 0x400750) = 0xEA0000u; // NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v14; // NV_PGRAPH_RDI_DATA
v15 = *(_DWORD *)(gpu + 0x100204); // NV_PFB_CFG1
*(_DWORD *)(gpu + 0x4009A8) = v15; // NV_PGRAPH_CFG1_XBOX
*(_DWORD *)(gpu + 0x400750) = 0xEA0004u; // NV_PGRAPH_RDI_INDEX
*(_DWORD *)(gpu + 0x400754) = v15; // NV_PGRAPH_RDI_DATA
*(_DWORD *)(gpu + 0x40014C) = 0; // NV_PGRAPH_CTX_SWITCH1_ALL_DISABLE
*(_DWORD *)(gpu + 0x400150) = 0; // NV_PGRAPH_CTX_SWITCH2_ALL_DISABLE
*(_DWORD *)(gpu + 0x400154) = 0; // NV_PGRAPH_CTX_SWITCH3_ALL_DISABLE
*(_DWORD *)(gpu + 0x400158) = 0; // NV_PGRAPH_CTX_SWITCH4_ALL_DISABLE
*(_DWORD *)(gpu + 0x400144) = 0x10000000u; // NV_PGRAPH_CTX_CONTROL_DEVICE_ENABLED
*(_DWORD *)(gpu + 0x400764) = 0x8000000u; // NV_PGRAPH_FFINTFC_ST2_CHID_STATUS_VALID
return D3D::CMiniport::HalGrLoadChannelContext((void *)v1, *(_DWORD *)(v1 + 308));
}
int __thiscall D3D::CMiniport::HalGrIdle(void *this)
{
void *v1; // edi@1
int gpu; // esi@1
int result; // eax@1
int v4; // ebx@2
v1 = this;
gpu = *(_DWORD *)this;
result = *(_DWORD *)(*(_DWORD *)this + 4196096);
if ( result )
{
do
{
v4 = *(_DWORD *)(gpu + 0x100); // NV_PBUS_ROM_VERSION_MASK
if ( BYTE1(v4) & 0x10 )
result = unknown_libname_835(v1);
if ( v4 & 0x1000000 )
result = D3D::CMiniport::VBlank(v1);
}
while ( *(_DWORD *)(gpu + 0x400700) ); // NV_PGRAPH_STATUS_NOT_BUSY (while BUSY)
}
return result;
}
int __thiscall unknown_libname_835(void *this)
{
int gpu; // esi@1
int v2; // eax@1
int v3; // ebx@1
int v4; // edi@1
void *v6; // [sp+0h] [bp-4h]@1
v6 = this;
gpu = *(_DWORD *)this;
*(_DWORD *)(*(_DWORD *)this + 0x400720) = 0; // NV_PGRAPH_FIFO_ACCESS_DISABLE
v2 = *(_DWORD *)(gpu + 0x400100); // NV_PGRAPH_INTR
v3 = *(_DWORD *)(gpu + 0x400108); // NV_PGRAPH_NSOURCE
v4 = *(_DWORD *)(gpu + 0x400704) & 0x1FFC; // NV_PGRAPH_TRAPPED_ADDR_MTHD
if ( !(BYTE1(v2) & 0x10) ) // NV_PGRAPH_INTR_MISSING_HW_PENDING
goto LABEL_14;
*(_DWORD *)(gpu + 0x400100) = 0x1000u; // NV_PGRAPH_INTR_CONTEXT_SWITCH_PENDING
while ( *(_DWORD *)(*(_DWORD *)this + 0x400700) )// NV_PGRAPH_STATUS_NOT_BUSY (while BUSY)
;
D3D::CMiniport::HalGrLoadChannelContext(this, ((unsigned int)v4 >> 20) & 0x1F);
v2 = *(_DWORD *)(gpu + 0x400100); // NV_PGRAPH_INTR
if ( v2 )
{
LABEL_14:
*(_DWORD *)(gpu + 0x400100) = v2; // NV_PGRAPH_INTR
if ( v3 && v2 & 0x100001 && !(v3 & 0x40) ) // NV_PGRAPH_NSOURCE && NV_PGRAPH_INTR & NV_PGRAPH_INTR_NOTIFY_PENDING|NV_PGRAPH_INTR_ERROR_PENDING && !(NV_PGRAPH_NSOURCE & NV_PGRAPH_NSOURCE_ILLEGAL_MTHD_PENDING)
{
if ( v4 == 0x100 ) // NV_PGRAPH_TRAPPED_ADDR_MTHD
{
D3D::CMiniport::SoftwareMethod(v6, *(_DWORD *)(gpu + 0x400708));// NV_PGRAPH_TRAPPED_DATA_LOW
}
else
{
unknown_libname_837(
"Graphics hardware error information:\n Source: %08x\n ChID: %d\n Class: %x\n Method: %08x\n Data: %08x\n Get: %08x\n",
v3, // NV_PGRAPH_NSOURCE
((unsigned int)v4 >> 20) & 0x1F, // NV_PGRAPH_TRAPPED_ADDR_CHID
*(_DWORD *)(gpu + 0x40014C) & 0xFF, // NV_PGRAPH_CTX_SWITCH1_GRCLASS
v4, // NV_PGRAPH_TRAPPED_ADDR_MTHD
*(_DWORD *)(gpu + 0x400708), // NV_PGRAPH_TRAPPED_DATA_LOW
vFD003244 | 0x80000000); // NV_PFIFO_CACHE1_DMA_GET
__debugbreak();
}
}
}
*(_DWORD *)(gpu + 0x400720) = 1; // NV_PGRAPH_FIFO_ACCESS_ENABLE
return *(_DWORD *)(gpu + 0x400100); // NV_PGRAPH_INTR
}
//TODO D3D::CMiniport::VBlank
int __thiscall D3D::CMiniport::HalGrLoadChannelContext(void *this, int a2)
{
void *v2; // ebx@1
int gpu; // esi@1
int v4; // edx@3
int result; // eax@6
signed int v6; // eax@8
int v7; // edi@10
int v8; // esi@10
int v9; // [sp+Ch] [bp-4h]@3
v2 = this;
gpu = *(_DWORD *)this;
if ( *(_DWORD *)(*(_DWORD *)this + 4194560) )
unknown_libname_835(this);
v9 = *(_DWORD *)(gpu + 0x400720); // NV_PGRAPH_FIFO
*(_DWORD *)(gpu + 0x400720) = 0; // NV_PGRAPH_FIFO_ACCESS_DISABLE
D3D::CMiniport::HalGrIdle(v2);
v4 = a2;
if ( *((_DWORD *)v2 + 77) != a2 )
{
D3D::CMiniport::HalGrUnloadChannelContext(v2, *((_DWORD *)v2 + 77));
v4 = a2;
}
*((_DWORD *)v2 + 77) = v4;
if ( v4 == 2 )
{
*(_DWORD *)(gpu + 0x400144) = 0x10000100u; // NV_PGRAPH_CTX_CONTROL_TIME_NOT_EXPIRED|NV_PGRAPH_CTX_CONTROL_DEVICE_ENABLED
result = v9 | 1;
*(_DWORD *)(gpu + 0x400764) = 0x8000000u; // NV_PGRAPH_FFINTFC_ST2_CHID_STATUS_VALID
*(_DWORD *)(gpu + 0x400720) = v9 | 1; // NV_PGRAPH_FIFO_ACCESS_ENABLE
}
else
{
if ( *((_DWORD *)v2 + v4 + 81) )
{
*(_DWORD *)(gpu + 0x400080) = 0x70000u; // NV_PGRAPH_DEBUG_0_IDX_STATE_RESET|NV_PGRAPH_DEBUG_0_VTX_STATE_RESET|NV_PGRAPH_DEBUG_0_CAS_STATE_RESET
*(_DWORD *)(gpu + 0x400080) = 0; // NV_PGRAPH_DEBUG_0_NO_RESET
*(_DWORD *)(gpu + 0x400750) = 0x3D0000u; // NV_PGRAPH_RDI_INDEX_SELECT
v6 = 15;
do
{
--v6;
*(_DWORD *)(gpu + 0x400754) = 0; // NV_PGRAPH_RDI_DATA
}
while ( v6 );
}
*(_DWORD *)(gpu + 0x400084) |= 0x1000000u; // NV_PGRAPH_DEBUG_1_CACHE_INVALIDATE
v7 = (v4 & 0x1F) << 24;
*(_DWORD *)(gpu + 0x400148) = v7; // NV_PGRAPH_CTX_USER
*(_DWORD *)(gpu + 0x400784) = *((_DWORD *)v2 + a2 + 78) & 0xFFFF;// NV_PGRAPH_CHANNEL_CTX_POINTER_INST
*(_DWORD *)(gpu + 0x400788) = 1; // NV_PGRAPH_CHANNEL_CTX_STATUS_LOADED
D3D::CMiniport::HalGrIdle(v2);
*(_DWORD *)(gpu + 0x400148) = v7 | *(_DWORD *)(gpu + 0x400148) & 0xE0FFFFFF;// NV_PGRAPH_CTX_USER_CHID (inverted mask)
*(_DWORD *)(gpu + 0x400144) = 0x10010100u; // NV_PGRAPH_CTX_CONTROL_TIME_NOT_EXPIRED|NV_PGRAPH_CTX_CONTROL_CHID_VALID|NV_PGRAPH_CTX_CONTROL_DEVICE_ENABLED
v8 = gpu + 0x400764; // NV_PGRAPH_FFINTFC_ST2
result = *(_DWORD *)v8 & 0xCFFFFFFF; // NV_PGRAPH_FFINTFC_ST2_CHSWITCH_CLEAR&NV_PGRAPH_FFINTFC_ST2_FIFOHOLD_CLEAR
*(_DWORD *)v8 = result; // NV_PGRAPH_FFINTFC_ST2
}
return result;
}
int __thiscall D3D::CMiniport::HalGrUnloadChannelContext(void *this, int a2)
{
int result; // eax@1
int gpu; // esi@1
result = a2;
gpu = *(_DWORD *)this;
if ( a2 != 2 )
{
*(_DWORD *)(gpu + 0x400784) = *((_DWORD *)this + a2 + 78) & 0xFFFF;// NV_PGRAPH_CHANNEL_CTX_POINTER_INST
*(_DWORD *)(gpu + 0x400788) = 2; // NV_PGRAPH_CHANNEL_CTX_STATUS_UNLOADED
result = D3D::CMiniport::HalGrIdle(this);
*(_DWORD *)(gpu + 0x400144) = 0x10000000u; // NV_PGRAPH_CTX_CONTROL_DEVICE_ENABLED
}
return result;
}
int __thiscall D3D::CMiniport::HalFifoControlLoad(void *this)
{
int gpu; // esi@1
int result; // eax@1
gpu = *(_DWORD *)this;
*(_DWORD *)(*(_DWORD *)this + 12836) = 0xF0078u;
*(_DWORD *)(gpu + 0x2044) = 0x101FFFFu; // NV_PFIFO_DMA_TIMESLICE_SELECT_128K|NV_PFIFO_DMA_TIMESLICE_TIMEOUT_ENABLED
*(_DWORD *)(gpu + 0x2040) = *((_DWORD *)this + 72) & 0x3FF;// NV_PFIFO_DELAY_0_WAIT_RETRY
*(_DWORD *)(gpu + 0x2500) = 0; // NV_PFIFO_CACHES_ALL_DISABLE
*(_DWORD *)(gpu + 0x3000) = 0; // NV_PFIFO_CACHE0_PUSH0_ACCESS_DISABLE
*(_DWORD *)(gpu + 0x3050) = 0; // NV_PFIFO_CACHE0_PULL0_ACCESS_DISABLE
*(_DWORD *)(gpu + 0x3200) = 0; // NV_PFIFO_CACHE1_PUSH0_ACCESS_DISABLE
*(_DWORD *)(gpu + 0x3250) = 0; // NV_PFIFO_CACHE1_PULL0_ACCESS_DISABLE
*(_DWORD *)(gpu + 0x3220) = 0; // NV_PFIFO_CACHE1_DMA_PUSH_ACCESS_DISABLE
result = D3D::CMiniport::HalFifoContextSwitch(this, 1);
*(_DWORD *)(gpu + 0x3210) = 0; // NV_PFIFO_CACHE1_PUT_ADDRESS
*(_DWORD *)(gpu + 0x3270) = 0; // NV_PFIFO_CACHE1_GET_ADDRESS
*(_DWORD *)(gpu + 0x3250) = 1; // NV_PFIFO_CACHE1_PULL0_ACCESS_ENABLE
*(_DWORD *)(gpu + 0x3200) = 1; // NV_PFIFO_CACHE1_PUSH0_ACCESS_ENABLE
*(_DWORD *)(gpu + 0x2500) = 1; // NV_PFIFO_CACHES_REASSIGN_ENABLED
*(_DWORD *)(gpu + 0x2500) = 0; // NV_PFIFO_CACHES_ALL_DISABLE
return result;
}
int __thiscall D3D::CMiniport::HalFifoContextSwitch(void *this, int a2_switch)
{
void *v2; // esi@1
int gpu; // eax@1
int v4; // ebx@1
int v5; // ecx@1
int v6; // edx@1
int v7; // ecx@2
int v8; // edx@8
int v9; // [sp+Ch] [bp-14h]@1
int v10; // [sp+10h] [bp-10h]@1
int v11; // [sp+14h] [bp-Ch]@1
signed int v12; // [sp+1Ch] [bp-4h]@2
v2 = this;
gpu = *(_DWORD *)this;
v4 = *((_DWORD *)this + 74); // unknown1
v9 = *(_DWORD *)(*(_DWORD *)this + 9472);
v10 = *(_DWORD *)(*(_DWORD *)this + 12800);
v11 = *(_DWORD *)(*(_DWORD *)this + 12880);
*(_DWORD *)(*(_DWORD *)this + 9472) = 0;
*(_DWORD *)(gpu + 0x3200) = 0; // NV_PFIFO_CACHE1_PUSH0_ACCESS_DISABLE
*(_DWORD *)(gpu + 0x3250) = 0; // NV_PFIFO_CACHE1_PULL0_ACCESS_DISABLE
v5 = *(_DWORD *)(gpu + 0x3204) & 0x1F; // NV_PFIFO_CACHE1_PUSH1_CHID
v6 = gpu + v4 + ((*(_DWORD *)(gpu + 0x3204) & 0x1F) << 6);// unknown2
*(_DWORD *)v6 = *(_DWORD *)(gpu + 0x3240); // NV_PFIFO_CACHE1_DMA_PUT
*(_DWORD *)(v6 + 4) = *(_DWORD *)(gpu + 0x3244);// NV_PFIFO_CACHE1_DMA_GET
*(_DWORD *)(v6 + 8) = *(_DWORD *)(gpu + 0x3248);// NV_PFIFO_CACHE1_REF
*(_DWORD *)(v6 + 12) = *(_DWORD *)(gpu + 0x322C);// NV_PFIFO_CACHE1_DMA_INSTANCE
*(_DWORD *)(v6 + 16) = *(_DWORD *)(gpu + 0x3228);// NV_PFIFO_CACHE1_DMA_STATE
*(_DWORD *)(v6 + 20) = *(_DWORD *)(gpu + 0x3224);// NV_PFIFO_CACHE1_DMA_FETCH
*(_DWORD *)(v6 + 24) = *(_DWORD *)(gpu + 0x3280);// NV_PFIFO_CACHE1_ENGINE
*(_DWORD *)(v6 + 28) = *(_DWORD *)(gpu + 0x3254);// NV_PFIFO_CACHE1_PULL1
*(_DWORD *)(v6 + 32) = *(_DWORD *)(gpu + 0x3268);// NV_PFIFO_CACHE1_ACQUIRE_2
*(_DWORD *)(v6 + 36) = *(_DWORD *)(gpu + 0x3264);// NV_PFIFO_CACHE1_ACQUIRE_1
*(_DWORD *)(v6 + 40) = *(_DWORD *)(gpu + 0x3260);// NV_PFIFO_CACHE1_ACQUIRE_0
*(_DWORD *)(v6 + 44) = *(_DWORD *)(gpu + 0x326C);// NV_PFIFO_CACHE1_SEMAPHORE
*(_DWORD *)(v6 + 48) = *(_DWORD *)(gpu + 0x324C);// NV_PFIFO_CACHE1_DMA_SUBROUTINE
if ( *(_DWORD *)(gpu + 0x3204) & 0x100 ) // NV_PFIFO_CACHE1_PUSH1_MODE_DMA
{
v12 = 1 << v5;
v7 = *(_DWORD *)(gpu + 0x2508) & ~(1 << v5);// NV_PFIFO_DMA
if ( *(_DWORD *)(gpu + 0x3240) != *(_DWORD *)(gpu + 0x3244) )// NV_PFIFO_CACHE1_DMA_PUT != NV_PFIFO_CACHE1_DMA_GET
v7 |= v12;
*(_DWORD *)(gpu + 0x2508) = v7; // NV_PFIFO_DMA
}
*(_DWORD *)(gpu + 0x3204) = a2_switch & 0x1F; // NV_PFIFO_CACHE1_PUSH1_CHID
if ( (1 << a2_switch) & *((_DWORD *)v2 + 65) && a2_switch != 1 )
*(_DWORD *)(gpu + 0x3204) |= 0x100u; // NV_PFIFO_CACHE1_PUSH1_MODE_DMA
v8 = v4 + (a2_switch << 6) + gpu; // unknown3
*(_DWORD *)(gpu + 0x3240) = *(_DWORD *)v8; // NV_PFIFO_CACHE1_DMA_PUT
*(_DWORD *)(gpu + 0x3244) = *(_DWORD *)(v8 + 4);// NV_PFIFO_CACHE1_DMA_GET
*(_DWORD *)(gpu + 0x3248) = *(_DWORD *)(v8 + 8);// NV_PFIFO_CACHE1_REF
*(_DWORD *)(gpu + 0x322C) = *(_DWORD *)(v8 + 12);// NV_PFIFO_CACHE1_DMA_INSTANCE
*(_DWORD *)(gpu + 0x3228) = *(_DWORD *)(v8 + 16);// NV_PFIFO_CACHE1_DMA_STATE
*(_DWORD *)(gpu + 0x3224) = *(_DWORD *)(v8 + 20);// NV_PFIFO_CACHE1_DMA_FETCH
*(_DWORD *)(gpu + 0x3280) = *(_DWORD *)(v8 + 24);// NV_PFIFO_CACHE1_ENGINE
*(_DWORD *)(gpu + 0x3254) = *(_DWORD *)(v8 + 28);// NV_PFIFO_CACHE1_PULL1
*(_DWORD *)(gpu + 0x3268) = *(_DWORD *)(v8 + 32);// NV_PFIFO_CACHE1_ACQUIRE_2
*(_DWORD *)(gpu + 0x3264) = *(_DWORD *)(v8 + 36);// NV_PFIFO_CACHE1_ACQUIRE_1
*(_DWORD *)(gpu + 0x3260) = *(_DWORD *)(v8 + 40);// NV_PFIFO_CACHE1_ACQUIRE_0
*(_DWORD *)(gpu + 0x326C) = *(_DWORD *)(v8 + 44);// NV_PFIFO_CACHE1_SEMAPHORE
*(_DWORD *)(gpu + 0x324C) = *(_DWORD *)(v8 + 48);// NV_PFIFO_CACHE1_DMA_SUBROUTINE
if ( (1 << a2_switch) & *((_DWORD *)v2 + 65) && a2_switch != 1 )
*(_DWORD *)(gpu + 0x3220) = 1; // NV_PFIFO_CACHE1_DMA_PUSH_ACCESS_ENABLE
*(_DWORD *)(gpu + 0x204C) = 0x1FFFFFu; // NV_PFIFO_TIMESLICE_TIMER_EXPIRED
*(_DWORD *)(gpu + 0x3250) = v11; // NV_PFIFO_CACHE1_PULL0
*(_DWORD *)(gpu + 0x3200) = v10; // NV_PFIFO_CACHE1_PUSH0
*(_DWORD *)(gpu + 0x2500) = v9; // NV_PFIFO_CACHES
return gpu;
}