mirror of
https://github.com/PCSX2/pcsx2-sourceforge.git
synced 2026-02-04 03:11:18 +01:00
Little tidbits (unimportant) and a fix for vif mark stalls on tags (neopets)
This commit is contained in:
@@ -1450,7 +1450,7 @@ void gifMFIFOInterrupt()
|
||||
{
|
||||
mfifocycles = 0;
|
||||
|
||||
if(gifqwc <= 0 && gifdone == 0) {
|
||||
if(gifqwc <= 0 && gifdone != 1) {
|
||||
//SysPrintf("Empty\n");
|
||||
psHu32(GIF_STAT)&= ~0xE00; // OPH=0 | APATH=0
|
||||
hwDmacIrq(14);
|
||||
@@ -1468,6 +1468,7 @@ void gifMFIFOInterrupt()
|
||||
cpuRegs.interrupt &= ~(1 << 11);
|
||||
return;
|
||||
}
|
||||
//if(gifqwc > 0)SysPrintf("GIF MFIFO ending with stuff in it %x\n", gifqwc);
|
||||
gifqwc = 0;
|
||||
gifdone = 0;
|
||||
gif->chcr &= ~0x100;
|
||||
|
||||
11
pcsx2/Hw.c
11
pcsx2/Hw.c
@@ -1349,14 +1349,13 @@ void hwDmacIrq(int n) {
|
||||
|
||||
/* Write 'size' bytes to memory address 'addr' from 'data'. */
|
||||
int hwMFIFOWrite(u32 addr, u8 *data, int size) {
|
||||
u32 maddr = psHu32(DMAC_RBOR);
|
||||
int msize = psHu32(DMAC_RBSR)+16;
|
||||
int msize = psHu32(DMAC_RBOR) + psHu32(DMAC_RBSR)+16;
|
||||
u8 *dst;
|
||||
|
||||
addr = psHu32(DMAC_RBOR) + (addr & psHu32(DMAC_RBSR));
|
||||
/* Check if the transfer should wrap around the ring buffer */
|
||||
if ((addr+size) >= (maddr+msize)) {
|
||||
int s1 = (maddr+msize) - addr;
|
||||
if ((addr+size) >= msize) {
|
||||
int s1 = msize - addr;
|
||||
int s2 = size - s1;
|
||||
|
||||
/* it does, so first copy 's1' bytes from 'data' to 'addr' */
|
||||
@@ -1366,9 +1365,9 @@ int hwMFIFOWrite(u32 addr, u8 *data, int size) {
|
||||
memcpy_fast(dst, data, s1);
|
||||
|
||||
/* and second copy 's2' bytes from '&data[s1]' to 'maddr' */
|
||||
dst = PSM(maddr);
|
||||
dst = PSM(psHu32(DMAC_RBOR));
|
||||
if (dst == NULL) return -1;
|
||||
Cpu->Clear(maddr, s2/4);
|
||||
Cpu->Clear(psHu32(DMAC_RBOR), s2/4);
|
||||
memcpy_fast(dst, &data[s1], s2);
|
||||
} else {
|
||||
//u32 * tempptr, * tempptr2;
|
||||
|
||||
50
pcsx2/SPR.c
50
pcsx2/SPR.c
@@ -66,41 +66,39 @@ static void TestClearVUs(u32 madr, u32 size)
|
||||
}
|
||||
|
||||
int _SPR0chain() {
|
||||
u32 qwc = spr0->qwc;
|
||||
u32 *pMem;
|
||||
|
||||
if (qwc == 0) return 0;
|
||||
if (spr0->qwc == 0) return 0;
|
||||
|
||||
pMem = (u32*)dmaGetAddr(spr0->madr);
|
||||
if (pMem == NULL) return -1;
|
||||
|
||||
//SPR0transfer(pMem, qwc << 2);
|
||||
qwc <<= 4;
|
||||
if ((psHu32(DMAC_CTRL) & 0xC) == 0xC || // GIF MFIFO
|
||||
(psHu32(DMAC_CTRL) & 0xC) == 0x8) { // VIF1 MFIFO
|
||||
hwMFIFOWrite(spr0->madr, (u8*)&PS2MEM_SCRATCH[spr0->sadr & 0x3fff], qwc);
|
||||
spr0->madr += (spr0->qwc * 16);
|
||||
|
||||
if ((psHu32(DMAC_CTRL) & 0xC) >= 0x8) { // 0x8 VIF1 MFIFO, 0xC GIF MFIFO
|
||||
if((spr0->madr & ~psHu32(DMAC_RBSR)) != psHu32(DMAC_RBOR)) SysPrintf("SPR MFIFO Write outside MFIFO area\n");
|
||||
hwMFIFOWrite(spr0->madr, (u8*)&PS2MEM_SCRATCH[spr0->sadr & 0x3fff], spr0->qwc << 4);
|
||||
spr0->madr += spr0->qwc << 4;
|
||||
spr0->madr = psHu32(DMAC_RBOR) + (spr0->madr & psHu32(DMAC_RBSR));
|
||||
} else {
|
||||
memcpy_fast((u8*)pMem, &PS2MEM_SCRATCH[spr0->sadr & 0x3fff], qwc);
|
||||
memcpy_fast((u8*)pMem, &PS2MEM_SCRATCH[spr0->sadr & 0x3fff], spr0->qwc << 4);
|
||||
|
||||
Cpu->Clear(spr0->madr, qwc>>2);
|
||||
Cpu->Clear(spr0->madr, spr0->qwc<<2);
|
||||
// clear VU mem also!
|
||||
TestClearVUs(spr0->madr, qwc>>2);
|
||||
TestClearVUs(spr0->madr, spr0->qwc << 2);
|
||||
|
||||
spr0->madr += qwc;
|
||||
spr0->madr += spr0->qwc << 4;
|
||||
}
|
||||
spr0->sadr += qwc;
|
||||
spr0->sadr += spr0->qwc << 4;
|
||||
|
||||
spr0->qwc = 0;
|
||||
return (qwc>>4) * BIAS; // bus is 1/2 the ee speed
|
||||
|
||||
return (spr0->qwc) * BIAS; // bus is 1/2 the ee speed
|
||||
}
|
||||
|
||||
#define SPR0chain() \
|
||||
if (spr0->qwc) { \
|
||||
cycles += _SPR0chain(); \
|
||||
/* cycles+= spr0->qwc / BIAS;*/ /* guessing */ \
|
||||
}
|
||||
cycles += _SPR0chain(); \
|
||||
spr0->qwc = 0;
|
||||
|
||||
|
||||
void _SPR0interleave() {
|
||||
int qwc = spr0->qwc;
|
||||
@@ -239,11 +237,13 @@ void dmaSPR0() { // fromSPR
|
||||
|
||||
_dmaSPR0();
|
||||
if ((psHu32(DMAC_CTRL) & 0xC) == 0xC) { // GIF MFIFO
|
||||
if((spr0->madr & ~psHu32(DMAC_RBSR)) != psHu32(DMAC_RBOR)) SysPrintf("GIF MFIFO Write outside MFIFO area\n");
|
||||
spr0->madr = psHu32(DMAC_RBOR) + (spr0->madr & psHu32(DMAC_RBSR));
|
||||
//SysPrintf("mfifoGIFtransfer %x madr %x, tadr %x\n", gif->chcr, gif->madr, gif->tadr);
|
||||
mfifoGIFtransfer(qwc);
|
||||
} else
|
||||
if ((psHu32(DMAC_CTRL) & 0xC) == 0x8) { // VIF1 MFIFO
|
||||
if((spr0->madr & ~psHu32(DMAC_RBSR)) != psHu32(DMAC_RBOR)) SysPrintf("VIF MFIFO Write outside MFIFO area\n");
|
||||
spr0->madr = psHu32(DMAC_RBOR) + (spr0->madr & psHu32(DMAC_RBSR));
|
||||
//SysPrintf("mfifoVIF1transfer %x madr %x, tadr %x\n", vif1ch->chcr, vif1ch->madr, vif1ch->tadr);
|
||||
//vifqwc+= qwc;
|
||||
@@ -270,25 +270,23 @@ __inline static void SPR1transfer(u32 *data, int size) {
|
||||
}
|
||||
|
||||
int _SPR1chain() {
|
||||
u32 qwc = spr1->qwc;
|
||||
u32 *pMem;
|
||||
|
||||
if (qwc == 0) return 0;
|
||||
if (spr1->qwc == 0) return 0;
|
||||
|
||||
pMem = (u32*)dmaGetAddr(spr1->madr);
|
||||
if (pMem == NULL) return -1;
|
||||
|
||||
SPR1transfer(pMem, qwc << 2);
|
||||
SPR1transfer(pMem, spr1->qwc << 2);
|
||||
spr1->madr+= spr1->qwc << 4;
|
||||
spr1->qwc = 0;
|
||||
return (qwc) * BIAS;
|
||||
|
||||
return (spr1->qwc) * BIAS;
|
||||
}
|
||||
|
||||
#define SPR1chain() \
|
||||
if (spr1->qwc) { \
|
||||
cycles += _SPR1chain(); \
|
||||
/* cycles+= spr1->qwc / BIAS;*/ /* guessing */ \
|
||||
}
|
||||
spr1->qwc = 0;
|
||||
|
||||
|
||||
void _SPR1interleave() {
|
||||
int qwc = spr1->qwc;
|
||||
|
||||
@@ -489,7 +489,7 @@ void mfifoVIF1transfer(int qwc) {
|
||||
#ifdef VIF_LOG
|
||||
VIF_LOG("Added %x qw to mfifo, total now %x\n", qwc, vifqwc);
|
||||
#endif
|
||||
if((vif1ch->chcr & 0x100) == 0) return;
|
||||
if((vif1ch->chcr & 0x100) == 0 || vif1.vifstalled == 1) return;
|
||||
}
|
||||
|
||||
if(vif1ch->qwc == 0 && vifqwc > 0){
|
||||
@@ -632,6 +632,7 @@ void vifMFIFOInterrupt()
|
||||
return;
|
||||
}
|
||||
|
||||
//if(vifqwc > 0)SysPrintf("VIF MFIFO ending with stuff in it %x\n", vifqwc);
|
||||
vifqwc = 0;
|
||||
vif1.done = 0;
|
||||
vif1ch->chcr &= ~0x100;
|
||||
|
||||
@@ -1248,7 +1248,15 @@ void vif0Interrupt() {
|
||||
vif0ch->chcr &= ~0x100;
|
||||
cpuRegs.interrupt &= ~1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(vif0ch->qwc > 0 || vif0.irqoffset > 0){
|
||||
if(vif0.stallontag == 1) {
|
||||
_chainVIF0();
|
||||
}
|
||||
else _VIF0chain();
|
||||
INT(0, g_vifCycles);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//}
|
||||
@@ -1281,7 +1289,7 @@ void vif0Interrupt() {
|
||||
|
||||
|
||||
if(vif0ch->qwc > 0) SysPrintf("VIF0 Ending with QWC left\n");
|
||||
|
||||
if(vif0.cmd != 0) SysPrintf("vif0.cmd still set %x\n", vif0.cmd);
|
||||
vif0ch->chcr &= ~0x100;
|
||||
hwDmacIrq(DMAC_VIF0);
|
||||
vif0Regs->stat&= ~0xF000000; // FQC=0
|
||||
@@ -1847,7 +1855,7 @@ static void Vif1CMDNull(){ // invalid opcode
|
||||
vif1Regs->stat |= 1 << 13;
|
||||
vif1.irq++;
|
||||
}
|
||||
vif1.cmd &= ~0x7f;
|
||||
vif1.cmd = 0;
|
||||
}
|
||||
|
||||
// Vif1 Data Transfer Table
|
||||
@@ -2151,8 +2159,11 @@ void vif1Interrupt() {
|
||||
return;
|
||||
}
|
||||
//return 0;
|
||||
if(vif1ch->qwc > 0){
|
||||
_VIF1chain();
|
||||
if(vif1ch->qwc > 0 || vif1.irqoffset > 0){
|
||||
if(vif1.stallontag == 1) {
|
||||
_chainVIF1();
|
||||
}
|
||||
else _VIF1chain();
|
||||
INT(1, g_vifCycles);
|
||||
return;
|
||||
}
|
||||
@@ -2189,6 +2200,7 @@ void vif1Interrupt() {
|
||||
return;
|
||||
}
|
||||
if(vif1ch->qwc > 0) SysPrintf("VIF1 Ending with QWC left\n");
|
||||
if(vif1.cmd != 0) SysPrintf("vif1.cmd still set %x\n", vif1.cmd);
|
||||
//SysPrintf("VIF Interrupt\n");
|
||||
//if((gif->chcr & 0x100) && vif1Regs->mskpath3) gsInterrupt();
|
||||
prevviftag = NULL;
|
||||
|
||||
Reference in New Issue
Block a user