73 lines
1.5 KiB
C++
73 lines
1.5 KiB
C++
|
#include "..\..\N64 System.h"
|
||
|
|
||
|
|
||
|
CDelaySlotFunctionMap::CDelaySlotFunctionMap()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CDelaySlotFunctionMap::~CDelaySlotFunctionMap()
|
||
|
{
|
||
|
Reset();
|
||
|
}
|
||
|
|
||
|
FUNCTION_INFO * CDelaySlotFunctionMap::AddFunctionInfo ( DWORD vAddr, DWORD pAddr )
|
||
|
{
|
||
|
if (FunctionMap.find(vAddr) != FunctionMap.end())
|
||
|
{
|
||
|
Notify().BreakPoint(__FILE__,__LINE__);
|
||
|
}
|
||
|
|
||
|
FUNCTION_INFO * info = new FUNCTION_INFO(vAddr,pAddr);
|
||
|
FunctionMap.insert(FUNCTION_MAP::value_type(vAddr,info));
|
||
|
return info;
|
||
|
|
||
|
Notify().BreakPoint(__FILE__,__LINE__);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
FUNCTION_INFO * CDelaySlotFunctionMap::FindFunction ( DWORD vAddr, int Length )
|
||
|
{
|
||
|
DWORD Start = ((vAddr + 0xFFF) >> 0xC);
|
||
|
DWORD End = ((vAddr + Length) >> 0xC);
|
||
|
for (DWORD i = Start; i < End; i++)
|
||
|
{
|
||
|
FUNCTION_INFO * info = FindFunction(i << 0xC);
|
||
|
if (info)
|
||
|
{
|
||
|
return info;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
FUNCTION_INFO * CDelaySlotFunctionMap::FindFunction ( DWORD vAddr ) const
|
||
|
{
|
||
|
FUNCTION_MAP::const_iterator iter = FunctionMap.find(vAddr);
|
||
|
if (iter == FunctionMap.end())
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
return iter->second;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CDelaySlotFunctionMap::Remove ( FUNCTION_INFO * info )
|
||
|
{
|
||
|
FUNCTION_MAP::iterator iter = FunctionMap.find(info->VStartPC());
|
||
|
if (iter != FunctionMap.end())
|
||
|
{
|
||
|
delete iter->second;
|
||
|
FunctionMap.erase(iter);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CDelaySlotFunctionMap::Reset ( void )
|
||
|
{
|
||
|
for (FUNCTION_MAP::iterator iter = FunctionMap.begin(); iter != FunctionMap.end(); iter++)
|
||
|
{
|
||
|
delete iter->second;
|
||
|
}
|
||
|
FunctionMap.clear();
|
||
|
}
|