102 lines
2.2 KiB
C++
102 lines
2.2 KiB
C++
/******************/
|
|
/*** PSX Timer ***/
|
|
/******************/
|
|
|
|
|
|
#include <libapi.h>
|
|
|
|
#include "system\global.h"
|
|
#include "system\clickcount.h"
|
|
#include "system/gp.h"
|
|
|
|
|
|
/*****************************************************************************/
|
|
u32 CClickCount::s_currentTime=0;
|
|
bool CClickCount::s_initialised=false;
|
|
bool CClickCount::s_paused=false;
|
|
|
|
static const int COUNT_DOWN_VAL = 17200;
|
|
static const int COUNTS_PER_FRAME_INTERNAL = 2;
|
|
static const int COUNTS_PER_FRAME_EXTERNAL = 4096;
|
|
|
|
|
|
/*****************************************************************************/
|
|
void clockTicker()
|
|
{
|
|
u32 thisGp;
|
|
thisGp=ReloadGP();
|
|
|
|
CClickCount::updateCurrentTime();
|
|
SetGP(thisGp);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
u32 CClickCount::timeSinceLast()
|
|
{
|
|
if (!s_initialised)
|
|
{
|
|
initialise();
|
|
m_lastTime=getCurrentTime();
|
|
s_initialised=true;
|
|
}
|
|
|
|
u32 timeSince;
|
|
u32 currentTime;
|
|
u32 lastTime;
|
|
|
|
lastTime=m_lastTime;
|
|
currentTime=getCurrentTime();
|
|
timeSince=currentTime-m_lastTime;
|
|
|
|
m_lastTime=currentTime;
|
|
|
|
return((timeSince*COUNTS_PER_FRAME_EXTERNAL)/COUNTS_PER_FRAME_INTERNAL);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CClickCount::initialise()
|
|
{
|
|
unsigned long eventHandle;
|
|
|
|
// set up variables and environment
|
|
|
|
EnterCriticalSection();
|
|
eventHandle = OpenEvent( RCntCNT2, EvSpINT, EvMdINTR,(long (*)(...)) clockTicker);
|
|
EnableEvent( eventHandle );
|
|
// SetRCnt( RCntCNT2, COUNT_DOWN_VAL, RCntMdINTR|RCntMdSP);
|
|
SetRCnt( RCntCNT2, COUNT_DOWN_VAL, RCntMdINTR);
|
|
StartRCnt( RCntCNT2 );
|
|
ExitCriticalSection();
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
u32 CClickCount::getCurrentTime()
|
|
{
|
|
return(s_currentTime);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CClickCount::pauseClickCount()
|
|
{
|
|
ASSERT(!s_paused);
|
|
s_paused = true;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CClickCount::restartClickCount()
|
|
{
|
|
ASSERT(s_paused);
|
|
s_paused = false;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void CClickCount::updateCurrentTime()
|
|
{
|
|
if (!s_paused)
|
|
{
|
|
s_currentTime++;
|
|
}
|
|
|
|
}
|
|
|