Index: pcsx2/VUops.cpp===================================================================--- pcsx2/VUops.cpp (revision 3696)+++ pcsx2/VUops.cpp (working copy)@@ -1579,7 +1579,7 @@ __fi u32* GET_VU_MEM(VURegs* VU, u32 addr) // non-static, also used by sVU for now. { if( VU == &vuRegs[1] ) return (u32*)(vuRegs[1].Mem+(addr&0x3fff));- if( addr >= 0x4000 ) return (u32*)(vuRegs[0].Mem+(addr&0x43f0)); // get VF and VI regs (they're mapped to 0x4xx0 in VU0 mem!)+ if( addr & 0x4000 ) return (u32*)(vuRegs[1].VF+(addr&0x3f0)); // get VF and VI regs (they're mapped to 0x4xx0 in VU0 mem!) return (u32*)(vuRegs[0].Mem+(addr&0x0fff)); // for addr 0x0000 to 0x4000 just wrap around }Index: pcsx2/x86/microVU_Misc.inl===================================================================--- pcsx2/x86/microVU_Misc.inl (revision 3696)+++ pcsx2/x86/microVU_Misc.inl (working copy)@@ -224,8 +224,11 @@ xSHL(gprReg, 4); } else {- xCMP(gprReg, 0x400);- xForwardJL8 jmpA; // if addr >= 0x4000, reads VU1's VF regs and VI regs+ xTEST(gprReg, 0x400);+ xForwardJNZ8 jmpA; // if addr & 0x4000, reads VU1's VF regs and VI regs+ xAND(gprReg, 0xff); // if !(addr & 0x4000), wrap around+ xForwardJump8 jmpB;+ jmpA.SetTarget(); if (IsDevBuild && !isCOP2) { // Lets see which games do this! xPUSH(gprT1); // Note: Kernel does it via COP2 to initialize VU1! xPUSH(gprT2); // So we don't spam console, we'll only check micro-mode...@@ -236,10 +239,8 @@ xPOP(gprT2); xPOP(gprT1); }- xAND(gprReg, 0x43f); // ToDo: theres a potential problem if VU0 overrides VU1's VF0/VI0 regs!- xForwardJump8 jmpB;- jmpA.SetTarget();- xAND(gprReg, 0xff); // if addr < 0x4000, wrap around+ xAND(gprReg, 0x3f); // ToDo: theres a potential problem if VU0 overrides VU1's VF0/VI0 regs!+ xADD(gprReg, (u128*)VU1.VF - (u128*)VU0.Mem); jmpB.SetTarget(); xSHL(gprReg, 4); // multiply by 16 (shift left by 4) }