diff --git a/pcsx2/Vif0_Commands.cpp b/pcsx2/Vif0_Commands.cpp deleted file mode 100644 index 44a874be86..0000000000 --- a/pcsx2/Vif0_Commands.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2009 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" -#include "Common.h" -#include "Vif_Dma.h" -#include "VUmicro.h" - -//------------------------------------------------------------------ -// Vif0 Data Transfer Commands -//------------------------------------------------------------------ - -static int __fastcall Vif0TransNull(u32 *data) // Shouldnt go here -{ - Console.WriteLn("VIF0 Shouldn't go here CMD = %x", vif0Regs->code); - vif0.cmd = 0; - return 0; -} - -static int __fastcall Vif0TransSTMask(u32 *data) // STMASK -{ - vif0Regs->mask = data[0]; - VIF_LOG("STMASK == %x", vif0Regs->mask); - - vif0.tag.size = 0; - vif0.cmd = 0; - return 1; -} - -static int __fastcall Vif0TransSTRow(u32 *data) // STROW -{ - int ret; - - u32* pmem = &vif0Regs->r0 + (vif0.tag.addr << 2); - u32* pmem2 = g_vifmask.Row0 + vif0.tag.addr; - pxAssume(vif0.tag.addr < 4); - ret = min(4 - vif0.tag.addr, vif0.vifpacketsize); - pxAssume(ret > 0); - - switch (ret) - { - case 4: - pmem[12] = data[3]; - pmem2[3] = data[3]; - case 3: - pmem[8] = data[2]; - pmem2[2] = data[2]; - case 2: - pmem[4] = data[1]; - pmem2[1] = data[1]; - case 1: - pmem[0] = data[0]; - pmem2[0] = data[0]; - break; - - jNO_DEFAULT - } - - vif0.tag.addr += ret; - vif0.tag.size -= ret; - if (vif0.tag.size == 0) vif0.cmd = 0; - - return ret; -} - -static int __fastcall Vif0TransSTCol(u32 *data) // STCOL -{ - int ret; - - u32* pmem = &vif0Regs->c0 + (vif0.tag.addr << 2); - u32* pmem2 = g_vifmask.Col0 + vif0.tag.addr; - ret = min(4 - vif0.tag.addr, vif0.vifpacketsize); - - switch (ret) - { - case 4: - pmem[12] = data[3]; - pmem2[3] = data[3]; - case 3: - pmem[8] = data[2]; - pmem2[2] = data[2]; - case 2: - pmem[4] = data[1]; - pmem2[1] = data[1]; - case 1: - pmem[0] = data[0]; - pmem2[0] = data[0]; - break; - - jNO_DEFAULT - } - - vif0.tag.addr += ret; - vif0.tag.size -= ret; - if (vif0.tag.size == 0) vif0.cmd = 0; - return ret; -} - -static __forceinline void vif0mpgTransfer(u32 addr, u32 *data, int size) -{ - if (memcmp(VU0.Micro + addr, data, size << 2)) - { - CpuVU0->Clear(addr, size << 2); // Clear before writing! :/ (cottonvibes) - memcpy_fast(VU0.Micro + addr, data, size << 2); - } -} - -static int __fastcall Vif0TransMPG(u32 *data) // MPG -{ - if (vif0.vifpacketsize < vif0.tag.size) - { - if((vif0.tag.addr + vif0.vifpacketsize) > 0x1000) DevCon.Warning("Vif0 MPG Split Overflow"); - - vif0mpgTransfer(vif0.tag.addr, data, vif0.vifpacketsize); - vif0.tag.addr += vif0.vifpacketsize << 2; - vif0.tag.size -= vif0.vifpacketsize; - - return vif0.vifpacketsize; - } - else - { - int ret; - - if((vif0.tag.addr + vif0.tag.size) > 0x1000) DevCon.Warning("Vif0 MPG Overflow"); - - vif0mpgTransfer(vif0.tag.addr, data, vif0.tag.size); - ret = vif0.tag.size; - vif0.tag.size = 0; - vif0.cmd = 0; - - return ret; - } -} - -static int __fastcall Vif0TransUnpack(u32 *data) // UNPACK -{ - return nVifUnpack(0, (u8*)data); -} - -//------------------------------------------------------------------ -// Vif0 Data Transfer Table -//------------------------------------------------------------------ - -int (__fastcall *Vif0TransTLB[128])(u32 *data) = -{ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x7*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0xF*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x17*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x1F*/ - Vif0TransSTMask , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x27*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x2F*/ - Vif0TransSTRow , Vif0TransSTCol , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x37*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x3F*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x47*/ - Vif0TransNull , Vif0TransNull , Vif0TransMPG , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x4F*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x57*/ - Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , Vif0TransNull , /*0x5F*/ - Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransNull , /*0x67*/ - Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , /*0x6F*/ - Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransNull , /*0x77*/ - Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransNull , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack , Vif0TransUnpack /*0x7F*/ -}; diff --git a/pcsx2/Vif1_Commands.cpp b/pcsx2/Vif1_Commands.cpp deleted file mode 100644 index 1e08cc98aa..0000000000 --- a/pcsx2/Vif1_Commands.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2009 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" -#include "Common.h" -#include "Vif_Dma.h" -#include "GS.h" -#include "Gif.h" -#include "VUmicro.h" - -//------------------------------------------------------------------ -// Vif1 Data Transfer Commands -//------------------------------------------------------------------ - -static int __fastcall Vif1TransNull(u32 *data) // Shouldnt go here -{ - Console.WriteLn("VIF1 Shouldn't go here CMD = %x", vif1Regs->code); - vif1.cmd = 0; - return 0; -} - -static int __fastcall Vif1TransSTMask(u32 *data) // STMASK -{ - vif1Regs->mask = data[0]; - VIF_LOG("STMASK == %x", vif1Regs->mask); - - vif1.tag.size = 0; - vif1.cmd = 0; - return 1; -} - -static int __fastcall Vif1TransSTRow(u32 *data) // STROW -{ - int ret; - - u32* pmem = &vif1Regs->r0 + (vif1.tag.addr << 2); - u32* pmem2 = g_vifmask.Row1 + vif1.tag.addr; - pxAssume(vif1.tag.addr < 4); - ret = min(4 - vif1.tag.addr, vif1.vifpacketsize); - pxAssume(ret > 0); - - switch (ret) - { - case 4: - pmem[12] = data[3]; - pmem2[3] = data[3]; - case 3: - pmem[8] = data[2]; - pmem2[2] = data[2]; - case 2: - pmem[4] = data[1]; - pmem2[1] = data[1]; - case 1: - pmem[0] = data[0]; - pmem2[0] = data[0]; - break; - jNO_DEFAULT; - } - - vif1.tag.addr += ret; - vif1.tag.size -= ret; - if (vif1.tag.size == 0) vif1.cmd = 0; - - return ret; -} - -static int __fastcall Vif1TransSTCol(u32 *data) -{ - int ret; - - u32* pmem = &vif1Regs->c0 + (vif1.tag.addr << 2); - u32* pmem2 = g_vifmask.Col1 + vif1.tag.addr; - ret = min(4 - vif1.tag.addr, vif1.vifpacketsize); - switch (ret) - { - case 4: - pmem[12] = data[3]; - pmem2[3] = data[3]; - case 3: - pmem[8] = data[2]; - pmem2[2] = data[2]; - case 2: - pmem[4] = data[1]; - pmem2[1] = data[1]; - case 1: - pmem[0] = data[0]; - pmem2[0] = data[0]; - break; - jNO_DEFAULT; - } - vif1.tag.addr += ret; - vif1.tag.size -= ret; - if (vif1.tag.size == 0) vif1.cmd = 0; - return ret; -} - -static __forceinline void vif1mpgTransfer(u32 addr, u32 *data, int size) -{ - pxAssume(VU1.Micro > 0); - if (memcmp(VU1.Micro + addr, data, size << 2)) - { - CpuVU1->Clear(addr, size << 2); // Clear before writing! :/ - memcpy_fast(VU1.Micro + addr, data, size << 2); - } -} - -static int __fastcall Vif1TransMPG(u32 *data) -{ - if (vif1.vifpacketsize < vif1.tag.size) - { - if((vif1.tag.addr + vif1.vifpacketsize) > 0x4000) DevCon.Warning("Vif1 MPG Split Overflow"); - vif1mpgTransfer(vif1.tag.addr, data, vif1.vifpacketsize); - vif1.tag.addr += vif1.vifpacketsize << 2; - vif1.tag.size -= vif1.vifpacketsize; - return vif1.vifpacketsize; - } - else - { - int ret; - if((vif1.tag.addr + vif1.tag.size) > 0x4000) DevCon.Warning("Vif1 MPG Overflow"); - vif1mpgTransfer(vif1.tag.addr, data, vif1.tag.size); - ret = vif1.tag.size; - vif1.tag.size = 0; - vif1.cmd = 0; - return ret; - } -} - -// Dummy GIF-TAG Packet to Guarantee Count = 1 -extern __aligned16 u32 nloop0_packet[4]; -static __aligned16 u32 splittransfer[4]; -static u32 splitptr = 0; - -static int __fastcall Vif1TransDirectHL(u32 *data) -{ - int ret = 0; - - if ((vif1.cmd & 0x7f) == 0x51) - { - if (gif->chcr.STR && (!vif1Regs->mskpath3 && (Path3progress == IMAGE_MODE))) //PATH3 is in image mode, so wait for end of transfer - { - vif1Regs->stat.VGW = true; - return 0; - } - } - - gifRegs->stat.APATH |= GIF_APATH2; - gifRegs->stat.OPH = true; - - if (splitptr > 0) //Leftover data from the last packet, filling the rest and sending to the GS - { - if ((splitptr < 4) && (vif1.vifpacketsize >= (4 - splitptr))) - { - while (splitptr < 4) - { - splittransfer[splitptr++] = (u32)data++; - ret++; - vif1.tag.size--; - } - } - - Registers::Freeze(); - // copy 16 bytes the fast way: - const u64* src = (u64*)splittransfer[0]; - GetMTGS().PrepDataPacket(GIF_PATH_2, nloop0_packet, 1); - u64* dst = (u64*)GetMTGS().GetDataPacketPtr(); - dst[0] = src[0]; - dst[1] = src[1]; - - GetMTGS().SendDataPacket(); - Registers::Thaw(); - - if (vif1.tag.size == 0) vif1.cmd = 0; - splitptr = 0; - return ret; - } - - if (vif1.vifpacketsize < vif1.tag.size) - { - if (vif1.vifpacketsize < 4 && splitptr != 4) //Not a full QW left in the buffer, saving left over data - { - ret = vif1.vifpacketsize; - while (ret > 0) - { - splittransfer[splitptr++] = (u32)data++; - vif1.tag.size--; - ret--; - } - return vif1.vifpacketsize; - } - vif1.tag.size -= vif1.vifpacketsize; - ret = vif1.vifpacketsize; - } - else - { - gifRegs->stat.clear_flags(GIF_STAT_APATH2 | GIF_STAT_OPH); - ret = vif1.tag.size; - vif1.tag.size = 0; - vif1.cmd = 0; - } - - //TODO: ret is guaranteed to be qword aligned ? - - Registers::Freeze(); - - // Round ret up, just in case it's not 128bit aligned. - const uint count = GetMTGS().PrepDataPacket(GIF_PATH_2, data, (ret + 3) >> 2); - memcpy_fast(GetMTGS().GetDataPacketPtr(), data, count << 4); - GetMTGS().SendDataPacket(); - - Registers::Thaw(); - - return ret; -} -static int __fastcall Vif1TransUnpack(u32 *data) -{ - return nVifUnpack(1, (u8*)data); -} - -//------------------------------------------------------------------ -// Vif1 Data Transfer Table -//------------------------------------------------------------------ - -int (__fastcall *Vif1TransTLB[128])(u32 *data) = -{ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x7*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0xF*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x17*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x1F*/ - Vif1TransSTMask , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x27*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x2F*/ - Vif1TransSTRow , Vif1TransSTCol , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x37*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x3F*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x47*/ - Vif1TransNull , Vif1TransNull , Vif1TransMPG , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x4F*/ - Vif1TransDirectHL, Vif1TransDirectHL, Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x57*/ - Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , Vif1TransNull , /*0x5F*/ - Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransNull , /*0x67*/ - Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , /*0x6F*/ - Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransNull , /*0x77*/ - Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransNull , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack , Vif1TransUnpack /*0x7F*/ -}; diff --git a/pcsx2/Vif_Commands.cpp b/pcsx2/Vif_Commands.cpp index 68a30dcf9a..8d8bac26de 100644 --- a/pcsx2/Vif_Commands.cpp +++ b/pcsx2/Vif_Commands.cpp @@ -21,12 +21,13 @@ #include "newVif.h" #include "VUmicro.h" -#define _vifT template -#define vifX (idx ? vif1 : vif0) -#define vifXRegs (idx ? (vif1Regs) : (vif0Regs)) -#define vif1Only() { if (!idx) { vifCMD_Null(); return; } } - -_vifT void vifCMD_Null(); +#define _vifT template +#define vifX (idx ? vif1 : vif0) +#define vifXRegs (idx ? (vif1Regs) : (vif0Regs)) +#define vif1Only() { if (!idx) { vifCMD_Null(); return; } } +#define vif1Only_() { if (!idx) { return vifTrans_Null(NULL); } } + +_vifT void vifCMD_Null(); _f void vuExecMicro(int idx, u32 addr) { VURegs* VU = nVif[idx].VU; @@ -86,18 +87,224 @@ void Vif1MskPath3() { schedulepath3msk = 0; } +//------------------------------------------------------------------ +// Vif0/Vif1 Data Transfer Commands +//------------------------------------------------------------------ + +_vifT int __fastcall vifTrans_Null(u32 *data) +{ + Console.WriteLn("VIF%d Shouldn't go here CMD = %x", idx, vifXRegs->code); + vifX.cmd = 0; + return 0; +} + +_vifT int __fastcall vifTrans_STMask(u32 *data) +{ + vifXRegs->mask = data[0]; + VIF_LOG("STMASK == %x", vifXRegs->mask); + + vifX.tag.size = 0; + vifX.cmd = 0; + return 1; +} + +_vifT int __fastcall vifTrans_STRow(u32 *data) +{ + int ret; + u32* rows = idx ? g_vifmask.Row1 : g_vifmask.Row0; + u32* pmem = &vifXRegs->r0 + (vifX.tag.addr << 2); + u32* pmem2 = rows + vifX.tag.addr; + + ret = min(4 - vifX.tag.addr, vifX.vifpacketsize); + pxAssume(vifX.tag.addr < 4); + pxAssume(ret > 0); + + switch (ret) { + case 4: + pmem[12] = data[3]; + pmem2[3] = data[3]; + case 3: + pmem[8] = data[2]; + pmem2[2] = data[2]; + case 2: + pmem[4] = data[1]; + pmem2[1] = data[1]; + case 1: + pmem[0] = data[0]; + pmem2[0] = data[0]; + break; + jNO_DEFAULT + } + + vifX.tag.addr += ret; + vifX.tag.size -= ret; + if (!vifX.tag.size) vifX.cmd = 0; + + return ret; +} + +_vifT int __fastcall vifTrans_STCol(u32 *data) +{ + int ret; + u32* cols = idx ? g_vifmask.Col1 : g_vifmask.Col0; + u32* pmem = &vifXRegs->c0 + (vifX.tag.addr << 2); + u32* pmem2 = cols + vifX.tag.addr; + ret = min(4 - vifX.tag.addr, vifX.vifpacketsize); + + switch (ret) { + case 4: + pmem[12] = data[3]; + pmem2[3] = data[3]; + case 3: + pmem[8] = data[2]; + pmem2[2] = data[2]; + case 2: + pmem[4] = data[1]; + pmem2[1] = data[1]; + case 1: + pmem[0] = data[0]; + pmem2[0] = data[0]; + break; + jNO_DEFAULT + } + + vifX.tag.addr += ret; + vifX.tag.size -= ret; + if (!vifX.tag.size) vifX.cmd = 0; + return ret; +} + +_f void _vifTrans_MPG(int idx, u32 addr, u32 *data, int size) +{ + VURegs& VUx = idx ? VU1 : VU0; + pxAssume(VUx.Micro > 0); + + if (memcmp(VUx.Micro + addr, data, size << 2)) { + if (!idx) CpuVU0->Clear(addr, size << 2); // Clear before writing! + else CpuVU1->Clear(addr, size << 2); // Clear before writing! + memcpy_fast(VUx.Micro + addr, data, size << 2); + } +} + +_vifT int __fastcall vifTrans_MPG(u32 *data) +{ + if (vifX.vifpacketsize < vifX.tag.size) { + if((vifX.tag.addr + vifX.vifpacketsize) > (idx ? 0x4000 : 0x1000)) { + DevCon.Warning("Vif%d MPG Split Overflow", idx); + } + _vifTrans_MPG(idx, vifX.tag.addr, data, vifX.vifpacketsize); + vifX.tag.addr += vifX.vifpacketsize << 2; + vifX.tag.size -= vifX.vifpacketsize; + return vifX.vifpacketsize; + } + else { + int ret; + if((vifX.tag.addr + vifX.tag.size) > (idx ? 0x4000 : 0x1000)) { + DevCon.Warning("Vif%d MPG Split Overflow", idx); + } + _vifTrans_MPG(idx, vifX.tag.addr, data, vifX.tag.size); + ret = vifX.tag.size; + vifX.tag.size = 0; + vifX.cmd = 0; + return ret; + } +} + +_vifT int __fastcall vifTrans_Unpack(u32 *data) +{ + return nVifUnpack(idx, (u8*)data); +} + +// Dummy GIF-TAG Packet to Guarantee Count = 1 +extern __aligned16 u32 nloop0_packet[4]; +static __aligned16 u32 splittransfer[4]; +static u32 splitptr = 0; + +_vifT int __fastcall vifTrans_DirectHL(u32 *data) +{ + vif1Only_(); + int ret = 0; + + if ((vif1.cmd & 0x7f) == 0x51) { + if (gif->chcr.STR && (!vif1Regs->mskpath3 && (Path3progress == IMAGE_MODE))) { + vif1Regs->stat.VGW = true; // PATH3 is in image mode, so wait for end of transfer + return 0; + } + } + + gifRegs->stat.APATH |= GIF_APATH2; + gifRegs->stat.OPH = true; + + if (splitptr > 0) { // Leftover data from the last packet, filling the rest and sending to the GS + + if ((splitptr < 4) && (vif1.vifpacketsize >= (4 - splitptr))) { + while (splitptr < 4) { + splittransfer[splitptr++] = (u32)data++; + ret++; + vif1.tag.size--; + } + } + + Registers::Freeze(); + // copy 16 bytes the fast way: + const u64* src = (u64*)splittransfer[0]; + GetMTGS().PrepDataPacket(GIF_PATH_2, nloop0_packet, 1); + u64* dst = (u64*)GetMTGS().GetDataPacketPtr(); + dst[0] = src[0]; + dst[1] = src[1]; + + GetMTGS().SendDataPacket(); + Registers::Thaw(); + + if (vif1.tag.size == 0) vif1.cmd = 0; + splitptr = 0; + return ret; + } + + if (vif1.vifpacketsize < vif1.tag.size) { + if (vif1.vifpacketsize < 4 && splitptr != 4) { + ret = vif1.vifpacketsize; + while (ret > 0) { // Not a full QW left in the buffer, saving left over data + splittransfer[splitptr++] = (u32)data++; + vif1.tag.size--; + ret--; + } + return vif1.vifpacketsize; + } + vif1.tag.size -= vif1.vifpacketsize; + ret = vif1.vifpacketsize; + } + else { + gifRegs->stat.clear_flags(GIF_STAT_APATH2 | GIF_STAT_OPH); + ret = vif1.tag.size; + vif1.tag.size = 0; + vif1.cmd = 0; + } + + // ToDo: ret is guaranteed to be qword aligned ? + Registers::Freeze(); + + // Round ret up, just in case it's not 128bit aligned. + const uint count = GetMTGS().PrepDataPacket(GIF_PATH_2, data, (ret + 3) >> 2); + memcpy_fast(GetMTGS().GetDataPacketPtr(), data, count << 4); + GetMTGS().SendDataPacket(); + + Registers::Thaw(); + return ret; +} + //------------------------------------------------------------------ // Vif0/Vif1 Commands (VifCodes) //------------------------------------------------------------------ -_vifT void vifCMD_Base() // BASE +_vifT void vifCMD_Base() { vif1Only(); vif1Regs->base = vif1Regs->code & 0x3ff; vif1.cmd &= ~0x7f; } -_vifT void vifCMD_DirectHL() // DIRECT/HL +_vifT void vifCMD_DirectHL() { vif1Only(); int vifImm = (u16)vif1Regs->code; @@ -192,7 +399,7 @@ _vifT void vifCMD_Null() // invalid opcode // if ME1, then force the vif to interrupt if (!(vifXRegs->err.ME1)) //Ignore vifcode and tag mismatch error { - Console.WriteLn("UNKNOWN VifCmd: %x", vifX.cmd); + Console.WriteLn("Vif%d: Unknown VifCmd! [%x]", idx, vifX.cmd); vifXRegs->stat.ER1 = true; vifX.irq++; } @@ -233,6 +440,48 @@ _vifT void vifCMD_STRowCol() // STROW / STCOL vifX.tag.size = 4; } +//------------------------------------------------------------------ +// Vif0/Vif1 Data Transfer Tables +//------------------------------------------------------------------ + +int (__fastcall *Vif0TransTLB[128])(u32 *data) = { + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x00*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x08*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x10*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x18*/ + vifTrans_STMask<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x20*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x28*/ + vifTrans_STRow<0> , vifTrans_STCol<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x30*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x38*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x40*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_MPG<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x48*/ + vifTrans_DirectHL<0>, vifTrans_DirectHL<0>, vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x50*/ + vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0> , vifTrans_Null<0>, /*0x58*/ + vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Null<0>, /*0x60*/ + vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0>, /*0x68*/ + vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Null<0>, /*0x70*/ + vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Null<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> , vifTrans_Unpack<0> /*0x78*/ +}; + +int (__fastcall *Vif1TransTLB[128])(u32 *data) = { + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x00*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x08*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x10*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x18*/ + vifTrans_STMask<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x20*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x28*/ + vifTrans_STRow<1> , vifTrans_STCol<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x30*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x38*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x40*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_MPG<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x48*/ + vifTrans_DirectHL<1>, vifTrans_DirectHL<1>, vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x50*/ + vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1> , vifTrans_Null<1>, /*0x58*/ + vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Null<1>, /*0x60*/ + vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1>, /*0x68*/ + vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Null<1>, /*0x70*/ + vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Null<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> , vifTrans_Unpack<1> /*0x78*/ +}; + //------------------------------------------------------------------ // Vif0/Vif1 CMD Tables //------------------------------------------------------------------ diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj index 5720935adc..668bc64a57 100644 --- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj +++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj @@ -804,18 +804,10 @@ RelativePath="..\..\Vif.h" > - - - -