mirror of https://github.com/PCSX2/pcsx2.git
149 lines
3.2 KiB
C++
149 lines
3.2 KiB
C++
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
|
// SPDX-License-Identifier: GPL-3.0+
|
|
|
|
#include "Common.h"
|
|
#include "VUmicro.h"
|
|
#include "MTVU.h"
|
|
|
|
alignas(16) VURegs vuRegs[2];
|
|
|
|
void vuMemAllocate()
|
|
{
|
|
u8* curpos = SysMemory::GetVUMem();
|
|
VU0.Micro = curpos; curpos += VU0_PROGSIZE;
|
|
VU0.Mem = curpos; curpos += VU0_MEMSIZE;
|
|
VU1.Micro = curpos; curpos += VU1_PROGSIZE;
|
|
VU1.Mem = curpos; curpos += VU1_MEMSIZE;
|
|
}
|
|
|
|
void vuMemRelease()
|
|
{
|
|
VU0.Micro = VU0.Mem = nullptr;
|
|
VU1.Micro = VU1.Mem = nullptr;
|
|
}
|
|
|
|
void vuMemReset()
|
|
{
|
|
pxAssert( VU0.Mem );
|
|
pxAssert( VU1.Mem );
|
|
|
|
// Below memMap is already called by "void eeMemoryReserve::Reset()"
|
|
//memMapVUmicro();
|
|
|
|
// === VU0 Initialization ===
|
|
std::memset(&VU0.ACC, 0, sizeof(VU0.ACC));
|
|
std::memset(VU0.VF, 0, sizeof(VU0.VF));
|
|
std::memset(VU0.VI, 0, sizeof(VU0.VI));
|
|
VU0.VF[0].f.x = 0.0f;
|
|
VU0.VF[0].f.y = 0.0f;
|
|
VU0.VF[0].f.z = 0.0f;
|
|
VU0.VF[0].f.w = 1.0f;
|
|
VU0.VI[0].UL = 0;
|
|
|
|
// === VU1 Initialization ===
|
|
std::memset(&VU1.ACC, 0, sizeof(VU1.ACC));
|
|
std::memset(VU1.VF, 0, sizeof(VU1.VF));
|
|
std::memset(VU1.VI, 0, sizeof(VU1.VI));
|
|
VU1.VF[0].f.x = 0.0f;
|
|
VU1.VF[0].f.y = 0.0f;
|
|
VU1.VF[0].f.z = 0.0f;
|
|
VU1.VF[0].f.w = 1.0f;
|
|
VU1.VI[0].UL = 0;
|
|
}
|
|
|
|
bool SaveStateBase::vuMicroFreeze()
|
|
{
|
|
if(IsSaving())
|
|
vu1Thread.WaitVU();
|
|
|
|
if (!FreezeTag("vuMicroRegs"))
|
|
return false;
|
|
|
|
// VU0 state information
|
|
|
|
Freeze(VU0.ACC);
|
|
Freeze(VU0.VF);
|
|
Freeze(VU0.VI);
|
|
Freeze(VU0.q);
|
|
|
|
Freeze(VU0.cycle);
|
|
Freeze(VU0.flags);
|
|
Freeze(VU0.code);
|
|
Freeze(VU0.start_pc);
|
|
Freeze(VU0.branch);
|
|
Freeze(VU0.branchpc);
|
|
Freeze(VU0.delaybranchpc);
|
|
Freeze(VU0.takedelaybranch);
|
|
Freeze(VU0.ebit);
|
|
Freeze(VU0.pending_q);
|
|
Freeze(VU0.pending_p);
|
|
Freeze(VU0.micro_macflags);
|
|
Freeze(VU0.micro_clipflags);
|
|
Freeze(VU0.micro_statusflags);
|
|
Freeze(VU0.macflag);
|
|
Freeze(VU0.statusflag);
|
|
Freeze(VU0.clipflag);
|
|
Freeze(VU0.nextBlockCycles);
|
|
Freeze(VU0.VIBackupCycles);
|
|
Freeze(VU0.VIOldValue);
|
|
Freeze(VU0.VIRegNumber);
|
|
Freeze(VU0.fmac);
|
|
Freeze(VU0.fmacreadpos);
|
|
Freeze(VU0.fmacwritepos);
|
|
Freeze(VU0.fmaccount);
|
|
Freeze(VU0.fdiv);
|
|
Freeze(VU0.efu);
|
|
Freeze(VU0.ialu);
|
|
Freeze(VU0.ialureadpos);
|
|
Freeze(VU0.ialuwritepos);
|
|
Freeze(VU0.ialucount);
|
|
|
|
// VU1 state information
|
|
Freeze(VU1.ACC);
|
|
Freeze(VU1.VF);
|
|
Freeze(VU1.VI);
|
|
Freeze(VU1.q);
|
|
Freeze(VU1.p);
|
|
|
|
Freeze(VU1.cycle);
|
|
Freeze(VU1.flags);
|
|
Freeze(VU1.code);
|
|
Freeze(VU1.start_pc);
|
|
Freeze(VU1.branch);
|
|
Freeze(VU1.branchpc);
|
|
Freeze(VU1.delaybranchpc);
|
|
Freeze(VU1.takedelaybranch);
|
|
Freeze(VU1.ebit);
|
|
Freeze(VU1.pending_q);
|
|
Freeze(VU1.pending_p);
|
|
Freeze(VU1.micro_macflags);
|
|
Freeze(VU1.micro_clipflags);
|
|
Freeze(VU1.micro_statusflags);
|
|
Freeze(VU1.macflag);
|
|
Freeze(VU1.statusflag);
|
|
Freeze(VU1.clipflag);
|
|
Freeze(VU1.nextBlockCycles);
|
|
Freeze(VU1.xgkickaddr);
|
|
Freeze(VU1.xgkickdiff);
|
|
Freeze(VU1.xgkicksizeremaining);
|
|
Freeze(VU1.xgkicklastcycle);
|
|
Freeze(VU1.xgkickcyclecount);
|
|
Freeze(VU1.xgkickenable);
|
|
Freeze(VU1.xgkickendpacket);
|
|
Freeze(VU1.VIBackupCycles);
|
|
Freeze(VU1.VIOldValue);
|
|
Freeze(VU1.VIRegNumber);
|
|
Freeze(VU1.fmac);
|
|
Freeze(VU1.fmacreadpos);
|
|
Freeze(VU1.fmacwritepos);
|
|
Freeze(VU1.fmaccount);
|
|
Freeze(VU1.fdiv);
|
|
Freeze(VU1.efu);
|
|
Freeze(VU1.ialu);
|
|
Freeze(VU1.ialureadpos);
|
|
Freeze(VU1.ialuwritepos);
|
|
Freeze(VU1.ialucount);
|
|
|
|
return IsOkay();
|
|
}
|