From d63edda5ca841624626a1bdd907a527493c1deda Mon Sep 17 00:00:00 2001 From: cottonvibes Date: Wed, 8 Oct 2008 22:40:21 +0000 Subject: [PATCH] formated and cleaned up counters.c a little bit. git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@182 a6443dda-0b58-4228-96e9-037be469359c --- pcsx2/Counters.c | 299 +++++++++++++++++++---------------------------- 1 file changed, 120 insertions(+), 179 deletions(-) diff --git a/pcsx2/Counters.c b/pcsx2/Counters.c index 393e40f688..06c80d91bf 100644 --- a/pcsx2/Counters.c +++ b/pcsx2/Counters.c @@ -62,31 +62,23 @@ void rcntSet() { for (i = 0; i < 4; i++) { if (!(counters[i].mode & 0x80) || (counters[i].mode & 0x3) == 0x3) continue; // Stopped - c = ((0x10000 - counters[i].count) * counters[i].rate) - (cpuRegs.cycle - counters[i].sCycleT); - if (c < nextCounter) { - nextCounter = c; - } - // the + 10 is just in case of overflow - //if(!(counters[i].mode & 0x100) || counters[i].target > 0xffff) continue; - c = ((counters[i].target - counters[i].count) * counters[i].rate) - (cpuRegs.cycle - counters[i].sCycleT); - if (c < nextCounter) { - nextCounter = c; - } + c = ((0x10000 - counters[i].count) * counters[i].rate) - (cpuRegs.cycle - counters[i].sCycleT); + if (c < nextCounter) nextCounter = c; + //if(!(counters[i].mode & 0x100) || counters[i].target > 0xffff) continue; + c = ((counters[i].target - counters[i].count) * counters[i].rate) - (cpuRegs.cycle - counters[i].sCycleT); + if (c < nextCounter) nextCounter = c; } + //Calculate HBlank c = counters[4].CycleT - (cpuRegs.cycle - counters[4].sCycleT); - if (c < nextCounter) { - nextCounter = c; - } + if (c < nextCounter) nextCounter = c; //if(nextCounter > 0x1000) SysPrintf("Nextcounter %x HBlank %x VBlank %x\n", nextCounter, c, counters[5].CycleT - (cpuRegs.cycle - counters[5].sCycleT)); + //Calculate VBlank c = counters[5].CycleT - (cpuRegs.cycle - counters[5].sCycleT); - if (c < nextCounter) { - nextCounter = c; - } - + if (c < nextCounter) nextCounter = c; } void rcntInit() { @@ -106,8 +98,6 @@ void rcntInit() { counters[4].mode = 0x3c0; // The VSync counter mode counters[5].mode = 0x3c0; - - UpdateVSyncRate(); /*hblankend = 0; counters[5].mode &= ~0x10000; @@ -166,16 +156,15 @@ void UpdateVSyncRate() { if (Config.PsxType & 1) { SysPrintf("PAL\n"); counters[4].Cycle = 227000; - /*if(Config.PsxType & 2)counters[5].rate = PS2VBLANK_PAL_INT; - else counters[5].rate = PS2VBLANK_PAL;*/ - + //if(Config.PsxType & 2)counters[5].rate = PS2VBLANK_PAL_INT; + //else counters[5].rate = PS2VBLANK_PAL; counters[5].Cycle = 720; - } else { + } + else { SysPrintf("NTSC\n"); counters[4].Cycle = 227000; - /*if(Config.PsxType & 2)counters[5].rate = PS2VBLANK_NTSC_INT; - else counters[5].rate = PS2VBLANK_NTSC;*/ - + //if(Config.PsxType & 2)counters[5].rate = PS2VBLANK_NTSC_INT; + //else counters[5].rate = PS2VBLANK_NTSC; counters[5].Cycle = 720; } @@ -190,39 +179,35 @@ void UpdateVSyncRate() { //rcntUpdTarget(4); //counters[4].CycleT = counters[4].rate; - ///rcntUpdTarget(5); - /*counters[5].CycleT = counters[5].rate; - counters[5].Cycle = PS2VBLANKEND;*/ + //rcntUpdTarget(5); + //counters[5].CycleT = counters[5].rate; + //counters[5].Cycle = PS2VBLANKEND; - { - if (Config.CustomFps > 0) { - iTicks = GetTickFrequency() / Config.CustomFps; - SysPrintf("Framelimiter rate updated (UpdateVSyncRate): %d fps\n", Config.CustomFps); - } - else if (Config.PsxType & 1) { - iTicks = (GetTickFrequency() / 5000) * 100; - SysPrintf("Framelimiter rate updated (UpdateVSyncRate): 50 fps\n"); - } - else { - iTicks = (GetTickFrequency() / 5994) * 100; - SysPrintf("Framelimiter rate updated (UpdateVSyncRate): 59.94 fps\n"); - } + if (Config.CustomFps > 0) { + iTicks = GetTickFrequency() / Config.CustomFps; + SysPrintf("Framelimiter rate updated (UpdateVSyncRate): %d fps\n", Config.CustomFps); + } + else if (Config.PsxType & 1) { + iTicks = (GetTickFrequency() / 5000) * 100; + SysPrintf("Framelimiter rate updated (UpdateVSyncRate): 50 fps\n"); + } + else { + iTicks = (GetTickFrequency() / 5994) * 100; + SysPrintf("Framelimiter rate updated (UpdateVSyncRate): 59.94 fps\n"); } rcntSet(); } - void FrameLimiter() { static u64 iStart=0, iEnd=0, iExpectedEnd=0; - if(iStart==0) iStart = GetCPUTicks(); + if (iStart==0) iStart = GetCPUTicks(); iExpectedEnd = iStart + iTicks; iEnd = GetCPUTicks(); - if(iEnd>=iExpectedEnd) - { + if (iEnd>=iExpectedEnd) { u64 diff = iEnd-iExpectedEnd; if((diff>>3)>iTicks) iExpectedEnd=iEnd; } @@ -230,6 +215,7 @@ void FrameLimiter() Sleep(1); iEnd = GetCPUTicks(); } while(iEnd 0 ) { if( iFrame > g_TestRun.frame ) { @@ -425,22 +400,13 @@ void VSync() } #endif - - - - - //counters[5].mode&= ~0x10000; - //UpdateVSyncRate(); - //SysPrintf("ctrs: %d %d %d %d\n", g_nCounters[0], g_nCounters[1], g_nCounters[2], g_nCounters[3]); //SysPrintf("vif: %d\n", (((LARGE_INTEGER*)g_nCounters)->QuadPart * 1000000) / lfreq.QuadPart); //memset(g_nCounters, 0, 16); - counters[5].mode|= 0x10000; - if ((CSRw & 0x8)) - GSCSRr|= 0x8; - if (!(GSIMR&0x800) ) - gsIrq(); + counters[5].mode|= 0x10000; + if ((CSRw & 0x8)) GSCSRr|= 0x8; + if (!(GSIMR&0x800)) gsIrq(); hwIntcIrq(2); psxVSyncStart(); @@ -448,55 +414,49 @@ void VSync() if(Config.Patch) applypatch(1); if(gates)rcntStartGate(0x8); -// __Log("%u %u 0\n", cpuRegs.cycle-s_lastvsync[1], timeGetTime()-s_lastvsync[0]); -// s_lastvsync[0] = timeGetTime(); -// s_lastvsync[1] = cpuRegs.cycle; + //__Log("%u %u 0\n", cpuRegs.cycle-s_lastvsync[1], timeGetTime()-s_lastvsync[0]); + //s_lastvsync[0] = timeGetTime(); + //s_lastvsync[1] = cpuRegs.cycle; } } - void rcntUpdate() { int i; u32 change = 0; for (i=0; i<=3; i++) { - if(gates & (1< 0) SysPrintf("Change saved on %x = %x\n", i, change); } - if ((u32)(cpuRegs.cycle - counters[4].sCycleT) >= (u32)counters[4].CycleT && hblankend == 1){ + if ((u32)(cpuRegs.cycle - counters[4].sCycleT) >= (u32)counters[4].CycleT && hblankend == 1) { - - if ((CSRw & 0x4)) - GSCSRr |= 4; // signal - - - if (!(GSIMR&0x400) ) - gsIrq(); - - if(gates)rcntEndGate(0); - if(psxhblankgate)psxCheckEndGate(0); + if (CSRw & 0x4) GSCSRr |= 4; // signal + if (!(GSIMR&0x400)) gsIrq(); + if (gates) rcntEndGate(0); + if (psxhblankgate) psxCheckEndGate(0); hblankend = 0; counters[4].CycleT = HBLANKCNT(counters[4].count); - } else - if ((u32)(cpuRegs.cycle - counters[4].sCycleT) >= (u32)counters[4].CycleT) { + } + else if ((u32)(cpuRegs.cycle - counters[4].sCycleT) >= (u32)counters[4].CycleT) { - if(counters[4].count >= counters[4].Cycle){ + if(counters[4].count >= counters[4].Cycle) { //SysPrintf("%x of %x hblanks reorder in %x cycles cpuRegs.cycle = %x\n", counters[4].count, counters[4].Cycle, cpuRegs.cycle - counters[4].sCycleT, cpuRegs.cycle); counters[4].sCycleT += HBLANKCNT(counters[4].Cycle); counters[4].count -= counters[4].Cycle; - - } + } //counters[4].sCycleT += HBLANKCNT(1); counters[4].count++; @@ -509,94 +469,84 @@ void rcntUpdate() //SysPrintf("%x hsync done in %x cycles cpuRegs.cycle = %x next will happen on %x\n", counters[4].count, counters[4].CycleT, cpuRegs.cycle, (u32)(counters[4].sCycleT + counters[4].CycleT)); } - if((counters[5].mode & 0x10000)){ + if((counters[5].mode & 0x10000)) { if ((cpuRegs.cycle - counters[5].sCycleT) >= counters[5].CycleT){ - //counters[5].sCycleT = cpuRegs.cycle; - counters[5].CycleT = VBLANKCNT(counters[5].count); - VSync(); - } - } else if ((cpuRegs.cycle - counters[5].sCycleT) >= counters[5].CycleT) { - if(counters[5].count >= counters[5].Cycle){ - //SysPrintf("reset %x of %x frames done in %x cycles cpuRegs.cycle = %x\n", counters[5].count, counters[5].Cycle, cpuRegs.cycle - counters[5].sCycleT, cpuRegs.cycle); - counters[5].sCycleT += VBLANKCNT(counters[5].Cycle); - counters[5].count -= counters[5].Cycle; - } - counters[5].count++; - //the line below brings back magna carta loading animation, but breaks vsyncs >< (rama) - //counters[5].sCycleT += VBLANKCNT(1); - counters[5].CycleT = VBLANKCNT(counters[5].count) - (VBLANKCNT(1)/2); - //SysPrintf("%x frames done in %x cycles cpuRegs.cycle = %x cycletdiff %x\n", counters[5].Cycle, counters[5].sCycleT, cpuRegs.cycle, (counters[5].CycleT - VBLANKCNT(1)) - (cpuRegs.cycle - counters[5].sCycleT)); + //counters[5].sCycleT = cpuRegs.cycle; + counters[5].CycleT = VBLANKCNT(counters[5].count); VSync(); } + } + else if ((cpuRegs.cycle - counters[5].sCycleT) >= counters[5].CycleT) { + if(counters[5].count >= counters[5].Cycle) { + //SysPrintf("reset %x of %x frames done in %x cycles cpuRegs.cycle = %x\n", counters[5].count, counters[5].Cycle, cpuRegs.cycle - counters[5].sCycleT, cpuRegs.cycle); + counters[5].sCycleT += VBLANKCNT(counters[5].Cycle); + counters[5].count -= counters[5].Cycle; + } + counters[5].count++; + //counters[5].sCycleT += VBLANKCNT(1); //this line brings back magna carta loading animation, but breaks vsyncs >< (rama) + counters[5].CycleT = VBLANKCNT(counters[5].count) - (VBLANKCNT(1)/2); + //SysPrintf("%x frames done in %x cycles cpuRegs.cycle = %x cycletdiff %x\n", counters[5].Cycle, counters[5].sCycleT, cpuRegs.cycle, (counters[5].CycleT - VBLANKCNT(1)) - (cpuRegs.cycle - counters[5].sCycleT)); + VSync(); + } for (i=0; i<=3; i++) { if (!(counters[i].mode & 0x80)) continue; // Stopped if ((s64)(counters[i].target - counters[i].count) <= 0 /*&& (counters[i].target & 0xffff) > 0*/) { // Target interrupt - if((counters[i].target > 0xffff)) { - //SysPrintf("EE Correcting target %x after reset on target\n", i); - counters[i].target &= 0xffff; - } + //if((counters[i].target > 0xffff)) { + //SysPrintf("EE Correcting target %x after reset on target\n", i); + counters[i].target &= 0xffff; + //} if(counters[i].mode & 0x100 ) { -#ifdef EECNT_LOG - EECNT_LOG("EE counter %d target reached mode %x count %x target %x\n", i, counters[i].mode, counters[i].count, counters[i].target); -#endif + EECNT_LOG("EE counter %d target reached mode %x count %x target %x\n", i, counters[i].mode, counters[i].count, counters[i].target); counters[i].mode|= 0x0400; // Target flag hwIntcIrq(counters[i].interrupt); + if (counters[i].mode & 0x40) { //The PS2 only resets if the interrupt is enabled - Tested on PS2 - counters[i].count -= counters[i].target; // Reset on target } else counters[i].target += 0x10000000; - } else counters[i].target += 0x10000000; + } + else counters[i].target += 0x10000000; } if (counters[i].count > 0xffff) { - if (counters[i].mode & 0x0200) { // Overflow interrupt -#ifdef EECNT_LOG - EECNT_LOG("EE counter %d overflow mode %x count %x target %x\n", i, counters[i].mode, counters[i].count, counters[i].target); -#endif + EECNT_LOG("EE counter %d overflow mode %x count %x target %x\n", i, counters[i].mode, counters[i].count, counters[i].target); counters[i].mode|= 0x0800; // Overflow flag hwIntcIrq(counters[i].interrupt); //SysPrintf("counter[%d] overflow interrupt (%x)\n", i, cpuRegs.cycle); } counters[i].count -= 0x10000; - if(counters[i].target > 0xffff) { + //if(counters[i].target > 0xffff) { //SysPrintf("EE %x Correcting target on overflow\n", i); counters[i].target &= 0xffff; - } + //} } - } - - + rcntSet(); - } - - void rcntWcount(int index, u32 value) { u32 change = 0; -#ifdef EECNT_LOG EECNT_LOG("EE count write %d count %x with %x target %x eecycle %x\n", index, counters[index].count, value, counters[index].target, cpuRegs.eCycle); -#endif counters[index].count = value & 0xffff; - if(counters[index].target > 0xffff) { - counters[index].target &= 0xffff; + //if(counters[index].target > 0xffff) { //SysPrintf("EE Counter %x count write, target > 0xffff\n", index); - } + counters[index].target &= 0xffff; + //} //rcntUpd(index); - if((counters[index].mode & 0x3) != 0x3){ - change = cpuRegs.cycle - counters[index].sCycleT; - change -= (change / counters[index].rate) * counters[index].rate; - counters[index].sCycleT = cpuRegs.cycle - change; - }/* else { + if((counters[index].mode & 0x3) != 0x3) { + change = cpuRegs.cycle - counters[index].sCycleT; + change -= (change / counters[index].rate) * counters[index].rate; + counters[index].sCycleT = cpuRegs.cycle - change; + } +/* else { SysPrintf("EE Counter %x count write %x\n", index, value); }*/ rcntSet(); @@ -606,12 +556,11 @@ void rcntWmode(int index, u32 value) { u32 change = 0; - if (value & 0xc00) { //Clear status flags, the ps2 only clears what is given in the value counters[index].mode &= ~(value & 0xc00); } - if(counters[index].mode & 0x80){ + if(counters[index].mode & 0x80) { if((counters[index].mode & 0x3) != 0x3){ change = cpuRegs.cycle - counters[index].sCycleT; counters[index].count += (int)(change / counters[index].rate); @@ -623,27 +572,25 @@ void rcntWmode(int index, u32 value) #ifdef PCSX2_DEVBUILD if(!(value & 0x80)) SysPrintf("Stopping\n"); #endif - } + } else { #ifdef PCSX2_DEVBUILD SysPrintf("Counter %d not running c%x s%x c%x\n", index, counters[index].count, counters[index].sCycleT, cpuRegs.cycle); if(value & 0x80) SysPrintf("Starting %d, v%x\n", index, value); #endif counters[index].sCycleT = cpuRegs.cycle; - } - //if((value & 0x80) && !(counters[index].mode & 0x80)) rcntUpd(index); //Counter wasnt started, so set the start cycle - - counters[index].mode = (counters[index].mode & 0xc00) | (value & 0x3ff); + } -#ifdef EECNT_LOG + //if((value & 0x80) && !(counters[index].mode & 0x80)) rcntUpd(index); //Counter wasnt started, so set the start cycle + counters[index].mode = (counters[index].mode & 0xc00) | (value & 0x3ff); EECNT_LOG("EE counter set %d mode %x count %x\n", index, counters[index].mode, rcntCycle(index)); -#endif + /*if((value & 0x3) && (counters[index].mode & 0x3) != 0x3){ //SysPrintf("Syncing %d with HBLANK clock\n", index); counters[index].CycleT = counters[4].CycleT; }*/ - switch (value & 0x3) { //Clock rate divisers *2, they use BUSCLK speed not PS2CLK + switch (value & 0x3) { //Clock rate divisers *2, they use BUSCLK speed not PS2CLK case 0: counters[index].rate = 2; break; case 1: counters[index].rate = 32; break; case 2: counters[index].rate = 512; break; @@ -653,8 +600,9 @@ void rcntWmode(int index, u32 value) if((counters[index].mode & 0xF) == 0x7) { gates &= ~(1< 0xffff) && (counters[index].target & 0xffff) > rcntCycle(index)) { - //SysPrintf("EE Correcting target %x after mode write\n", index); - counters[index].target &= 0xffff; - }*/ - rcntSet(); + //SysPrintf("EE Correcting target %x after mode write\n", index); + counters[index].target &= 0xffff; + }*/ + rcntSet(); } void rcntStartGate(unsigned int mode){ @@ -679,11 +627,11 @@ void rcntStartGate(unsigned int mode){ } } - for(i=0; i <=3; i++){ //Gates for counters + for(i=0; i <=3; i++){ //Gates for counters if(!(gates & (1<> 4); - switch((counters[i].mode & 0x30) >> 4){ + switch((counters[i].mode & 0x30) >> 4) { case 0x0: //Count When Signal is low (off) counters[i].count = rcntRcount(i); rcntUpd(i); @@ -708,10 +656,10 @@ void rcntStartGate(unsigned int mode){ } } } -void rcntEndGate(unsigned int mode){ +void rcntEndGate(unsigned int mode) { int i; - for(i=0; i <=3; i++){ //Gates for counters + for(i=0; i <=3; i++) { //Gates for counters if(!(gates & (1<> 4); @@ -741,45 +689,38 @@ void rcntEndGate(unsigned int mode){ } void rcntWtarget(int index, u32 value) { -#ifdef EECNT_LOG EECNT_LOG("EE target write %d target %x value %x\n", index, counters[index].target, value); -#endif counters[index].target = value & 0xffff; - if(counters[index].target <= rcntCycle(index)/* && counters[index].target != 0*/) { - //SysPrintf("EE Saving target %d from early trigger, target = %x, count = %x\n", index, counters[index].target, rcntCycle(index)); - counters[index].target += 0x10000000; - } + if (counters[index].target <= rcntCycle(index)/* && counters[index].target != 0*/) { + //SysPrintf("EE Saving target %d from early trigger, target = %x, count = %x\n", index, counters[index].target, rcntCycle(index)); + counters[index].target += 0x10000000; + } rcntSet(); } void rcntWhold(int index, u32 value) { -#ifdef EECNT_LOG EECNT_LOG("EE hold write %d value %x\n", index, value); -#endif counters[index].hold = value; } u32 rcntRcount(int index) { u32 ret; - if ((counters[index].mode & 0x80)) { + if ((counters[index].mode & 0x80)) ret = counters[index].count + (int)((cpuRegs.cycle - counters[index].sCycleT) / counters[index].rate); - }else{ + else ret = counters[index].count; - } -#ifdef EECNT_LOG + EECNT_LOG("EE count read %d value %x\n", index, ret); -#endif return ret; } u32 rcntCycle(int index) { - if ((counters[index].mode & 0x80)) { + if ((counters[index].mode & 0x80)) return (u32)counters[index].count + (int)((cpuRegs.cycle - counters[index].sCycleT) / counters[index].rate); - }else{ + else return (u32)counters[index].count; - } } int rcntFreeze(gzFile f, int Mode) {