Resolve merge conflicts from `Controller Plugin.cpp`.
This commit is contained in:
commit
dc65c0a075
|
@ -4,6 +4,14 @@
|
||||||
*.sdf
|
*.sdf
|
||||||
*.suo
|
*.suo
|
||||||
*.user
|
*.user
|
||||||
|
|
||||||
|
# compiler-generated sources (MSVC, GCC)
|
||||||
|
*.asm
|
||||||
|
*.s
|
||||||
|
|
||||||
|
# assembled linker objects (GCC)
|
||||||
|
*.o
|
||||||
|
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
/Bin/Debug
|
/Bin/Debug
|
||||||
/Bin/Debug64
|
/Bin/Debug64
|
||||||
|
|
Binary file not shown.
|
@ -88,6 +88,7 @@
|
||||||
#198# "插槽 8"
|
#198# "插槽 8"
|
||||||
#199# "插槽 9"
|
#199# "插槽 9"
|
||||||
#200# "插槽 10"
|
#200# "插槽 10"
|
||||||
|
#201# "插槽 (%ws) 被选"
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
#210# "运行游戏"
|
#210# "运行游戏"
|
||||||
|
@ -224,7 +225,7 @@
|
||||||
#452# " 选择材质包目录"
|
#452# " 选择材质包目录"
|
||||||
|
|
||||||
//Options Dialog
|
//Options Dialog
|
||||||
#460# "当窗口处于非活动状态时暂停模拟器"
|
#460# "当模拟器窗口不是处于屏幕最上方,暂停模拟器"
|
||||||
#461# "载入ROM后切换为全屏模式"
|
#461# "载入ROM后切换为全屏模式"
|
||||||
#462# "隐藏高级设置"
|
#462# "隐藏高级设置"
|
||||||
#463# "记住已选择的金手指"
|
#463# "记住已选择的金手指"
|
||||||
|
@ -255,7 +256,7 @@
|
||||||
#503# "自我修改码方案:"
|
#503# "自我修改码方案:"
|
||||||
#504# "默认存档容量:"
|
#504# "默认存档容量:"
|
||||||
#505# "高级模块连接"
|
#505# "高级模块连接"
|
||||||
#506# "当ROM加载后,开始模拟"
|
#506# "当读取完ROM后,开始模拟"
|
||||||
#507# "总是从 RDB 中覆盖默认设置"
|
#507# "总是从 RDB 中覆盖默认设置"
|
||||||
#508# "自动压缩即时存档文件"
|
#508# "自动压缩即时存档文件"
|
||||||
#509# "开启调试器"
|
#509# "开启调试器"
|
||||||
|
|
|
@ -88,6 +88,7 @@
|
||||||
#198# "Slot 8"
|
#198# "Slot 8"
|
||||||
#199# "Slot 9"
|
#199# "Slot 9"
|
||||||
#200# "Slot 10"
|
#200# "Slot 10"
|
||||||
|
#201# "Save Slot (%ws) selected"
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
#210# "Play Game"
|
#210# "Play Game"
|
||||||
|
|
BIN
Project64.sln
BIN
Project64.sln
Binary file not shown.
|
@ -2,7 +2,7 @@
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
|
||||||
<PropertyGroup Label="Configuration">
|
<PropertyGroup Label="Configuration">
|
||||||
<PlatformToolset>v140_xp</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)_xp</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ImportGroup Label="PropertySheets">
|
<ImportGroup Label="PropertySheets">
|
||||||
|
|
|
@ -79,16 +79,11 @@ bool CFile::Open(const char * lpszFileName, uint32_t nOpenFlags)
|
||||||
sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0;
|
sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0;
|
||||||
|
|
||||||
// map creation flags
|
// map creation flags
|
||||||
ULONG dwCreateFlag = 0;
|
ULONG dwCreateFlag = OPEN_EXISTING;
|
||||||
if (nOpenFlags & modeCreate)
|
if (nOpenFlags & modeCreate)
|
||||||
{
|
{
|
||||||
if (nOpenFlags & modeNoTruncate)
|
dwCreateFlag = ((nOpenFlags & modeNoTruncate) != 0) ? OPEN_ALWAYS : CREATE_ALWAYS;
|
||||||
dwCreateFlag = OPEN_ALWAYS;
|
|
||||||
else
|
|
||||||
dwCreateFlag = CREATE_ALWAYS;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dwCreateFlag = OPEN_EXISTING;
|
|
||||||
|
|
||||||
// attempt file creation
|
// attempt file creation
|
||||||
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa, dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
|
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa, dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
@ -140,19 +135,15 @@ bool CFile::Flush()
|
||||||
return ::FlushFileBuffers(m_hFile) != 0;
|
return ::FlushFileBuffers(m_hFile) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFile::Write(const void* lpBuf, size_t nCount)
|
bool CFile::Write(const void* lpBuf, uint32_t nCount)
|
||||||
{
|
{
|
||||||
if (nCount == 0)
|
if (nCount == 0)
|
||||||
{
|
{
|
||||||
return true; // avoid Win32 "null-write" option
|
return true; // avoid Win32 "null-write" option
|
||||||
}
|
}
|
||||||
if (nCount > ULONG_MAX)
|
|
||||||
{
|
|
||||||
nCount = ULONG_MAX; /* Or should we loop WriteFile() every 2 GB? */
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD nWritten = 0;
|
ULONG nWritten = 0;
|
||||||
if (!::WriteFile(m_hFile, lpBuf, (DWORD)nCount, &nWritten, NULL))
|
if (!::WriteFile(m_hFile, lpBuf, nCount, &nWritten, NULL))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -165,23 +156,19 @@ bool CFile::Write(const void* lpBuf, size_t nCount)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t CFile::Read(void* lpBuf, size_t nCount)
|
uint32_t CFile::Read(void* lpBuf, uint32_t nCount)
|
||||||
{
|
{
|
||||||
if (nCount == 0)
|
if (nCount == 0)
|
||||||
{
|
{
|
||||||
return 0; // avoid Win32 "null-read"
|
return 0; // avoid Win32 "null-read"
|
||||||
}
|
}
|
||||||
if (nCount > ULONG_MAX)
|
|
||||||
{
|
|
||||||
nCount = ULONG_MAX; /* Or should we loop ReadFile() every 2 GB? */
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD dwRead = 0;
|
DWORD dwRead = 0;
|
||||||
if (!::ReadFile(m_hFile, lpBuf, (DWORD)nCount, &dwRead, NULL))
|
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (dwRead);
|
return (uint32_t)dwRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
long CFile::Seek(long lOff, SeekPosition nFrom)
|
long CFile::Seek(long lOff, SeekPosition nFrom)
|
||||||
|
|
|
@ -40,8 +40,8 @@ public:
|
||||||
virtual bool SetLength(uint32_t dwNewLen) = 0;
|
virtual bool SetLength(uint32_t dwNewLen) = 0;
|
||||||
virtual uint32_t GetLength() const = 0;
|
virtual uint32_t GetLength() const = 0;
|
||||||
|
|
||||||
virtual size_t Read(void* lpBuf, size_t nCount) = 0;
|
virtual uint32_t Read(void* lpBuf, uint32_t nCount) = 0;
|
||||||
virtual bool Write(const void* lpBuf, size_t nCount) = 0;
|
virtual bool Write(const void* lpBuf, uint32_t nCount) = 0;
|
||||||
|
|
||||||
virtual bool Flush() = 0;
|
virtual bool Flush() = 0;
|
||||||
virtual bool Close() = 0;
|
virtual bool Close() = 0;
|
||||||
|
@ -78,8 +78,8 @@ public:
|
||||||
virtual bool SetLength(uint32_t dwNewLen);
|
virtual bool SetLength(uint32_t dwNewLen);
|
||||||
virtual uint32_t GetLength() const;
|
virtual uint32_t GetLength() const;
|
||||||
|
|
||||||
virtual size_t Read(void* lpBuf, size_t nCount);
|
virtual uint32_t Read(void* lpBuf, uint32_t nCount);
|
||||||
virtual bool Write(const void* lpBuf, size_t nCount);
|
virtual bool Write(const void* lpBuf, uint32_t nCount);
|
||||||
|
|
||||||
virtual bool Flush();
|
virtual bool Flush();
|
||||||
virtual bool Close();
|
virtual bool Close();
|
||||||
|
|
|
@ -120,7 +120,7 @@ void CLog::LogArgs(const char * Message, va_list & args )
|
||||||
void CLog::Log( const char * Message )
|
void CLog::Log( const char * Message )
|
||||||
{
|
{
|
||||||
if (!m_hLogFile.IsOpen()) { return; }
|
if (!m_hLogFile.IsOpen()) { return; }
|
||||||
m_hLogFile.Write(Message, strlen(Message)*sizeof(TCHAR));
|
m_hLogFile.Write(Message,(uint32_t)strlen(Message)*sizeof(TCHAR));
|
||||||
if (m_FlushOnWrite)
|
if (m_FlushOnWrite)
|
||||||
{
|
{
|
||||||
m_hLogFile.Flush();
|
m_hLogFile.Flush();
|
||||||
|
@ -145,13 +145,13 @@ void CLog::Log( const char * Message )
|
||||||
m_hLogFile.Seek((end - m_MaxFileSize) + m_FileChangeSize,CFile::begin);
|
m_hLogFile.Seek((end - m_MaxFileSize) + m_FileChangeSize,CFile::begin);
|
||||||
|
|
||||||
// Find next end of line
|
// Find next end of line
|
||||||
size_t NextEnter = 0, dwRead = 0;
|
uint32_t NextEnter = 0, dwRead = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
BYTE Data[300];
|
BYTE Data[300];
|
||||||
size_t dwRead;
|
uint32_t dwRead;
|
||||||
|
|
||||||
dwRead = m_hLogFile.Read(Data, sizeof(Data));
|
dwRead = m_hLogFile.Read(Data,sizeof(Data));
|
||||||
if (dwRead == 0)
|
if (dwRead == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -170,9 +170,8 @@ void CLog::Log( const char * Message )
|
||||||
} while(dwRead != 0);
|
} while(dwRead != 0);
|
||||||
|
|
||||||
// copy content of log to the new file
|
// copy content of log to the new file
|
||||||
size_t ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
|
uint32_t ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
|
||||||
uint32_t WritePos = 0;
|
uint32_t SizeToRead, WritePos = 0;
|
||||||
size_t SizeToRead;
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
enum { fIS_MvSize = 0x5000 };
|
enum { fIS_MvSize = 0x5000 };
|
||||||
|
@ -183,8 +182,8 @@ void CLog::Log( const char * Message )
|
||||||
|
|
||||||
m_hLogFile.Seek(ReadPos,CFile::begin);
|
m_hLogFile.Seek(ReadPos,CFile::begin);
|
||||||
|
|
||||||
size_t dwRead;
|
uint32_t dwRead;
|
||||||
dwRead = m_hLogFile.Read(Data, SizeToRead);
|
dwRead = m_hLogFile.Read(Data,SizeToRead);
|
||||||
|
|
||||||
m_hLogFile.Seek(WritePos,CFile::begin);
|
m_hLogFile.Seek(WritePos,CFile::begin);
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@ class CLog
|
||||||
bool m_FlushOnWrite;
|
bool m_FlushOnWrite;
|
||||||
stdstr m_FileName;
|
stdstr m_FileName;
|
||||||
bool m_TruncateFileLog;
|
bool m_TruncateFileLog;
|
||||||
size_t m_MaxFileSize;
|
uint32_t m_MaxFileSize;
|
||||||
size_t m_FileChangeSize;
|
uint32_t m_FileChangeSize;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CLog ( void );
|
CLog ( void );
|
||||||
|
@ -29,10 +29,10 @@ public:
|
||||||
bool Empty ( void );
|
bool Empty ( void );
|
||||||
void Close ( void );
|
void Close ( void );
|
||||||
|
|
||||||
inline void SetMaxFileSize(size_t Size)
|
inline void SetMaxFileSize ( uint32_t Size )
|
||||||
{
|
{
|
||||||
m_MaxFileSize = Size;
|
m_MaxFileSize = Size;
|
||||||
m_FileChangeSize = (size_t)(Size * 0.1);
|
m_FileChangeSize = (uint32_t)(Size * 0.1);
|
||||||
}
|
}
|
||||||
inline void SetTruncateFile( bool Truncate ) { m_TruncateFileLog = Truncate; }
|
inline void SetTruncateFile( bool Truncate ) { m_TruncateFileLog = Truncate; }
|
||||||
inline void SetFlush ( bool Always ) { m_FlushOnWrite = Always; }
|
inline void SetFlush ( bool Always ) { m_FlushOnWrite = Always; }
|
||||||
|
|
|
@ -51,5 +51,22 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class stdwstr_f : public std::wstring
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
stdwstr_f(const wchar_t * strFormat, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, strFormat);
|
||||||
|
|
||||||
|
wchar_t Msg[1000];
|
||||||
|
_vsnwprintf(Msg, sizeof(Msg) - 1, strFormat, args);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
this->assign(Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
typedef std::list<stdstr> strlist;
|
typedef std::list<stdstr> strlist;
|
||||||
typedef strlist::iterator strlist_iter;
|
typedef strlist::iterator strlist_iter;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
AppId={{BEB5FB69-4080-466F-96C4-F15DF271718B}
|
AppId={{BEB5FB69-4080-466F-96C4-F15DF271718B}
|
||||||
AppName=Project 64
|
AppName=Project64
|
||||||
AppVersion={#AppVersion}
|
AppVersion={#AppVersion}
|
||||||
DefaultDirName={pf}\Project64 2.2
|
DefaultDirName={pf}\Project64 2.2
|
||||||
VersionInfoVersion={#AppVersion}
|
VersionInfoVersion={#AppVersion}
|
||||||
|
@ -21,7 +21,7 @@ UninstallDisplayIcon={uninstallexe}
|
||||||
SetupIconFile={#BaseDir}\Source\Project64\User Interface\Icons\pj64.ico
|
SetupIconFile={#BaseDir}\Source\Project64\User Interface\Icons\pj64.ico
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\Project64.exe"; Description: "{cm:LaunchProgram,{#StringChange('Project 64', '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
Filename: "{app}\Project64.exe"; Description: "{cm:LaunchProgram,{#StringChange('Project64', '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "{#BaseDir}\Bin\{#Configuration}\Project64.exe"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "{#BaseDir}\Bin\{#Configuration}\Project64.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
|
@ -44,9 +44,9 @@ Name: "{app}\Screenshots"; Permissions: users-modify
|
||||||
Name: "{app}\Textures"; Permissions: users-modify
|
Name: "{app}\Textures"; Permissions: users-modify
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
Name: "{commonprograms}\Project 64 2.2\Project 64"; Filename: "{app}\Project64.exe"
|
Name: "{commonprograms}\Project64 2.2\Project64"; Filename: "{app}\Project64.exe"
|
||||||
Name: "{commonprograms}\Project 64 2.2\Uninstall Project64 2.2"; Filename: "{uninstallexe}"; Parameters: "/LOG"
|
Name: "{commonprograms}\Project64 2.2\Uninstall Project64 2.2"; Filename: "{uninstallexe}"; Parameters: "/LOG"
|
||||||
Name: "{commonprograms}\Project 64 2.2\Support"; Filename: "http://forum.pj64-emu.com"
|
Name: "{commonprograms}\Project64 2.2\Support"; Filename: "http://forum.pj64-emu.com"
|
||||||
|
|
||||||
[Code]
|
[Code]
|
||||||
function HaveCommandlineParam (inParam: String): Boolean;
|
function HaveCommandlineParam (inParam: String): Boolean;
|
||||||
|
|
|
@ -0,0 +1,139 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include <Common\Util.h>
|
||||||
|
|
||||||
|
void FixDirectories(void);
|
||||||
|
void FixLocale(void);
|
||||||
|
|
||||||
|
static void IncreaseThreadPriority(void);
|
||||||
|
|
||||||
|
static CTraceFileLog * g_LogFile = NULL;
|
||||||
|
|
||||||
|
void LogLevelChanged(CTraceFileLog * LogFile)
|
||||||
|
{
|
||||||
|
LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogFlushChanged(CTraceFileLog * LogFile)
|
||||||
|
{
|
||||||
|
LogFile->SetFlushFile(g_Settings->LoadDword(Debugger_AppLogFlush) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeLog(void)
|
||||||
|
{
|
||||||
|
CPath LogFilePath(CPath::MODULE_DIRECTORY);
|
||||||
|
LogFilePath.AppendDirectory("Logs");
|
||||||
|
if (!LogFilePath.DirectoryExists())
|
||||||
|
{
|
||||||
|
LogFilePath.DirectoryCreate();
|
||||||
|
}
|
||||||
|
LogFilePath.SetNameExtension("Project64.log");
|
||||||
|
|
||||||
|
g_LogFile = new CTraceFileLog(LogFilePath, g_Settings->LoadDword(Debugger_AppLogFlush) != 0, Log_New, 500);
|
||||||
|
#ifdef VALIDATE_DEBUG
|
||||||
|
g_LogFile->SetTraceLevel((TraceLevel)(g_Settings->LoadDword(Debugger_AppLogLevel) | TraceValidate | TraceDebug));
|
||||||
|
#else
|
||||||
|
g_LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||||
|
#endif
|
||||||
|
AddTraceModule(g_LogFile);
|
||||||
|
|
||||||
|
g_Settings->RegisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||||
|
g_Settings->RegisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppInit(CNotification * Notify)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
g_Notify = Notify;
|
||||||
|
|
||||||
|
FixDirectories();
|
||||||
|
FixLocale();
|
||||||
|
|
||||||
|
stdstr_f AppName("Project64 %s", VER_FILE_VERSION_STR);
|
||||||
|
IncreaseThreadPriority();
|
||||||
|
|
||||||
|
g_Settings = new CSettings;
|
||||||
|
g_Settings->Initialize(AppName.c_str());
|
||||||
|
|
||||||
|
if (g_Settings->LoadBool(Setting_CheckEmuRunning) &&
|
||||||
|
pjutil::TerminatedExistingExe())
|
||||||
|
{
|
||||||
|
delete g_Settings;
|
||||||
|
g_Settings = new CSettings;
|
||||||
|
g_Settings->Initialize(AppName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeLog();
|
||||||
|
|
||||||
|
WriteTrace(TraceDebug, __FUNCTION__ ": Application Starting");
|
||||||
|
CMipsMemoryVM::ReserveMemory();
|
||||||
|
|
||||||
|
//Create the plugin container
|
||||||
|
WriteTrace(TraceDebug, __FUNCTION__ ": Create Plugins");
|
||||||
|
g_Plugins = new CPlugins(g_Settings->LoadStringVal(Directory_Plugin));
|
||||||
|
|
||||||
|
g_Lang = new CLanguage();
|
||||||
|
g_Lang->LoadCurrentStrings();
|
||||||
|
g_Notify->AppInitDone();
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
g_Notify->DisplayError(stdstr_f("Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__).ToUTF16().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppCleanup(void)
|
||||||
|
{
|
||||||
|
g_Settings->UnregisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||||
|
g_Settings->UnregisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||||
|
WriteTrace(TraceDebug, __FUNCTION__ ": cleaning up global objects");
|
||||||
|
|
||||||
|
if (g_Rom) { delete g_Rom; g_Rom = NULL; }
|
||||||
|
if (g_Plugins) { delete g_Plugins; g_Plugins = NULL; }
|
||||||
|
if (g_Settings) { delete g_Settings; g_Settings = NULL; }
|
||||||
|
if (g_Lang) { delete g_Lang; g_Lang = NULL; }
|
||||||
|
|
||||||
|
CMipsMemoryVM::FreeReservedMemory();
|
||||||
|
|
||||||
|
WriteTrace(TraceDebug, __FUNCTION__ ": Done");
|
||||||
|
CloseTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixDirectories(void)
|
||||||
|
{
|
||||||
|
CPath Directory(CPath::MODULE_DIRECTORY);
|
||||||
|
Directory.AppendDirectory("Config");
|
||||||
|
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||||
|
|
||||||
|
Directory.UpDirectory();
|
||||||
|
Directory.AppendDirectory("Logs");
|
||||||
|
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||||
|
|
||||||
|
Directory.UpDirectory();
|
||||||
|
Directory.AppendDirectory("Save");
|
||||||
|
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||||
|
|
||||||
|
Directory.UpDirectory();
|
||||||
|
Directory.AppendDirectory("Screenshots");
|
||||||
|
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||||
|
|
||||||
|
Directory.UpDirectory();
|
||||||
|
Directory.AppendDirectory("textures");
|
||||||
|
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
void FixLocale(void)
|
||||||
|
{
|
||||||
|
char *lbuffer = new char[10];
|
||||||
|
if (GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SABBREVLANGNAME, lbuffer, 10))
|
||||||
|
{
|
||||||
|
setlocale(LC_ALL, lbuffer);
|
||||||
|
}
|
||||||
|
delete[] lbuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IncreaseThreadPriority(void)
|
||||||
|
{
|
||||||
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\User Interface\Notification Class.h>
|
||||||
|
|
||||||
|
void AppInit(CNotification * Notify);
|
||||||
|
void AppCleanup(void);
|
|
@ -1 +1,16 @@
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Project 64 - A Nintendo 64 emulator. *
|
||||||
|
* http://www.pj64-emu.com/ *
|
||||||
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
|
* *
|
||||||
|
* License: *
|
||||||
|
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
__interface CDebugger
|
||||||
|
{
|
||||||
|
virtual void TLBChanged(void) = 0;
|
||||||
|
};
|
||||||
|
|
|
@ -1,919 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
* *
|
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
|
||||||
* http://www.pj64-emu.com/ *
|
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
|
||||||
* *
|
|
||||||
* License: *
|
|
||||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
|
||||||
* *
|
|
||||||
****************************************************************************/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#include <prsht.h>
|
|
||||||
|
|
||||||
void LoadLogSetting (HKEY hKey,char * String, bool * Value);
|
|
||||||
void SaveLogOptions (void);
|
|
||||||
|
|
||||||
LRESULT CALLBACK LogGeneralProc ( HWND, UINT, WPARAM, LPARAM );
|
|
||||||
LRESULT CALLBACK LogPifProc ( HWND, UINT, WPARAM, LPARAM );
|
|
||||||
LRESULT CALLBACK LogRegProc ( HWND, UINT, WPARAM, LPARAM );
|
|
||||||
|
|
||||||
static HANDLE g_hLogFile = NULL;
|
|
||||||
LOG_OPTIONS g_LogOptions, TempOptions;
|
|
||||||
|
|
||||||
void EnterLogOptions(HWND hwndOwner)
|
|
||||||
{
|
|
||||||
PROPSHEETPAGE psp[3];
|
|
||||||
PROPSHEETHEADER psh;
|
|
||||||
|
|
||||||
psp[0].dwSize = sizeof(PROPSHEETPAGE);
|
|
||||||
psp[0].dwFlags = PSP_USETITLE;
|
|
||||||
psp[0].hInstance = GetModuleHandle(NULL);
|
|
||||||
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_Logging_Registers);
|
|
||||||
psp[0].pfnDlgProc = (DLGPROC)LogRegProc;
|
|
||||||
psp[0].pszTitle = "Registers";
|
|
||||||
psp[0].lParam = 0;
|
|
||||||
psp[0].pfnCallback = NULL;
|
|
||||||
|
|
||||||
psp[1].dwSize = sizeof(PROPSHEETPAGE);
|
|
||||||
psp[1].dwFlags = PSP_USETITLE;
|
|
||||||
psp[1].hInstance = GetModuleHandle(NULL);
|
|
||||||
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_Logging_PifRam);
|
|
||||||
psp[1].pfnDlgProc = (DLGPROC)LogPifProc;
|
|
||||||
psp[1].pszTitle = "Pif Ram";
|
|
||||||
psp[1].lParam = 0;
|
|
||||||
psp[1].pfnCallback = NULL;
|
|
||||||
|
|
||||||
psp[2].dwSize = sizeof(PROPSHEETPAGE);
|
|
||||||
psp[2].dwFlags = PSP_USETITLE;
|
|
||||||
psp[2].hInstance = GetModuleHandle(NULL);
|
|
||||||
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_Logging_General);
|
|
||||||
psp[2].pfnDlgProc = (DLGPROC)LogGeneralProc;
|
|
||||||
psp[2].pszTitle = "General";
|
|
||||||
psp[2].lParam = 0;
|
|
||||||
psp[2].pfnCallback = NULL;
|
|
||||||
|
|
||||||
psh.dwSize = sizeof(PROPSHEETHEADER);
|
|
||||||
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
|
|
||||||
psh.hwndParent = hwndOwner;
|
|
||||||
psh.hInstance = GetModuleHandle(NULL);
|
|
||||||
psh.pszCaption = (LPSTR) "Log Options";
|
|
||||||
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
|
|
||||||
psh.nStartPage = 0;
|
|
||||||
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
|
|
||||||
psh.pfnCallback = NULL;
|
|
||||||
|
|
||||||
LoadLogOptions(&TempOptions,TRUE);
|
|
||||||
#if defined(WINDOWS_UI)
|
|
||||||
PropertySheet(&psh);
|
|
||||||
#else
|
|
||||||
g_Notify -> BreakPoint(__FILEW__, __LINE__);
|
|
||||||
#endif
|
|
||||||
SaveLogOptions();
|
|
||||||
LoadLogOptions(&g_LogOptions, FALSE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadLogOptions (LOG_OPTIONS * LogOptions, bool AlwaysFill)
|
|
||||||
{
|
|
||||||
int32_t lResult;
|
|
||||||
HKEY hKeyResults = 0;
|
|
||||||
char String[200];
|
|
||||||
|
|
||||||
sprintf(String,"Software\\N64 Emulation\\%s\\Logging",g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
|
|
||||||
lResult = RegOpenKeyEx( HKEY_CURRENT_USER,String,0,KEY_ALL_ACCESS,
|
|
||||||
&hKeyResults);
|
|
||||||
|
|
||||||
if (lResult == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
//LoadLogSetting(hKeyResults,"Generate Log File",&LogOptions->GenerateLog);
|
|
||||||
if (LogOptions->GenerateLog || AlwaysFill)
|
|
||||||
{
|
|
||||||
LoadLogSetting(hKeyResults,"Log RDRAM",&LogOptions->LogRDRamRegisters);
|
|
||||||
LoadLogSetting(hKeyResults,"Log SP",&LogOptions->LogSPRegisters);
|
|
||||||
LoadLogSetting(hKeyResults,"Log DP Command",&LogOptions->LogDPCRegisters);
|
|
||||||
LoadLogSetting(hKeyResults,"Log DP Span",&LogOptions->LogDPSRegisters);
|
|
||||||
LoadLogSetting(hKeyResults,"Log MIPS Interface (MI)",&LogOptions->LogMIPSInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Video Interface (VI)",&LogOptions->LogVideoInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Audio Interface (AI)",&LogOptions->LogAudioInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Peripheral Interface (PI)",&LogOptions->LogPerInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log RDRAM Interface (RI)",&LogOptions->LogRDRAMInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Serial Interface (SI)",&LogOptions->LogSerialInterface);
|
|
||||||
LoadLogSetting(hKeyResults,"Log PifRam DMA Operations",&LogOptions->LogPRDMAOperations);
|
|
||||||
LoadLogSetting(hKeyResults,"Log PifRam Direct Memory Loads",&LogOptions->LogPRDirectMemLoads);
|
|
||||||
LoadLogSetting(hKeyResults,"Log PifRam DMA Memory Loads",&LogOptions->LogPRDMAMemLoads);
|
|
||||||
LoadLogSetting(hKeyResults,"Log PifRam Direct Memory Stores",&LogOptions->LogPRDirectMemStores);
|
|
||||||
LoadLogSetting(hKeyResults,"Log PifRam DMA Memory Stores",&LogOptions->LogPRDMAMemStores);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Controller Pak",&LogOptions->LogControllerPak);
|
|
||||||
LoadLogSetting(hKeyResults,"Log CP0 changes",&LogOptions->LogCP0changes);
|
|
||||||
LoadLogSetting(hKeyResults,"Log CP0 reads",&LogOptions->LogCP0reads);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Exceptions",&LogOptions->LogExceptions);
|
|
||||||
LoadLogSetting(hKeyResults,"No Interrupts",&LogOptions->NoInterrupts);
|
|
||||||
LoadLogSetting(hKeyResults,"Log TLB",&LogOptions->LogTLB);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Cache Operations",&LogOptions->LogCache);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Rom Header",&LogOptions->LogRomHeader);
|
|
||||||
LoadLogSetting(hKeyResults,"Log Unknown access",&LogOptions->LogUnknown);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LogOptions->GenerateLog = FALSE;
|
|
||||||
LogOptions->LogRDRamRegisters = FALSE;
|
|
||||||
LogOptions->LogSPRegisters = FALSE;
|
|
||||||
LogOptions->LogDPCRegisters = FALSE;
|
|
||||||
LogOptions->LogDPSRegisters = FALSE;
|
|
||||||
LogOptions->LogMIPSInterface = FALSE;
|
|
||||||
LogOptions->LogVideoInterface = FALSE;
|
|
||||||
LogOptions->LogAudioInterface = FALSE;
|
|
||||||
LogOptions->LogPerInterface = FALSE;
|
|
||||||
LogOptions->LogRDRAMInterface = FALSE;
|
|
||||||
LogOptions->LogSerialInterface = FALSE;
|
|
||||||
|
|
||||||
LogOptions->LogPRDMAOperations = FALSE;
|
|
||||||
LogOptions->LogPRDirectMemLoads = FALSE;
|
|
||||||
LogOptions->LogPRDMAMemLoads = FALSE;
|
|
||||||
LogOptions->LogPRDirectMemStores = FALSE;
|
|
||||||
LogOptions->LogPRDMAMemStores = FALSE;
|
|
||||||
LogOptions->LogControllerPak = FALSE;
|
|
||||||
|
|
||||||
LogOptions->LogCP0changes = FALSE;
|
|
||||||
LogOptions->LogCP0reads = FALSE;
|
|
||||||
LogOptions->LogCache = FALSE;
|
|
||||||
LogOptions->LogExceptions = FALSE;
|
|
||||||
LogOptions->NoInterrupts = FALSE;
|
|
||||||
LogOptions->LogTLB = FALSE;
|
|
||||||
LogOptions->LogRomHeader = FALSE;
|
|
||||||
LogOptions->LogUnknown = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadLogSetting (HKEY hKey,char * String, bool * Value)
|
|
||||||
{
|
|
||||||
DWORD Type, dwResult, Bytes = 4;
|
|
||||||
int32_t lResult;
|
|
||||||
|
|
||||||
lResult = RegQueryValueEx(hKey,String,0,&Type,(LPBYTE)(&dwResult),&Bytes);
|
|
||||||
if (Type == REG_DWORD && lResult == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
*Value = dwResult != 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*Value = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT CALLBACK LogGeneralProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
if (TempOptions.LogCP0changes) { CheckDlgButton(hDlg,IDC_CP0_WRITE,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogCP0reads) { CheckDlgButton(hDlg,IDC_CP0_READ,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogCache) { CheckDlgButton(hDlg,IDC_CACHE,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogExceptions) { CheckDlgButton(hDlg,IDC_EXCEPTIONS,BST_CHECKED); }
|
|
||||||
if (TempOptions.NoInterrupts) { CheckDlgButton(hDlg,IDC_INTERRUPTS,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogTLB) { CheckDlgButton(hDlg,IDC_TLB,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogRomHeader) { CheckDlgButton(hDlg,IDC_ROM_HEADER,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogUnknown) { CheckDlgButton(hDlg,IDC_UNKOWN,BST_CHECKED); }
|
|
||||||
break;
|
|
||||||
case WM_NOTIFY:
|
|
||||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY) { break; }
|
|
||||||
TempOptions.LogCP0changes = IsDlgButtonChecked(hDlg,IDC_CP0_WRITE) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogCP0reads = IsDlgButtonChecked(hDlg,IDC_CP0_READ) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogCache = IsDlgButtonChecked(hDlg,IDC_CACHE) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogExceptions = IsDlgButtonChecked(hDlg,IDC_EXCEPTIONS) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.NoInterrupts = IsDlgButtonChecked(hDlg,IDC_INTERRUPTS) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogTLB = IsDlgButtonChecked(hDlg,IDC_TLB) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogRomHeader = IsDlgButtonChecked(hDlg,IDC_ROM_HEADER) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogUnknown = IsDlgButtonChecked(hDlg,IDC_UNKOWN) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Log_LW (uint32_t PC, uint32_t VAddr)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.GenerateLog)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr < 0xA0000000 || VAddr >= 0xC0000000 )
|
|
||||||
{
|
|
||||||
uint32_t PAddr;
|
|
||||||
if (!g_TransVaddr->TranslateVaddr(VAddr,PAddr))
|
|
||||||
{
|
|
||||||
if (g_LogOptions.LogUnknown)
|
|
||||||
{
|
|
||||||
LogMessage("%08X: read from unknown ??? (%08X)",PC,VAddr);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
VAddr = PAddr + 0xA0000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Value;
|
|
||||||
if ( VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogRDRamRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA3F00000: LogMessage("%08X: read from RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00004: LogMessage("%08X: read from RDRAM_DEVICE_ID_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00008: LogMessage("%08X: read from RDRAM_DELAY_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F0000C: LogMessage("%08X: read from RDRAM_MODE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00010: LogMessage("%08X: read from RDRAM_REF_INTERVAL_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00014: LogMessage("%08X: read from RDRAM_REF_ROW_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00018: LogMessage("%08X: read from RDRAM_RAS_INTERVAL_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F0001C: LogMessage("%08X: read from RDRAM_MIN_INTERVAL_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00020: LogMessage("%08X: read from RDRAM_ADDR_SELECT_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA3F00024: LogMessage("%08X: read from RDRAM_DEVICE_MANUF_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA4040000 && VAddr <= 0xA404001C )
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSPRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4040000: LogMessage("%08X: read from SP_MEM_ADDR_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA4040004: LogMessage("%08X: read from SP_DRAM_ADDR_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA4040008: LogMessage("%08X: read from SP_RD_LEN_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA404000C: LogMessage("%08X: read from SP_WR_LEN_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA4040010: LogMessage("%08X: read from SP_STATUS_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA4040014: LogMessage("%08X: read from SP_DMA_FULL_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA4040018: LogMessage("%08X: read from SP_DMA_BUSY_REG (%08X)",PC, Value); break;
|
|
||||||
case 0xA404001C: LogMessage("%08X: read from SP_SEMAPHORE_REG (%08X)",PC, Value); break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4080000)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSPRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read from SP_PC (%08X)",PC, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogDPCRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4100000: LogMessage("%08X: read from DPC_START_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4100004: LogMessage("%08X: read from DPC_END_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4100008: LogMessage("%08X: read from DPC_CURRENT_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA410000C: LogMessage("%08X: read from DPC_STATUS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4100010: LogMessage("%08X: read from DPC_CLOCK_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4100014: LogMessage("%08X: read from DPC_BUFBUSY_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4100018: LogMessage("%08X: read from DPC_PIPEBUSY_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA410001C: LogMessage("%08X: read from DPC_TMEM_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogMIPSInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4300000: LogMessage("%08X: read from MI_INIT_MODE_REG/MI_MODE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4300004: LogMessage("%08X: read from MI_VERSION_REG/MI_NOOP_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4300008: LogMessage("%08X: read from MI_INTR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA430000C: LogMessage("%08X: read from MI_INTR_MASK_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogVideoInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4400000: LogMessage("%08X: read from VI_STATUS_REG/VI_CONTROL_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400004: LogMessage("%08X: read from VI_ORIGIN_REG/VI_DRAM_ADDR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400008: LogMessage("%08X: read from VI_WIDTH_REG/VI_H_WIDTH_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA440000C: LogMessage("%08X: read from VI_INTR_REG/VI_V_INTR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400010: LogMessage("%08X: read from VI_CURRENT_REG/VI_V_CURRENT_LINE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400014: LogMessage("%08X: read from VI_BURST_REG/VI_TIMING_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400018: LogMessage("%08X: read from VI_V_SYNC_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA440001C: LogMessage("%08X: read from VI_H_SYNC_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400020: LogMessage("%08X: read from VI_LEAP_REG/VI_H_SYNC_LEAP_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400024: LogMessage("%08X: read from VI_H_START_REG/VI_H_VIDEO_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400028: LogMessage("%08X: read from VI_V_START_REG/VI_V_VIDEO_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA440002C: LogMessage("%08X: read from VI_V_BURST_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400030: LogMessage("%08X: read from VI_X_SCALE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4400034: LogMessage("%08X: read from VI_Y_SCALE_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogAudioInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4500000: LogMessage("%08X: read from AI_DRAM_ADDR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4500004: LogMessage("%08X: read from AI_LEN_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4500008: LogMessage("%08X: read from AI_CONTROL_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA450000C: LogMessage("%08X: read from AI_STATUS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4500010: LogMessage("%08X: read from AI_DACRATE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4500014: LogMessage("%08X: read from AI_BITRATE_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogPerInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4600000: LogMessage("%08X: read from PI_DRAM_ADDR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600004: LogMessage("%08X: read from PI_CART_ADDR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600008: LogMessage("%08X: read from PI_RD_LEN_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA460000C: LogMessage("%08X: read from PI_WR_LEN_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600010: LogMessage("%08X: read from PI_STATUS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600014: LogMessage("%08X: read from PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600018: LogMessage("%08X: read from PI_BSD_DOM1_PWD_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA460001C: LogMessage("%08X: read from PI_BSD_DOM1_PGS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600020: LogMessage("%08X: read from PI_BSD_DOM1_RLS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600024: LogMessage("%08X: read from PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600028: LogMessage("%08X: read from PI_BSD_DOM2_PWD_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA460002C: LogMessage("%08X: read from PI_BSD_DOM2_PGS_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4600030: LogMessage("%08X: read from PI_BSD_DOM2_RLS_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogRDRAMInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4700000: LogMessage("%08X: read from RI_MODE_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4700004: LogMessage("%08X: read from RI_CONFIG_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4700008: LogMessage("%08X: read from RI_CURRENT_LOAD_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA470000C: LogMessage("%08X: read from RI_SELECT_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4700010: LogMessage("%08X: read from RI_REFRESH_REG/RI_COUNT_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4700014: LogMessage("%08X: read from RI_LATENCY_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA4700018: LogMessage("%08X: read from RI_RERROR_REG (%08X)",PC, Value); return;
|
|
||||||
case 0xA470001C: LogMessage("%08X: read from RI_WERROR_REG (%08X)",PC, Value); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800000)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read from SI_DRAM_ADDR_REG (%08X)",PC, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800004)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read from SI_PIF_ADDR_RD64B_REG (%08X)",PC, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800010)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read from SI_PIF_ADDR_WR64B_REG (%08X)",PC, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800018)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read from SI_STATUS_REG (%08X)",PC, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xBFC00000 && VAddr <= 0xBFC007C0 )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC )
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogPRDirectMemLoads)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
LogMessage("%08X: read word from Pif Ram at 0x%X (%08X)",PC,VAddr - 0xBFC007C0, Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xB0000040 && ((VAddr - 0xB0000000) < g_Rom->GetRomSize()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xB0000000 && VAddr < 0xB0000040)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogRomHeader)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_MMU->LW_VAddr(VAddr,Value);
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xB0000004: LogMessage("%08X: read from Rom Clock Rate (%08X)",PC, Value); break;
|
|
||||||
case 0xB0000008: LogMessage("%08X: read from Rom Boot address offset (%08X)",PC, Value); break;
|
|
||||||
case 0xB000000C: LogMessage("%08X: read from Rom Release offset (%08X)",PC, Value); break;
|
|
||||||
case 0xB0000010: LogMessage("%08X: read from Rom CRC1 (%08X)",PC, Value); break;
|
|
||||||
case 0xB0000014: LogMessage("%08X: read from Rom CRC2 (%08X)",PC, Value); break;
|
|
||||||
default: LogMessage("%08X: read from Rom header 0x%X (%08X)",PC, VAddr & 0xFF,Value); break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!g_LogOptions.LogUnknown)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: read from unknown ??? (%08X)",PC,VAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Log_SW (uint32_t PC, uint32_t VAddr, uint32_t Value)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.GenerateLog)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr < 0xA0000000 || VAddr >= 0xC0000000 )
|
|
||||||
{
|
|
||||||
uint32_t PAddr;
|
|
||||||
if (!g_TransVaddr->TranslateVaddr(VAddr,PAddr))
|
|
||||||
{
|
|
||||||
if (g_LogOptions.LogUnknown)
|
|
||||||
{
|
|
||||||
LogMessage("%08X: Writing 0x%08X to %08X",PC, Value, VAddr );
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
VAddr = PAddr + 0xA0000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogRDRamRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA3F00000: LogMessage("%08X: Writing 0x%08X to RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00004: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_ID_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00008: LogMessage("%08X: Writing 0x%08X to RDRAM_DELAY_REG",PC, Value ); return;
|
|
||||||
case 0xA3F0000C: LogMessage("%08X: Writing 0x%08X to RDRAM_MODE_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00010: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_INTERVAL_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00014: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_ROW_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00018: LogMessage("%08X: Writing 0x%08X to RDRAM_RAS_INTERVAL_REG",PC, Value ); return;
|
|
||||||
case 0xA3F0001C: LogMessage("%08X: Writing 0x%08X to RDRAM_MIN_INTERVAL_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00020: LogMessage("%08X: Writing 0x%08X to RDRAM_ADDR_SELECT_REG",PC, Value ); return;
|
|
||||||
case 0xA3F00024: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_MANUF_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSPRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4040000: LogMessage("%08X: Writing 0x%08X to SP_MEM_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4040004: LogMessage("%08X: Writing 0x%08X to SP_DRAM_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4040008: LogMessage("%08X: Writing 0x%08X to SP_RD_LEN_REG",PC, Value ); return;
|
|
||||||
case 0xA404000C: LogMessage("%08X: Writing 0x%08X to SP_WR_LEN_REG",PC, Value ); return;
|
|
||||||
case 0xA4040010: LogMessage("%08X: Writing 0x%08X to SP_STATUS_REG",PC, Value ); return;
|
|
||||||
case 0xA4040014: LogMessage("%08X: Writing 0x%08X to SP_DMA_FULL_REG",PC, Value ); return;
|
|
||||||
case 0xA4040018: LogMessage("%08X: Writing 0x%08X to SP_DMA_BUSY_REG",PC, Value ); return;
|
|
||||||
case 0xA404001C: LogMessage("%08X: Writing 0x%08X to SP_SEMAPHORE_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4080000)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSPRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to SP_PC",PC, Value ); return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogDPCRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4100000: LogMessage("%08X: Writing 0x%08X to DPC_START_REG",PC, Value ); return;
|
|
||||||
case 0xA4100004: LogMessage("%08X: Writing 0x%08X to DPC_END_REG",PC, Value ); return;
|
|
||||||
case 0xA4100008: LogMessage("%08X: Writing 0x%08X to DPC_CURRENT_REG",PC, Value ); return;
|
|
||||||
case 0xA410000C: LogMessage("%08X: Writing 0x%08X to DPC_STATUS_REG",PC, Value ); return;
|
|
||||||
case 0xA4100010: LogMessage("%08X: Writing 0x%08X to DPC_CLOCK_REG",PC, Value ); return;
|
|
||||||
case 0xA4100014: LogMessage("%08X: Writing 0x%08X to DPC_BUFBUSY_REG",PC, Value ); return;
|
|
||||||
case 0xA4100018: LogMessage("%08X: Writing 0x%08X to DPC_PIPEBUSY_REG",PC, Value ); return;
|
|
||||||
case 0xA410001C: LogMessage("%08X: Writing 0x%08X to DPC_TMEM_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4200000 && VAddr <= 0xA420000C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogDPSRegisters)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4200000: LogMessage("%08X: Writing 0x%08X to DPS_TBIST_REG",PC, Value ); return;
|
|
||||||
case 0xA4200004: LogMessage("%08X: Writing 0x%08X to DPS_TEST_MODE_REG",PC, Value ); return;
|
|
||||||
case 0xA4200008: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA420000C: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_DATA_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogMIPSInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4300000: LogMessage("%08X: Writing 0x%08X to MI_INIT_MODE_REG/MI_MODE_REG",PC, Value ); return;
|
|
||||||
case 0xA4300004: LogMessage("%08X: Writing 0x%08X to MI_VERSION_REG/MI_NOOP_REG",PC, Value ); return;
|
|
||||||
case 0xA4300008: LogMessage("%08X: Writing 0x%08X to MI_INTR_REG",PC, Value ); return;
|
|
||||||
case 0xA430000C: LogMessage("%08X: Writing 0x%08X to MI_INTR_MASK_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogVideoInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4400000: LogMessage("%08X: Writing 0x%08X to VI_STATUS_REG/VI_CONTROL_REG",PC, Value ); return;
|
|
||||||
case 0xA4400004: LogMessage("%08X: Writing 0x%08X to VI_ORIGIN_REG/VI_DRAM_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4400008: LogMessage("%08X: Writing 0x%08X to VI_WIDTH_REG/VI_H_WIDTH_REG",PC, Value ); return;
|
|
||||||
case 0xA440000C: LogMessage("%08X: Writing 0x%08X to VI_INTR_REG/VI_V_INTR_REG",PC, Value ); return;
|
|
||||||
case 0xA4400010: LogMessage("%08X: Writing 0x%08X to VI_CURRENT_REG/VI_V_CURRENT_LINE_REG",PC, Value ); return;
|
|
||||||
case 0xA4400014: LogMessage("%08X: Writing 0x%08X to VI_BURST_REG/VI_TIMING_REG",PC, Value ); return;
|
|
||||||
case 0xA4400018: LogMessage("%08X: Writing 0x%08X to VI_V_SYNC_REG",PC, Value ); return;
|
|
||||||
case 0xA440001C: LogMessage("%08X: Writing 0x%08X to VI_H_SYNC_REG",PC, Value ); return;
|
|
||||||
case 0xA4400020: LogMessage("%08X: Writing 0x%08X to VI_LEAP_REG/VI_H_SYNC_LEAP_REG",PC, Value ); return;
|
|
||||||
case 0xA4400024: LogMessage("%08X: Writing 0x%08X to VI_H_START_REG/VI_H_VIDEO_REG",PC, Value ); return;
|
|
||||||
case 0xA4400028: LogMessage("%08X: Writing 0x%08X to VI_V_START_REG/VI_V_VIDEO_REG",PC, Value ); return;
|
|
||||||
case 0xA440002C: LogMessage("%08X: Writing 0x%08X to VI_V_BURST_REG",PC, Value ); return;
|
|
||||||
case 0xA4400030: LogMessage("%08X: Writing 0x%08X to VI_X_SCALE_REG",PC, Value ); return;
|
|
||||||
case 0xA4400034: LogMessage("%08X: Writing 0x%08X to VI_Y_SCALE_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogAudioInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4500000: LogMessage("%08X: Writing 0x%08X to AI_DRAM_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4500004: LogMessage("%08X: Writing 0x%08X to AI_LEN_REG",PC, Value ); return;
|
|
||||||
case 0xA4500008: LogMessage("%08X: Writing 0x%08X to AI_CONTROL_REG",PC, Value ); return;
|
|
||||||
case 0xA450000C: LogMessage("%08X: Writing 0x%08X to AI_STATUS_REG",PC, Value ); return;
|
|
||||||
case 0xA4500010: LogMessage("%08X: Writing 0x%08X to AI_DACRATE_REG",PC, Value ); return;
|
|
||||||
case 0xA4500014: LogMessage("%08X: Writing 0x%08X to AI_BITRATE_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogPerInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4600000: LogMessage("%08X: Writing 0x%08X to PI_DRAM_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4600004: LogMessage("%08X: Writing 0x%08X to PI_CART_ADDR_REG",PC, Value ); return;
|
|
||||||
case 0xA4600008: LogMessage("%08X: Writing 0x%08X to PI_RD_LEN_REG",PC, Value ); return;
|
|
||||||
case 0xA460000C: LogMessage("%08X: Writing 0x%08X to PI_WR_LEN_REG",PC, Value ); return;
|
|
||||||
case 0xA4600010: LogMessage("%08X: Writing 0x%08X to PI_STATUS_REG",PC, Value ); return;
|
|
||||||
case 0xA4600014: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG",PC, Value ); return;
|
|
||||||
case 0xA4600018: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PWD_REG",PC, Value ); return;
|
|
||||||
case 0xA460001C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PGS_REG",PC, Value ); return;
|
|
||||||
case 0xA4600020: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_RLS_REG",PC, Value ); return;
|
|
||||||
case 0xA4600024: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG",PC, Value ); return;
|
|
||||||
case 0xA4600028: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PWD_REG",PC, Value ); return;
|
|
||||||
case 0xA460002C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PGS_REG",PC, Value ); return;
|
|
||||||
case 0xA4600030: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_RLS_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogRDRAMInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switch (VAddr)
|
|
||||||
{
|
|
||||||
case 0xA4700000: LogMessage("%08X: Writing 0x%08X to RI_MODE_REG",PC, Value ); return;
|
|
||||||
case 0xA4700004: LogMessage("%08X: Writing 0x%08X to RI_CONFIG_REG",PC, Value ); return;
|
|
||||||
case 0xA4700008: LogMessage("%08X: Writing 0x%08X to RI_CURRENT_LOAD_REG",PC, Value ); return;
|
|
||||||
case 0xA470000C: LogMessage("%08X: Writing 0x%08X to RI_SELECT_REG",PC, Value ); return;
|
|
||||||
case 0xA4700010: LogMessage("%08X: Writing 0x%08X to RI_REFRESH_REG/RI_COUNT_REG",PC, Value ); return;
|
|
||||||
case 0xA4700014: LogMessage("%08X: Writing 0x%08X to RI_LATENCY_REG",PC, Value ); return;
|
|
||||||
case 0xA4700018: LogMessage("%08X: Writing 0x%08X to RI_RERROR_REG",PC, Value ); return;
|
|
||||||
case 0xA470001C: LogMessage("%08X: Writing 0x%08X to RI_WERROR_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800000)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to SI_DRAM_ADDR_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800004)
|
|
||||||
{
|
|
||||||
if (g_LogOptions.LogPRDMAOperations)
|
|
||||||
{
|
|
||||||
LogMessage("%08X: A DMA transfer from the PIF ram has occured",PC );
|
|
||||||
}
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_RD64B_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800010)
|
|
||||||
{
|
|
||||||
if (g_LogOptions.LogPRDMAOperations)
|
|
||||||
{
|
|
||||||
LogMessage("%08X: A DMA transfer to the PIF ram has occured",PC );
|
|
||||||
}
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_WR64B_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
if ( VAddr == 0xA4800018)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogSerialInterface)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to SI_STATUS_REG",PC, Value ); return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC )
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.LogPRDirectMemStores)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to Pif Ram at 0x%X",PC,Value, VAddr - 0xBFC007C0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!g_LogOptions.LogUnknown)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
LogMessage("%08X: Writing 0x%08X to %08X ????",PC, Value, VAddr );
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT CALLBACK LogPifProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
if (TempOptions.LogPRDMAOperations) { CheckDlgButton(hDlg,IDC_SI_DMA,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogPRDirectMemLoads) { CheckDlgButton(hDlg,IDC_DIRECT_WRITE,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogPRDMAMemLoads) { CheckDlgButton(hDlg,IDC_DMA_WRITE,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogPRDirectMemStores) { CheckDlgButton(hDlg,IDC_DIRECT_READ,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogPRDMAMemStores) { CheckDlgButton(hDlg,IDC_DMA_READ,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogControllerPak) { CheckDlgButton(hDlg,IDC_CONT_PAK,BST_CHECKED); }
|
|
||||||
break;
|
|
||||||
case WM_NOTIFY:
|
|
||||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
TempOptions.LogPRDMAOperations = IsDlgButtonChecked(hDlg,IDC_SI_DMA) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogPRDirectMemLoads = IsDlgButtonChecked(hDlg,IDC_DIRECT_WRITE) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogPRDMAMemLoads = IsDlgButtonChecked(hDlg,IDC_DMA_WRITE) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogPRDirectMemStores = IsDlgButtonChecked(hDlg,IDC_DIRECT_READ) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogPRDMAMemStores = IsDlgButtonChecked(hDlg,IDC_DMA_READ) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogControllerPak = IsDlgButtonChecked(hDlg,IDC_CONT_PAK) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT CALLBACK LogRegProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
|
|
||||||
{
|
|
||||||
switch (uMsg)
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
if (TempOptions.LogRDRamRegisters) { CheckDlgButton(hDlg,IDC_RDRAM,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogSPRegisters) { CheckDlgButton(hDlg,IDC_SP_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogDPCRegisters) { CheckDlgButton(hDlg,IDC_DPC_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogDPSRegisters) { CheckDlgButton(hDlg,IDC_DPS_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogMIPSInterface) { CheckDlgButton(hDlg,IDC_MI_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogVideoInterface) { CheckDlgButton(hDlg,IDC_VI_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogAudioInterface) { CheckDlgButton(hDlg,IDC_AI_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogPerInterface) { CheckDlgButton(hDlg,IDC_PI_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogRDRAMInterface) { CheckDlgButton(hDlg,IDC_RI_REG,BST_CHECKED); }
|
|
||||||
if (TempOptions.LogSerialInterface) { CheckDlgButton(hDlg,IDC_SI_REG,BST_CHECKED); }
|
|
||||||
break;
|
|
||||||
case WM_NOTIFY:
|
|
||||||
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
TempOptions.LogRDRamRegisters = IsDlgButtonChecked(hDlg,IDC_RDRAM) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogSPRegisters = IsDlgButtonChecked(hDlg,IDC_SP_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogDPCRegisters = IsDlgButtonChecked(hDlg,IDC_DPC_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogDPSRegisters = IsDlgButtonChecked(hDlg,IDC_DPS_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogMIPSInterface = IsDlgButtonChecked(hDlg,IDC_MI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogVideoInterface = IsDlgButtonChecked(hDlg,IDC_VI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogAudioInterface = IsDlgButtonChecked(hDlg,IDC_AI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogPerInterface = IsDlgButtonChecked(hDlg,IDC_PI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogRDRAMInterface = IsDlgButtonChecked(hDlg,IDC_RI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
TempOptions.LogSerialInterface = IsDlgButtonChecked(hDlg,IDC_SI_REG) == BST_CHECKED?TRUE:FALSE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveLogSetting (HKEY hKey,char * String, BOOL Value)
|
|
||||||
{
|
|
||||||
DWORD StoreValue = Value;
|
|
||||||
RegSetValueEx(hKey,String,0,REG_DWORD,(CONST BYTE *)&StoreValue,sizeof(DWORD));
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveLogOptions (void)
|
|
||||||
{
|
|
||||||
long lResult;
|
|
||||||
HKEY hKeyResults = 0;
|
|
||||||
DWORD Disposition = 0;
|
|
||||||
char String[200];
|
|
||||||
|
|
||||||
sprintf(String,"Software\\N64 Emulation\\%s\\Logging",g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
|
|
||||||
lResult = RegCreateKeyEx( HKEY_CURRENT_USER,String,0,"", REG_OPTION_NON_VOLATILE,
|
|
||||||
KEY_ALL_ACCESS,NULL,&hKeyResults,&Disposition);
|
|
||||||
|
|
||||||
SaveLogSetting(hKeyResults,"Log RDRAM",TempOptions.LogRDRamRegisters);
|
|
||||||
SaveLogSetting(hKeyResults,"Log SP",TempOptions.LogSPRegisters);
|
|
||||||
SaveLogSetting(hKeyResults,"Log DP Command",TempOptions.LogDPCRegisters);
|
|
||||||
SaveLogSetting(hKeyResults,"Log DP Span",TempOptions.LogDPSRegisters);
|
|
||||||
SaveLogSetting(hKeyResults,"Log MIPS Interface (MI)",TempOptions.LogMIPSInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Video Interface (VI)",TempOptions.LogVideoInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Audio Interface (AI)",TempOptions.LogAudioInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Peripheral Interface (PI)",TempOptions.LogPerInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log RDRAM Interface (RI)",TempOptions.LogRDRAMInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Serial Interface (SI)",TempOptions.LogSerialInterface);
|
|
||||||
SaveLogSetting(hKeyResults,"Log PifRam DMA Operations",TempOptions.LogPRDMAOperations);
|
|
||||||
SaveLogSetting(hKeyResults,"Log PifRam Direct Memory Loads",TempOptions.LogPRDirectMemLoads);
|
|
||||||
SaveLogSetting(hKeyResults,"Log PifRam DMA Memory Loads",TempOptions.LogPRDMAMemLoads);
|
|
||||||
SaveLogSetting(hKeyResults,"Log PifRam Direct Memory Stores",TempOptions.LogPRDirectMemStores);
|
|
||||||
SaveLogSetting(hKeyResults,"Log PifRam DMA Memory Stores",TempOptions.LogPRDMAMemStores);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Controller Pak",TempOptions.LogControllerPak);
|
|
||||||
SaveLogSetting(hKeyResults,"Log CP0 changes",TempOptions.LogCP0changes);
|
|
||||||
SaveLogSetting(hKeyResults,"Log CP0 reads",TempOptions.LogCP0reads);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Exceptions",TempOptions.LogExceptions);
|
|
||||||
SaveLogSetting(hKeyResults,"No Interrupts",TempOptions.NoInterrupts);
|
|
||||||
SaveLogSetting(hKeyResults,"Log TLB",TempOptions.LogTLB);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Cache Operations",TempOptions.LogCache);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Rom Header",TempOptions.LogRomHeader);
|
|
||||||
SaveLogSetting(hKeyResults,"Log Unknown access",TempOptions.LogUnknown);
|
|
||||||
|
|
||||||
RegCloseKey(hKeyResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LogMessage (const char * Message, ...)
|
|
||||||
{
|
|
||||||
DWORD dwWritten;
|
|
||||||
char Msg[400];
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
if (!g_Settings->LoadBool(Debugger_Enabled))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (g_hLogFile == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start( ap, Message );
|
|
||||||
vsprintf( Msg, Message, ap );
|
|
||||||
va_end( ap );
|
|
||||||
|
|
||||||
strcat(Msg,"\r\n");
|
|
||||||
|
|
||||||
WriteFile( g_hLogFile,Msg,strlen(Msg),&dwWritten,NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartLog (void)
|
|
||||||
{
|
|
||||||
if (!g_LogOptions.GenerateLog)
|
|
||||||
{
|
|
||||||
StopLog();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (g_hLogFile)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CPath LogFile(CPath::MODULE_DIRECTORY);
|
|
||||||
LogFile.AppendDirectory("Logs");
|
|
||||||
LogFile.SetNameExtension("cpudebug.log");
|
|
||||||
|
|
||||||
g_hLogFile = CreateFile(LogFile,GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
|
||||||
SetFilePointer(g_hLogFile,0,NULL,FILE_BEGIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void StopLog (void)
|
|
||||||
{
|
|
||||||
if (g_hLogFile)
|
|
||||||
{
|
|
||||||
CloseHandle(g_hLogFile);
|
|
||||||
}
|
|
||||||
g_hLogFile = NULL;
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,48 +9,20 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Project64\Settings\Logging Settings.h>
|
||||||
|
#include <Common\File Class.h>
|
||||||
|
|
||||||
typedef struct
|
class CLogging :
|
||||||
|
public CLogSettings
|
||||||
{
|
{
|
||||||
bool GenerateLog;
|
public:
|
||||||
|
static void StartLog(void);
|
||||||
|
static void StopLog(void);
|
||||||
|
|
||||||
/* Registers Log */
|
static void Log_LW(uint32_t PC, uint32_t VAddr);
|
||||||
bool LogRDRamRegisters;
|
static void Log_SW(uint32_t PC, uint32_t VAddr, uint32_t Value);
|
||||||
bool LogSPRegisters;
|
static void LogMessage(const char * Message, ...);
|
||||||
bool LogDPCRegisters;
|
|
||||||
bool LogDPSRegisters;
|
|
||||||
bool LogMIPSInterface;
|
|
||||||
bool LogVideoInterface;
|
|
||||||
bool LogAudioInterface;
|
|
||||||
bool LogPerInterface;
|
|
||||||
bool LogRDRAMInterface;
|
|
||||||
bool LogSerialInterface;
|
|
||||||
|
|
||||||
/* Pif Ram Log */
|
private:
|
||||||
bool LogPRDMAOperations;
|
static CFile * m_hLogFile;
|
||||||
bool LogPRDirectMemLoads;
|
};
|
||||||
bool LogPRDMAMemLoads;
|
|
||||||
bool LogPRDirectMemStores;
|
|
||||||
bool LogPRDMAMemStores;
|
|
||||||
bool LogControllerPak;
|
|
||||||
|
|
||||||
/* Special Log */
|
|
||||||
bool LogCP0changes;
|
|
||||||
bool LogCP0reads;
|
|
||||||
bool LogTLB;
|
|
||||||
bool LogExceptions;
|
|
||||||
bool NoInterrupts;
|
|
||||||
bool LogCache;
|
|
||||||
bool LogRomHeader;
|
|
||||||
bool LogUnknown;
|
|
||||||
} LOG_OPTIONS;
|
|
||||||
|
|
||||||
extern LOG_OPTIONS g_LogOptions;
|
|
||||||
|
|
||||||
void EnterLogOptions ( HWND hwndOwner );
|
|
||||||
void StartLog ( void );
|
|
||||||
void StopLog ( void );
|
|
||||||
void LoadLogOptions ( LOG_OPTIONS * LogOptions, bool AlwaysFill );
|
|
||||||
void Log_LW ( uint32_t PC, uint32_t VAddr );
|
|
||||||
void Log_SW ( uint32_t PC, uint32_t VAddr, uint32_t Value );
|
|
||||||
void LogMessage ( const char * Message, ... );
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -13,32 +13,32 @@
|
||||||
enum LanguageStringID{
|
enum LanguageStringID{
|
||||||
EMPTY_STRING = 0,
|
EMPTY_STRING = 0,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Meta Information *
|
* Meta Information *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//About DLL
|
//About DLL
|
||||||
LANGUAGE_NAME = 1,
|
LANGUAGE_NAME = 1,
|
||||||
LANGUAGE_AUTHOR =2,
|
LANGUAGE_AUTHOR = 2,
|
||||||
LANGUAGE_VERSION =3,
|
LANGUAGE_VERSION = 3,
|
||||||
LANGUAGE_DATE =4,
|
LANGUAGE_DATE = 4,
|
||||||
|
|
||||||
//About DLL Dialog
|
//About DLL Dialog
|
||||||
INI_CURRENT_LANG =5,
|
INI_CURRENT_LANG = 5,
|
||||||
INI_AUTHOR =6,
|
INI_AUTHOR = 6,
|
||||||
INI_VERSION =7,
|
INI_VERSION = 7,
|
||||||
INI_DATE =8,
|
INI_DATE = 8,
|
||||||
INI_HOMEPAGE =9,
|
INI_HOMEPAGE = 9,
|
||||||
INI_CURRENT_RDB =10,
|
INI_CURRENT_RDB = 10,
|
||||||
INI_CURRENT_CHT =11,
|
INI_CURRENT_CHT = 11,
|
||||||
INI_CURRENT_RDX =12,
|
INI_CURRENT_RDX = 12,
|
||||||
|
|
||||||
//About INI title
|
//About INI title
|
||||||
INI_TITLE =20,
|
INI_TITLE = 20,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Numbers *
|
* Numbers *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
NUMBER_0 =50,
|
NUMBER_0 = 50,
|
||||||
NUMBER_1 = 51,
|
NUMBER_1 = 51,
|
||||||
NUMBER_2 = 52,
|
NUMBER_2 = 52,
|
||||||
NUMBER_3 = 53,
|
NUMBER_3 = 53,
|
||||||
|
@ -49,63 +49,63 @@ enum LanguageStringID{
|
||||||
NUMBER_8 = 58,
|
NUMBER_8 = 58,
|
||||||
NUMBER_9 = 59,
|
NUMBER_9 = 59,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Menu *
|
* Menu *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//File Menu
|
//File Menu
|
||||||
MENU_FILE =100,
|
MENU_FILE = 100,
|
||||||
MENU_OPEN =101,
|
MENU_OPEN = 101,
|
||||||
MENU_ROM_INFO =102,
|
MENU_ROM_INFO = 102,
|
||||||
MENU_START =103,
|
MENU_START = 103,
|
||||||
MENU_END =104,
|
MENU_END = 104,
|
||||||
MENU_CHOOSE_ROM =105,
|
MENU_CHOOSE_ROM = 105,
|
||||||
MENU_REFRESH =106,
|
MENU_REFRESH = 106,
|
||||||
MENU_RECENT_ROM =107,
|
MENU_RECENT_ROM = 107,
|
||||||
MENU_RECENT_DIR =108,
|
MENU_RECENT_DIR = 108,
|
||||||
MENU_EXIT =109,
|
MENU_EXIT = 109,
|
||||||
|
|
||||||
//System Menu
|
//System Menu
|
||||||
MENU_SYSTEM =120,
|
MENU_SYSTEM = 120,
|
||||||
MENU_RESET =121,
|
MENU_RESET = 121,
|
||||||
MENU_PAUSE =122,
|
MENU_PAUSE = 122,
|
||||||
MENU_BITMAP =123,
|
MENU_BITMAP = 123,
|
||||||
MENU_LIMIT_FPS =124,
|
MENU_LIMIT_FPS = 124,
|
||||||
MENU_SAVE =125,
|
MENU_SAVE = 125,
|
||||||
MENU_SAVE_AS =126,
|
MENU_SAVE_AS = 126,
|
||||||
MENU_RESTORE =127,
|
MENU_RESTORE = 127,
|
||||||
MENU_LOAD =128,
|
MENU_LOAD = 128,
|
||||||
MENU_CURRENT_SAVE =129,
|
MENU_CURRENT_SAVE = 129,
|
||||||
MENU_CHEAT =130,
|
MENU_CHEAT = 130,
|
||||||
MENU_GS_BUTTON =131,
|
MENU_GS_BUTTON = 131,
|
||||||
MENU_RESUME =132,
|
MENU_RESUME = 132,
|
||||||
MENU_RESET_SOFT =133, //added in build 1.7.50
|
MENU_RESET_SOFT = 133, //added in build 1.7.50
|
||||||
MENU_RESET_HARD =134, //added in build 1.7.50
|
MENU_RESET_HARD = 134, //added in build 1.7.50
|
||||||
|
|
||||||
//Options Menu
|
//Options Menu
|
||||||
MENU_OPTIONS = 140,
|
MENU_OPTIONS = 140,
|
||||||
MENU_FULL_SCREEN= 141,
|
MENU_FULL_SCREEN = 141,
|
||||||
MENU_ON_TOP = 142,
|
MENU_ON_TOP = 142,
|
||||||
MENU_CONFG_GFX = 143,
|
MENU_CONFG_GFX = 143,
|
||||||
MENU_CONFG_AUDIO= 144,
|
MENU_CONFG_AUDIO = 144,
|
||||||
MENU_CONFG_CTRL = 145,
|
MENU_CONFG_CTRL = 145,
|
||||||
MENU_CONFG_RSP = 146,
|
MENU_CONFG_RSP = 146,
|
||||||
MENU_SHOW_CPU = 147,
|
MENU_SHOW_CPU = 147,
|
||||||
MENU_SETTINGS = 148,
|
MENU_SETTINGS = 148,
|
||||||
|
|
||||||
//Debugger Menu
|
//Debugger Menu
|
||||||
MENU_DEBUGGER = 160,
|
MENU_DEBUGGER = 160,
|
||||||
|
|
||||||
//Language Menu
|
//Language Menu
|
||||||
MENU_LANGUAGE = 175,
|
MENU_LANGUAGE = 175,
|
||||||
|
|
||||||
//Help Menu
|
//Help Menu
|
||||||
MENU_HELP = 180,
|
MENU_HELP = 180,
|
||||||
MENU_ABOUT_INI = 181,
|
MENU_ABOUT_INI = 181,
|
||||||
MENU_ABOUT_PJ64 = 182,
|
MENU_ABOUT_PJ64 = 182,
|
||||||
MENU_FORUM = 183,
|
MENU_FORUM = 183,
|
||||||
MENU_HOMEPAGE = 184,
|
MENU_HOMEPAGE = 184,
|
||||||
|
|
||||||
//Current Save Slot menu
|
//Current Save Slot menu
|
||||||
MENU_SLOT_DEFAULT = 190,
|
MENU_SLOT_DEFAULT = 190,
|
||||||
MENU_SLOT_1 = 191,
|
MENU_SLOT_1 = 191,
|
||||||
MENU_SLOT_2 = 192,
|
MENU_SLOT_2 = 192,
|
||||||
|
@ -117,15 +117,16 @@ enum LanguageStringID{
|
||||||
MENU_SLOT_8 = 198,
|
MENU_SLOT_8 = 198,
|
||||||
MENU_SLOT_9 = 199,
|
MENU_SLOT_9 = 199,
|
||||||
MENU_SLOT_10 = 200,
|
MENU_SLOT_10 = 200,
|
||||||
|
MENU_SLOT_SAVE = 201,
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
POPUP_PLAY = 210,
|
POPUP_PLAY = 210,
|
||||||
POPUP_INFO = 211,
|
POPUP_INFO = 211,
|
||||||
POPUP_SETTINGS = 212,
|
POPUP_SETTINGS = 212,
|
||||||
POPUP_CHEATS = 213,
|
POPUP_CHEATS = 213,
|
||||||
POPUP_GFX_PLUGIN = 214,
|
POPUP_GFX_PLUGIN = 214,
|
||||||
|
|
||||||
//selecting save slot
|
//selecting save slot
|
||||||
SAVE_SLOT_DEFAULT = 220,
|
SAVE_SLOT_DEFAULT = 220,
|
||||||
SAVE_SLOT_1 = 221,
|
SAVE_SLOT_1 = 221,
|
||||||
SAVE_SLOT_2 = 222,
|
SAVE_SLOT_2 = 222,
|
||||||
|
@ -138,7 +139,7 @@ enum LanguageStringID{
|
||||||
SAVE_SLOT_9 = 229,
|
SAVE_SLOT_9 = 229,
|
||||||
SAVE_SLOT_10 = 230,
|
SAVE_SLOT_10 = 230,
|
||||||
|
|
||||||
// Menu Descriptions (TODO: unused ? implement or remove)
|
// Menu Descriptions (TODO: unused ? implement or remove)
|
||||||
MENUDES_OPEN = 250,
|
MENUDES_OPEN = 250,
|
||||||
MENUDES_ROM_INFO = 251,
|
MENUDES_ROM_INFO = 251,
|
||||||
MENUDES_START = 252,
|
MENUDES_START = 252,
|
||||||
|
@ -174,13 +175,13 @@ enum LanguageStringID{
|
||||||
MENUDES_GAME_SLOT = 282,
|
MENUDES_GAME_SLOT = 282,
|
||||||
MENUDES_PLAY_GAME = 283,
|
MENUDES_PLAY_GAME = 283,
|
||||||
MENUDES_GAME_INFO = 284,
|
MENUDES_GAME_INFO = 284,
|
||||||
MENUDES_GAME_SETTINGS= 285,
|
MENUDES_GAME_SETTINGS = 285,
|
||||||
MENUDES_GAME_CHEATS = 286,
|
MENUDES_GAME_CHEATS = 286,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Rom Browser *
|
* Rom Browser *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Rom Browser Fields
|
//Rom Browser Fields
|
||||||
RB_FILENAME = 300,
|
RB_FILENAME = 300,
|
||||||
RB_INTERNALNAME = 301,
|
RB_INTERNALNAME = 301,
|
||||||
RB_GOODNAME = 302,
|
RB_GOODNAME = 302,
|
||||||
|
@ -202,32 +203,32 @@ enum LanguageStringID{
|
||||||
RB_FORCE_FEEDBACK = 318,
|
RB_FORCE_FEEDBACK = 318,
|
||||||
RB_FILE_FORMAT = 319,
|
RB_FILE_FORMAT = 319,
|
||||||
|
|
||||||
//Select Rom
|
//Select Rom
|
||||||
SELECT_ROM_DIR = 320,
|
SELECT_ROM_DIR = 320,
|
||||||
|
|
||||||
//Messages
|
//Messages
|
||||||
RB_NOT_GOOD_FILE = 340,
|
RB_NOT_GOOD_FILE = 340,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Options *
|
* Options *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Options Title
|
//Options Title
|
||||||
OPTIONS_TITLE = 400,
|
OPTIONS_TITLE = 400,
|
||||||
|
|
||||||
//Tabs
|
//Tabs
|
||||||
TAB_PLUGIN = 401,
|
TAB_PLUGIN = 401,
|
||||||
TAB_DIRECTORY = 402,
|
TAB_DIRECTORY = 402,
|
||||||
TAB_OPTIONS = 403,
|
TAB_OPTIONS = 403,
|
||||||
TAB_ROMSELECTION = 404,
|
TAB_ROMSELECTION = 404,
|
||||||
TAB_ADVANCED = 405,
|
TAB_ADVANCED = 405,
|
||||||
TAB_ROMSETTINGS = 406,
|
TAB_ROMSETTINGS = 406,
|
||||||
TAB_SHELLINTERGATION= 407,
|
TAB_SHELLINTERGATION = 407,
|
||||||
TAB_ROMNOTES = 408,
|
TAB_ROMNOTES = 408,
|
||||||
TAB_SHORTCUTS = 409,
|
TAB_SHORTCUTS = 409,
|
||||||
TAB_ROMSTATUS = 410,
|
TAB_ROMSTATUS = 410,
|
||||||
TAB_RECOMPILER = 411, //Added in 1.7.0.50
|
TAB_RECOMPILER = 411, //Added in 1.7.0.50
|
||||||
|
|
||||||
//Plugin Dialog
|
//Plugin Dialog
|
||||||
PLUG_ABOUT = 420,
|
PLUG_ABOUT = 420,
|
||||||
PLUG_RSP = 421,
|
PLUG_RSP = 421,
|
||||||
PLUG_GFX = 422,
|
PLUG_GFX = 422,
|
||||||
|
@ -237,7 +238,7 @@ enum LanguageStringID{
|
||||||
PLUG_HLE_AUDIO = 426,
|
PLUG_HLE_AUDIO = 426,
|
||||||
PLUG_DEFAULT = 427,
|
PLUG_DEFAULT = 427,
|
||||||
|
|
||||||
//Directory Dialog
|
//Directory Dialog
|
||||||
DIR_PLUGIN = 440,
|
DIR_PLUGIN = 440,
|
||||||
DIR_ROM = 441,
|
DIR_ROM = 441,
|
||||||
DIR_AUTO_SAVE = 442,
|
DIR_AUTO_SAVE = 442,
|
||||||
|
@ -252,17 +253,17 @@ enum LanguageStringID{
|
||||||
DIR_TEXTURE = 451,
|
DIR_TEXTURE = 451,
|
||||||
DIR_SELECT_TEXTURE = 452,
|
DIR_SELECT_TEXTURE = 452,
|
||||||
|
|
||||||
//Options (general) Tab
|
//Options (general) Tab
|
||||||
OPTION_AUTO_SLEEP =460,
|
OPTION_AUTO_SLEEP = 460,
|
||||||
OPTION_AUTO_FULLSCREEN =461,
|
OPTION_AUTO_FULLSCREEN = 461,
|
||||||
OPTION_BASIC_MODE =462,
|
OPTION_BASIC_MODE = 462,
|
||||||
OPTION_REMEMBER_CHEAT =463,
|
OPTION_REMEMBER_CHEAT = 463,
|
||||||
OPTION_DISABLE_SS =464,
|
OPTION_DISABLE_SS = 464,
|
||||||
OPTION_DISPLAY_FR =465,
|
OPTION_DISPLAY_FR = 465,
|
||||||
OPTION_CHANGE_FR =466,
|
OPTION_CHANGE_FR = 466,
|
||||||
OPTION_CHECK_RUNNING =467,
|
OPTION_CHECK_RUNNING = 467,
|
||||||
|
|
||||||
//Rom Browser Tab
|
//Rom Browser Tab
|
||||||
RB_MAX_ROMS = 480,
|
RB_MAX_ROMS = 480,
|
||||||
RB_ROMS = 481,
|
RB_ROMS = 481,
|
||||||
RB_MAX_DIRS = 482,
|
RB_MAX_DIRS = 482,
|
||||||
|
@ -277,7 +278,7 @@ enum LanguageStringID{
|
||||||
RB_DOWN = 491,
|
RB_DOWN = 491,
|
||||||
RB_REFRESH = 492,
|
RB_REFRESH = 492,
|
||||||
|
|
||||||
//Advanced Options
|
//Advanced Options
|
||||||
ADVANCE_INFO = 500,
|
ADVANCE_INFO = 500,
|
||||||
ADVANCE_DEFAULTS = 501,
|
ADVANCE_DEFAULTS = 501,
|
||||||
ADVANCE_CPU_STYLE = 502,
|
ADVANCE_CPU_STYLE = 502,
|
||||||
|
@ -290,11 +291,11 @@ enum LanguageStringID{
|
||||||
ADVANCE_DEBUGGER = 509,
|
ADVANCE_DEBUGGER = 509,
|
||||||
ADVANCE_SMM_CACHE = 510,
|
ADVANCE_SMM_CACHE = 510,
|
||||||
ADVANCE_SMM_PIDMA = 511,
|
ADVANCE_SMM_PIDMA = 511,
|
||||||
ADVANCE_SMM_VALIDATE= 512,
|
ADVANCE_SMM_VALIDATE = 512,
|
||||||
ADVANCE_SMM_PROTECT = 513,
|
ADVANCE_SMM_PROTECT = 513,
|
||||||
ADVANCE_SMM_TLB = 514,
|
ADVANCE_SMM_TLB = 514,
|
||||||
|
|
||||||
//Rom Options
|
//Rom Options
|
||||||
ROM_CPU_STYLE = 520,
|
ROM_CPU_STYLE = 520,
|
||||||
ROM_VIREFRESH = 521,
|
ROM_VIREFRESH = 521,
|
||||||
ROM_MEM_SIZE = 522,
|
ROM_MEM_SIZE = 522,
|
||||||
|
@ -316,12 +317,12 @@ enum LanguageStringID{
|
||||||
ROM_32BIT = 538,
|
ROM_32BIT = 538,
|
||||||
ROM_DELAY_DP = 539,
|
ROM_DELAY_DP = 539,
|
||||||
|
|
||||||
//Core Styles
|
//Core Styles
|
||||||
CORE_INTERPTER = 540,
|
CORE_INTERPTER = 540,
|
||||||
CORE_RECOMPILER = 541,
|
CORE_RECOMPILER = 541,
|
||||||
CORE_SYNC = 542,
|
CORE_SYNC = 542,
|
||||||
|
|
||||||
//Self Mod Methods
|
//Self Mod Methods
|
||||||
SMCM_NONE = 560,
|
SMCM_NONE = 560,
|
||||||
SMCM_CACHE = 561,
|
SMCM_CACHE = 561,
|
||||||
SMCM_PROECTED = 562,
|
SMCM_PROECTED = 562,
|
||||||
|
@ -330,35 +331,35 @@ enum LanguageStringID{
|
||||||
SMCM_CHECK_ADV = 565,
|
SMCM_CHECK_ADV = 565,
|
||||||
SMCM_CACHE2 = 566,
|
SMCM_CACHE2 = 566,
|
||||||
|
|
||||||
//Function Lookup memthod
|
//Function Lookup memthod
|
||||||
FLM_PLOOKUP = 570,
|
FLM_PLOOKUP = 570,
|
||||||
FLM_VLOOKUP = 571,
|
FLM_VLOOKUP = 571,
|
||||||
FLM_CHANGEMEM = 572,
|
FLM_CHANGEMEM = 572,
|
||||||
|
|
||||||
//RDRAM Size
|
//RDRAM Size
|
||||||
RDRAM_4MB = 580,
|
RDRAM_4MB = 580,
|
||||||
RDRAM_8MB = 581,
|
RDRAM_8MB = 581,
|
||||||
|
|
||||||
//Advanced Block Linking
|
//Advanced Block Linking
|
||||||
ABL_ON = 600,
|
ABL_ON = 600,
|
||||||
ABL_OFF = 601,
|
ABL_OFF = 601,
|
||||||
|
|
||||||
//Save Type
|
//Save Type
|
||||||
SAVE_FIRST_USED = 620,
|
SAVE_FIRST_USED = 620,
|
||||||
SAVE_4K_EEPROM = 621,
|
SAVE_4K_EEPROM = 621,
|
||||||
SAVE_16K_EEPROM = 622,
|
SAVE_16K_EEPROM = 622,
|
||||||
SAVE_SRAM = 623,
|
SAVE_SRAM = 623,
|
||||||
SAVE_FLASHRAM = 624,
|
SAVE_FLASHRAM = 624,
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
SHELL_TEXT = 640,
|
SHELL_TEXT = 640,
|
||||||
|
|
||||||
//Rom Notes
|
//Rom Notes
|
||||||
NOTE_STATUS = 660,
|
NOTE_STATUS = 660,
|
||||||
NOTE_CORE = 661,
|
NOTE_CORE = 661,
|
||||||
NOTE_PLUGIN = 662,
|
NOTE_PLUGIN = 662,
|
||||||
|
|
||||||
// Accelerator Selector
|
// Accelerator Selector
|
||||||
ACCEL_CPUSTATE_TITLE = 680,
|
ACCEL_CPUSTATE_TITLE = 680,
|
||||||
ACCEL_MENUITEM_TITLE = 681,
|
ACCEL_MENUITEM_TITLE = 681,
|
||||||
ACCEL_CURRENTKEYS_TITLE = 682,
|
ACCEL_CURRENTKEYS_TITLE = 682,
|
||||||
|
@ -373,90 +374,90 @@ enum LanguageStringID{
|
||||||
ACCEL_CPUSTATE_4 = 691,
|
ACCEL_CPUSTATE_4 = 691,
|
||||||
ACCEL_DETECTKEY = 692,
|
ACCEL_DETECTKEY = 692,
|
||||||
|
|
||||||
// Frame Rate Option
|
// Frame Rate Option
|
||||||
STR_FR_VIS = 700,
|
STR_FR_VIS = 700,
|
||||||
STR_FR_DLS = 701,
|
STR_FR_DLS = 701,
|
||||||
STR_FR_PERCENT = 702,
|
STR_FR_PERCENT = 702,
|
||||||
|
|
||||||
// Increase speed
|
// Increase speed
|
||||||
STR_INSREASE_SPEED = 710,
|
STR_INSREASE_SPEED = 710,
|
||||||
STR_DECREASE_SPEED = 711,
|
STR_DECREASE_SPEED = 711,
|
||||||
|
|
||||||
//Bottom page buttons
|
//Bottom page buttons
|
||||||
BOTTOM_RESET_PAGE = 720,
|
BOTTOM_RESET_PAGE = 720,
|
||||||
BOTTOM_RESET_ALL = 721,
|
BOTTOM_RESET_ALL = 721,
|
||||||
BOTTOM_APPLY = 722,
|
BOTTOM_APPLY = 722,
|
||||||
BOTTOM_CLOSE = 723,
|
BOTTOM_CLOSE = 723,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* ROM Information *
|
* ROM Information *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Rom Info Title Title
|
//Rom Info Title Title
|
||||||
INFO_TITLE = 800,
|
INFO_TITLE = 800,
|
||||||
|
|
||||||
//Rom Info Text
|
//Rom Info Text
|
||||||
INFO_ROM_NAME_TEXT = 801,
|
INFO_ROM_NAME_TEXT = 801,
|
||||||
INFO_FILE_NAME_TEXT = 802,
|
INFO_FILE_NAME_TEXT = 802,
|
||||||
INFO_LOCATION_TEXT = 803,
|
INFO_LOCATION_TEXT = 803,
|
||||||
INFO_SIZE_TEXT = 804,
|
INFO_SIZE_TEXT = 804,
|
||||||
INFO_CART_ID_TEXT = 805,
|
INFO_CART_ID_TEXT = 805,
|
||||||
INFO_MANUFACTURER_TEXT= 806,
|
INFO_MANUFACTURER_TEXT = 806,
|
||||||
INFO_COUNTRY_TEXT = 807,
|
INFO_COUNTRY_TEXT = 807,
|
||||||
INFO_CRC1_TEXT = 808,
|
INFO_CRC1_TEXT = 808,
|
||||||
INFO_CRC2_TEXT = 809,
|
INFO_CRC2_TEXT = 809,
|
||||||
INFO_CIC_CHIP_TEXT = 810,
|
INFO_CIC_CHIP_TEXT = 810,
|
||||||
INFO_MD5_TEXT = 811,
|
INFO_MD5_TEXT = 811,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Cheats *
|
* Cheats *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Cheat List
|
//Cheat List
|
||||||
CHEAT_TITLE = 1000,
|
CHEAT_TITLE = 1000,
|
||||||
CHEAT_LIST_FRAME = 1001,
|
CHEAT_LIST_FRAME = 1001,
|
||||||
CHEAT_NOTES_FRAME = 1002,
|
CHEAT_NOTES_FRAME = 1002,
|
||||||
CHEAT_MARK_ALL = 1003,
|
CHEAT_MARK_ALL = 1003,
|
||||||
CHEAT_MARK_NONE = 1004,
|
CHEAT_MARK_NONE = 1004,
|
||||||
|
|
||||||
//Add Cheat
|
//Add Cheat
|
||||||
CHEAT_ADDCHEAT_FRAME =1005,
|
CHEAT_ADDCHEAT_FRAME = 1005,
|
||||||
CHEAT_ADDCHEAT_NAME =1006,
|
CHEAT_ADDCHEAT_NAME = 1006,
|
||||||
CHEAT_ADDCHEAT_CODE = 1007,
|
CHEAT_ADDCHEAT_CODE = 1007,
|
||||||
CHEAT_ADDCHEAT_INSERT= 1008,
|
CHEAT_ADDCHEAT_INSERT = 1008,
|
||||||
CHEAT_ADDCHEAT_CLEAR= 1009,
|
CHEAT_ADDCHEAT_CLEAR = 1009,
|
||||||
CHEAT_ADDCHEAT_NOTES= 1010,
|
CHEAT_ADDCHEAT_NOTES = 1010,
|
||||||
CHEAT_ADD_TO_DB = 1011,
|
CHEAT_ADD_TO_DB = 1011,
|
||||||
|
|
||||||
//Code extension
|
//Code extension
|
||||||
CHEAT_CODE_EXT_TITLE =1012,
|
CHEAT_CODE_EXT_TITLE = 1012,
|
||||||
CHEAT_CODE_EXT_TXT =1013,
|
CHEAT_CODE_EXT_TXT = 1013,
|
||||||
CHEAT_OK =1014,
|
CHEAT_OK = 1014,
|
||||||
CHEAT_CANCEL =1015,
|
CHEAT_CANCEL = 1015,
|
||||||
|
|
||||||
//Digital Value
|
//Digital Value
|
||||||
CHEAT_QUANTITY_TITLE =1016,
|
CHEAT_QUANTITY_TITLE = 1016,
|
||||||
CHEAT_CHOOSE_VALUE =1017,
|
CHEAT_CHOOSE_VALUE = 1017,
|
||||||
CHEAT_VALUE =1018,
|
CHEAT_VALUE = 1018,
|
||||||
CHEAT_FROM =1019,
|
CHEAT_FROM = 1019,
|
||||||
CHEAT_TO =1020,
|
CHEAT_TO = 1020,
|
||||||
CHEAT_NOTES =1021,
|
CHEAT_NOTES = 1021,
|
||||||
CHEAT_ADDCHEAT_ADD = 1022,
|
CHEAT_ADDCHEAT_ADD = 1022,
|
||||||
CHEAT_ADDCHEAT_NEW = 1023,
|
CHEAT_ADDCHEAT_NEW = 1023,
|
||||||
CHEAT_ADDCHEAT_CODEDES =1024,
|
CHEAT_ADDCHEAT_CODEDES = 1024,
|
||||||
CHEAT_ADDCHEAT_OPT =1025,
|
CHEAT_ADDCHEAT_OPT = 1025,
|
||||||
CHEAT_ADDCHEAT_OPTDES =1026,
|
CHEAT_ADDCHEAT_OPTDES = 1026,
|
||||||
|
|
||||||
//Edit Cheat
|
//Edit Cheat
|
||||||
CHEAT_EDITCHEAT_WINDOW =1027,
|
CHEAT_EDITCHEAT_WINDOW = 1027,
|
||||||
CHEAT_EDITCHEAT_UPDATE =1028,
|
CHEAT_EDITCHEAT_UPDATE = 1028,
|
||||||
CHEAT_CHANGED_MSG =1029,
|
CHEAT_CHANGED_MSG = 1029,
|
||||||
CHEAT_CHANGED_TITLE =1030,
|
CHEAT_CHANGED_TITLE = 1030,
|
||||||
|
|
||||||
//Cheat Popup Menu
|
//Cheat Popup Menu
|
||||||
CHEAT_ADDNEW =1040,
|
CHEAT_ADDNEW = 1040,
|
||||||
CHEAT_EDIT = 1041,
|
CHEAT_EDIT = 1041,
|
||||||
CHEAT_DELETE = 1042,
|
CHEAT_DELETE = 1042,
|
||||||
|
|
||||||
// short cut editor
|
// short cut editor
|
||||||
STR_SHORTCUT_RESET_TITLE = 1100,
|
STR_SHORTCUT_RESET_TITLE = 1100,
|
||||||
STR_SHORTCUT_RESET_TEXT = 1101,
|
STR_SHORTCUT_RESET_TEXT = 1101,
|
||||||
STR_SHORTCUT_FILEMENU = 1102,
|
STR_SHORTCUT_FILEMENU = 1102,
|
||||||
|
@ -464,9 +465,9 @@ enum LanguageStringID{
|
||||||
STR_SHORTCUT_OPTIONS = 1104,
|
STR_SHORTCUT_OPTIONS = 1104,
|
||||||
STR_SHORTCUT_SAVESLOT = 1105,
|
STR_SHORTCUT_SAVESLOT = 1105,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Messages *
|
* Messages *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
MSG_CPU_PAUSED = 2000,
|
MSG_CPU_PAUSED = 2000,
|
||||||
MSG_CPU_RESUMED = 2001,
|
MSG_CPU_RESUMED = 2001,
|
||||||
MSG_PERM_LOOP = 2002,
|
MSG_PERM_LOOP = 2002,
|
||||||
|
@ -487,23 +488,23 @@ enum LanguageStringID{
|
||||||
MSG_FAIL_IMAGE = 2017,
|
MSG_FAIL_IMAGE = 2017,
|
||||||
MSG_UNKNOWN_COUNTRY = 2018,
|
MSG_UNKNOWN_COUNTRY = 2018,
|
||||||
MSG_UNKNOWN_CIC_CHIP = 2019,
|
MSG_UNKNOWN_CIC_CHIP = 2019,
|
||||||
MSG_UNKNOWN_FILE_FORMAT= 2020,
|
MSG_UNKNOWN_FILE_FORMAT = 2020,
|
||||||
MSG_UNKNOWN_MEM_ACTION = 2021,
|
MSG_UNKNOWN_MEM_ACTION = 2021,
|
||||||
MSG_UNHANDLED_OP = 2022,
|
MSG_UNHANDLED_OP = 2022,
|
||||||
MSG_NONMAPPED_SPACE = 2023,
|
MSG_NONMAPPED_SPACE = 2023,
|
||||||
MSG_SAVE_STATE_HEADER = 2024,
|
MSG_SAVE_STATE_HEADER = 2024,
|
||||||
MSG_MSGBOX_TITLE =2025,
|
MSG_MSGBOX_TITLE = 2025,
|
||||||
MSG_PIF2_ERROR = 2026,
|
MSG_PIF2_ERROR = 2026,
|
||||||
MSG_PIF2_TITLE = 2027,
|
MSG_PIF2_TITLE = 2027,
|
||||||
MSG_PLUGIN_CHANGE = 2028,
|
MSG_PLUGIN_CHANGE = 2028,
|
||||||
MSG_PLUGIN_CHANGE_TITLE= 2029,
|
MSG_PLUGIN_CHANGE_TITLE = 2029,
|
||||||
MSG_EMULATION_ENDED = 2030,
|
MSG_EMULATION_ENDED = 2030,
|
||||||
MSG_EMULATION_STARTED = 2031,
|
MSG_EMULATION_STARTED = 2031,
|
||||||
MSG_UNABLED_LOAD_STATE = 2032,
|
MSG_UNABLED_LOAD_STATE = 2032,
|
||||||
MSG_LOADED_STATE = 2033,
|
MSG_LOADED_STATE = 2033,
|
||||||
MSG_SAVED_STATE = 2034,
|
MSG_SAVED_STATE = 2034,
|
||||||
MSG_SAVE_SLOT = 2035,
|
MSG_SAVE_SLOT = 2035,
|
||||||
MSG_BYTESWAP =2036,
|
MSG_BYTESWAP = 2036,
|
||||||
MSG_CHOOSE_IMAGE = 2037,
|
MSG_CHOOSE_IMAGE = 2037,
|
||||||
MSG_LOADED = 2038,
|
MSG_LOADED = 2038,
|
||||||
MSG_LOADING = 2039,
|
MSG_LOADING = 2039,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -14,182 +14,183 @@
|
||||||
|
|
||||||
CLanguage * g_Lang = NULL;
|
CLanguage * g_Lang = NULL;
|
||||||
|
|
||||||
void CLanguage::LoadDefaultStrings (void)
|
void CLanguage::LoadDefaultStrings(void)
|
||||||
{
|
{
|
||||||
#define DEF_STR(ID,str) m_DefaultStrings.insert(LANG_STRINGS::value_type(ID,str))
|
#define DEF_STR(ID,str) m_DefaultStrings.insert(LANG_STRINGS::value_type(ID,str))
|
||||||
|
|
||||||
DEF_STR(EMPTY_STRING, L"" );
|
DEF_STR(EMPTY_STRING, L"");
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Meta Information *
|
* Meta Information *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//About DLL
|
//About DLL
|
||||||
DEF_STR(LANGUAGE_NAME, L"" );
|
DEF_STR(LANGUAGE_NAME, L"");
|
||||||
DEF_STR(LANGUAGE_AUTHOR, L"" );
|
DEF_STR(LANGUAGE_AUTHOR, L"");
|
||||||
DEF_STR(LANGUAGE_VERSION, L"" );
|
DEF_STR(LANGUAGE_VERSION, L"");
|
||||||
DEF_STR(LANGUAGE_DATE, L"" );
|
DEF_STR(LANGUAGE_DATE, L"");
|
||||||
|
|
||||||
//About DLL Dialog
|
//About DLL Dialog
|
||||||
DEF_STR(INI_CURRENT_LANG, L"Current Language" );
|
DEF_STR(INI_CURRENT_LANG, L"Current Language");
|
||||||
DEF_STR(INI_AUTHOR, L"Author" );
|
DEF_STR(INI_AUTHOR, L"Author");
|
||||||
DEF_STR(INI_VERSION, L"Version" );
|
DEF_STR(INI_VERSION, L"Version");
|
||||||
DEF_STR(INI_DATE, L"Date" );
|
DEF_STR(INI_DATE, L"Date");
|
||||||
DEF_STR(INI_HOMEPAGE, L"Visit Home Page" );
|
DEF_STR(INI_HOMEPAGE, L"Visit Home Page");
|
||||||
DEF_STR(INI_CURRENT_RDB, L"ROM Database (.RDB)" );
|
DEF_STR(INI_CURRENT_RDB, L"ROM Database (.RDB)");
|
||||||
DEF_STR(INI_CURRENT_CHT, L"Cheat Code File (.CHT)" );
|
DEF_STR(INI_CURRENT_CHT, L"Cheat Code File (.CHT)");
|
||||||
DEF_STR(INI_CURRENT_RDX, L"Extended ROM Info (.RDX)");
|
DEF_STR(INI_CURRENT_RDX, L"Extended ROM Info (.RDX)");
|
||||||
|
|
||||||
//About INI title
|
//About INI title
|
||||||
DEF_STR(INI_TITLE, L"About Config Files" );
|
DEF_STR(INI_TITLE, L"About Config Files");
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Numbers *
|
* Numbers *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
DEF_STR(NUMBER_0, L"0" );
|
DEF_STR(NUMBER_0, L"0");
|
||||||
DEF_STR(NUMBER_1, L"1" );
|
DEF_STR(NUMBER_1, L"1");
|
||||||
DEF_STR(NUMBER_2, L"2" );
|
DEF_STR(NUMBER_2, L"2");
|
||||||
DEF_STR(NUMBER_3, L"3" );
|
DEF_STR(NUMBER_3, L"3");
|
||||||
DEF_STR(NUMBER_4, L"4" ),
|
DEF_STR(NUMBER_4, L"4"),
|
||||||
DEF_STR(NUMBER_5, L"5" );
|
DEF_STR(NUMBER_5, L"5");
|
||||||
DEF_STR(NUMBER_6, L"6" );
|
DEF_STR(NUMBER_6, L"6");
|
||||||
DEF_STR(NUMBER_7, L"7" );
|
DEF_STR(NUMBER_7, L"7");
|
||||||
DEF_STR(NUMBER_8, L"8" );
|
DEF_STR(NUMBER_8, L"8");
|
||||||
DEF_STR(NUMBER_9, L"9" );
|
DEF_STR(NUMBER_9, L"9");
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Menu *
|
* Menu *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//File Menu
|
//File Menu
|
||||||
DEF_STR(MENU_FILE, L"&File" );
|
DEF_STR(MENU_FILE, L"&File");
|
||||||
DEF_STR(MENU_OPEN, L"&Open ROM" );
|
DEF_STR(MENU_OPEN, L"&Open ROM");
|
||||||
DEF_STR(MENU_ROM_INFO, L"ROM &Info...." );
|
DEF_STR(MENU_ROM_INFO, L"ROM &Info....");
|
||||||
DEF_STR(MENU_START, L"Start Emulation" );
|
DEF_STR(MENU_START, L"Start Emulation");
|
||||||
DEF_STR(MENU_END, L"&End Emulation" );
|
DEF_STR(MENU_END, L"&End Emulation");
|
||||||
DEF_STR(MENU_CHOOSE_ROM, L"Choose ROM Directory..." );
|
DEF_STR(MENU_CHOOSE_ROM, L"Choose ROM Directory...");
|
||||||
DEF_STR(MENU_REFRESH, L"Refresh ROM List" );
|
DEF_STR(MENU_REFRESH, L"Refresh ROM List");
|
||||||
DEF_STR(MENU_RECENT_ROM, L"Recent ROM" );
|
DEF_STR(MENU_RECENT_ROM, L"Recent ROM");
|
||||||
DEF_STR(MENU_RECENT_DIR, L"Recent ROM Directories" );
|
DEF_STR(MENU_RECENT_DIR, L"Recent ROM Directories");
|
||||||
DEF_STR(MENU_EXIT, L"E&xit" );
|
DEF_STR(MENU_EXIT, L"E&xit");
|
||||||
|
|
||||||
//System Menu
|
//System Menu
|
||||||
DEF_STR(MENU_SYSTEM, L"&System" );
|
DEF_STR(MENU_SYSTEM, L"&System");
|
||||||
DEF_STR(MENU_RESET, L"&Reset" );
|
DEF_STR(MENU_RESET, L"&Reset");
|
||||||
DEF_STR(MENU_PAUSE, L"&Pause" );
|
DEF_STR(MENU_PAUSE, L"&Pause");
|
||||||
DEF_STR(MENU_BITMAP, L"Generate Bitmap" );
|
DEF_STR(MENU_BITMAP, L"Generate Bitmap");
|
||||||
DEF_STR(MENU_LIMIT_FPS, L"Limit FPS" );
|
DEF_STR(MENU_LIMIT_FPS, L"Limit FPS");
|
||||||
DEF_STR(MENU_SAVE, L"&Save State" );
|
DEF_STR(MENU_SAVE, L"&Save State");
|
||||||
DEF_STR(MENU_SAVE_AS, L"Save As..." );
|
DEF_STR(MENU_SAVE_AS, L"Save As...");
|
||||||
DEF_STR(MENU_RESTORE, L"&Load State" );
|
DEF_STR(MENU_RESTORE, L"&Load State");
|
||||||
DEF_STR(MENU_LOAD, L"Load..." );
|
DEF_STR(MENU_LOAD, L"Load...");
|
||||||
DEF_STR(MENU_CURRENT_SAVE,L"Current Save S&tate" );
|
DEF_STR(MENU_CURRENT_SAVE, L"Current Save S&tate");
|
||||||
DEF_STR(MENU_CHEAT, L"Cheats..." );
|
DEF_STR(MENU_CHEAT, L"Cheats...");
|
||||||
DEF_STR(MENU_GS_BUTTON, L"GS Button" );
|
DEF_STR(MENU_GS_BUTTON, L"GS Button");
|
||||||
DEF_STR(MENU_RESUME, L"R&esume" );
|
DEF_STR(MENU_RESUME, L"R&esume");
|
||||||
DEF_STR(MENU_RESET_SOFT, L"&Soft Reset" );
|
DEF_STR(MENU_RESET_SOFT, L"&Soft Reset");
|
||||||
DEF_STR(MENU_RESET_HARD, L"&Hard Reset" );
|
DEF_STR(MENU_RESET_HARD, L"&Hard Reset");
|
||||||
|
|
||||||
//Options Menu
|
//Options Menu
|
||||||
DEF_STR(MENU_OPTIONS, L"&Options" );
|
DEF_STR(MENU_OPTIONS, L"&Options");
|
||||||
DEF_STR(MENU_FULL_SCREEN, L"&Full Screen" );
|
DEF_STR(MENU_FULL_SCREEN, L"&Full Screen");
|
||||||
DEF_STR(MENU_ON_TOP, L"&Always on &Top" );
|
DEF_STR(MENU_ON_TOP, L"&Always on &Top");
|
||||||
DEF_STR(MENU_CONFG_GFX, L"Configure Graphics Plugin..." );
|
DEF_STR(MENU_CONFG_GFX, L"Configure Graphics Plugin...");
|
||||||
DEF_STR(MENU_CONFG_AUDIO, L"Configure Audio Plugin..." );
|
DEF_STR(MENU_CONFG_AUDIO, L"Configure Audio Plugin...");
|
||||||
DEF_STR(MENU_CONFG_CTRL, L"Configure Controller Plugin..." );
|
DEF_STR(MENU_CONFG_CTRL, L"Configure Controller Plugin...");
|
||||||
DEF_STR(MENU_CONFG_RSP, L"Configure RSP Plugin..." );
|
DEF_STR(MENU_CONFG_RSP, L"Configure RSP Plugin...");
|
||||||
DEF_STR(MENU_SHOW_CPU, L"Show CPU Usage" );
|
DEF_STR(MENU_SHOW_CPU, L"Show CPU Usage");
|
||||||
DEF_STR(MENU_SETTINGS, L"&Settings..." );
|
DEF_STR(MENU_SETTINGS, L"&Settings...");
|
||||||
|
|
||||||
//Debugger Menu
|
//Debugger Menu
|
||||||
DEF_STR(MENU_DEBUGGER, L"&Debugger" );
|
DEF_STR(MENU_DEBUGGER, L"&Debugger");
|
||||||
|
|
||||||
//Language Menu
|
//Language Menu
|
||||||
DEF_STR(MENU_LANGUAGE, L"&Language" );
|
DEF_STR(MENU_LANGUAGE, L"&Language");
|
||||||
|
|
||||||
//Help Menu
|
//Help Menu
|
||||||
DEF_STR(MENU_HELP, L"&Help" );
|
DEF_STR(MENU_HELP, L"&Help");
|
||||||
DEF_STR(MENU_ABOUT_INI, L"About Conf&ig Files" );
|
DEF_STR(MENU_ABOUT_INI, L"About Conf&ig Files");
|
||||||
DEF_STR(MENU_ABOUT_PJ64, L"&About Project64" );
|
DEF_STR(MENU_ABOUT_PJ64, L"&About Project64");
|
||||||
DEF_STR(MENU_FORUM, L"Support &Forum" );
|
DEF_STR(MENU_FORUM, L"Support &Forum");
|
||||||
DEF_STR(MENU_HOMEPAGE, L"&Homepage" );
|
DEF_STR(MENU_HOMEPAGE, L"&Homepage");
|
||||||
|
|
||||||
//Current Save Slot menu
|
//Current Save Slot menu
|
||||||
DEF_STR(MENU_SLOT_DEFAULT,L"Default" );
|
DEF_STR(MENU_SLOT_DEFAULT, L"Default");
|
||||||
DEF_STR(MENU_SLOT_1, L"Slot 1" );
|
DEF_STR(MENU_SLOT_1, L"Slot 1");
|
||||||
DEF_STR(MENU_SLOT_2, L"Slot 2" );
|
DEF_STR(MENU_SLOT_2, L"Slot 2");
|
||||||
DEF_STR(MENU_SLOT_3, L"Slot 3" );
|
DEF_STR(MENU_SLOT_3, L"Slot 3");
|
||||||
DEF_STR(MENU_SLOT_4, L"Slot 4" );
|
DEF_STR(MENU_SLOT_4, L"Slot 4");
|
||||||
DEF_STR(MENU_SLOT_5, L"Slot 5" );
|
DEF_STR(MENU_SLOT_5, L"Slot 5");
|
||||||
DEF_STR(MENU_SLOT_6, L"Slot 6" );
|
DEF_STR(MENU_SLOT_6, L"Slot 6");
|
||||||
DEF_STR(MENU_SLOT_7, L"Slot 7" );
|
DEF_STR(MENU_SLOT_7, L"Slot 7");
|
||||||
DEF_STR(MENU_SLOT_8, L"Slot 8" );
|
DEF_STR(MENU_SLOT_8, L"Slot 8");
|
||||||
DEF_STR(MENU_SLOT_9, L"Slot 9" );
|
DEF_STR(MENU_SLOT_9, L"Slot 9");
|
||||||
DEF_STR(MENU_SLOT_10, L"Slot 10" );
|
DEF_STR(MENU_SLOT_10, L"Slot 10");
|
||||||
|
DEF_STR(MENU_SLOT_SAVE, L"Save slot (%ws) selected");
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
DEF_STR(POPUP_PLAY, L"Play Game" );
|
DEF_STR(POPUP_PLAY, L"Play Game");
|
||||||
DEF_STR(POPUP_INFO, L"ROM Information" );
|
DEF_STR(POPUP_INFO, L"ROM Information");
|
||||||
DEF_STR(POPUP_SETTINGS, L"Edit Game Settings" );
|
DEF_STR(POPUP_SETTINGS, L"Edit Game Settings");
|
||||||
DEF_STR(POPUP_CHEATS, L"Edit Cheats" );
|
DEF_STR(POPUP_CHEATS, L"Edit Cheats");
|
||||||
DEF_STR(POPUP_GFX_PLUGIN,L"Graphics Plugin" );
|
DEF_STR(POPUP_GFX_PLUGIN, L"Graphics Plugin");
|
||||||
|
|
||||||
//Alternate Name to save Slot
|
//Alternate Name to save Slot
|
||||||
DEF_STR(SAVE_SLOT_DEFAULT,L"Save Slot - Default" );
|
DEF_STR(SAVE_SLOT_DEFAULT, L"Save Slot - Default");
|
||||||
DEF_STR(SAVE_SLOT_1, L"Save Slot - 1" );
|
DEF_STR(SAVE_SLOT_1, L"Save Slot - 1");
|
||||||
DEF_STR(SAVE_SLOT_2, L"Save Slot - 2" );
|
DEF_STR(SAVE_SLOT_2, L"Save Slot - 2");
|
||||||
DEF_STR(SAVE_SLOT_3, L"Save Slot - 3" );
|
DEF_STR(SAVE_SLOT_3, L"Save Slot - 3");
|
||||||
DEF_STR(SAVE_SLOT_4, L"Save Slot - 4" );
|
DEF_STR(SAVE_SLOT_4, L"Save Slot - 4");
|
||||||
DEF_STR(SAVE_SLOT_5, L"Save Slot - 5" );
|
DEF_STR(SAVE_SLOT_5, L"Save Slot - 5");
|
||||||
DEF_STR(SAVE_SLOT_6, L"Save Slot - 6" );
|
DEF_STR(SAVE_SLOT_6, L"Save Slot - 6");
|
||||||
DEF_STR(SAVE_SLOT_7, L"Save Slot - 7" );
|
DEF_STR(SAVE_SLOT_7, L"Save Slot - 7");
|
||||||
DEF_STR(SAVE_SLOT_8, L"Save Slot - 8" );
|
DEF_STR(SAVE_SLOT_8, L"Save Slot - 8");
|
||||||
DEF_STR(SAVE_SLOT_9, L"Save Slot - 9" );
|
DEF_STR(SAVE_SLOT_9, L"Save Slot - 9");
|
||||||
DEF_STR(SAVE_SLOT_10, L"Save Slot - 10" );
|
DEF_STR(SAVE_SLOT_10, L"Save Slot - 10");
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* ROM Browser *
|
* ROM Browser *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//ROM Browser Fields
|
//ROM Browser Fields
|
||||||
DEF_STR(RB_FILENAME, L"File Name" );
|
DEF_STR(RB_FILENAME, L"File Name");
|
||||||
DEF_STR(RB_INTERNALNAME, L"Internal Name" );
|
DEF_STR(RB_INTERNALNAME, L"Internal Name");
|
||||||
DEF_STR(RB_GOODNAME, L"Good Name" );
|
DEF_STR(RB_GOODNAME, L"Good Name");
|
||||||
DEF_STR(RB_STATUS, L"Status" );
|
DEF_STR(RB_STATUS, L"Status");
|
||||||
DEF_STR(RB_ROMSIZE, L"ROM Size" );
|
DEF_STR(RB_ROMSIZE, L"ROM Size");
|
||||||
DEF_STR(RB_NOTES_CORE, L"Notes (core)" );
|
DEF_STR(RB_NOTES_CORE, L"Notes (core)");
|
||||||
DEF_STR(RB_NOTES_PLUGIN, L"Notes (default plugins)" );
|
DEF_STR(RB_NOTES_PLUGIN, L"Notes (default plugins)");
|
||||||
DEF_STR(RB_NOTES_USER, L"Notes (user)" );
|
DEF_STR(RB_NOTES_USER, L"Notes (user)");
|
||||||
DEF_STR(RB_CART_ID, L"Cartridge ID" );
|
DEF_STR(RB_CART_ID, L"Cartridge ID");
|
||||||
DEF_STR(RB_MANUFACTUER, L"Manufacturer" );
|
DEF_STR(RB_MANUFACTUER, L"Manufacturer");
|
||||||
DEF_STR(RB_COUNTRY, L"Country" );
|
DEF_STR(RB_COUNTRY, L"Country");
|
||||||
DEF_STR(RB_DEVELOPER, L"Developer" );
|
DEF_STR(RB_DEVELOPER, L"Developer");
|
||||||
DEF_STR(RB_CRC1, L"CRC1" );
|
DEF_STR(RB_CRC1, L"CRC1");
|
||||||
DEF_STR(RB_CRC2, L"CRC2" );
|
DEF_STR(RB_CRC2, L"CRC2");
|
||||||
DEF_STR(RB_CICCHIP, L"CIC Chip" );
|
DEF_STR(RB_CICCHIP, L"CIC Chip");
|
||||||
DEF_STR(RB_RELEASE_DATE, L"Release Date" );
|
DEF_STR(RB_RELEASE_DATE, L"Release Date");
|
||||||
DEF_STR(RB_GENRE, L"Genre" );
|
DEF_STR(RB_GENRE, L"Genre");
|
||||||
DEF_STR(RB_PLAYERS, L"Players" );
|
DEF_STR(RB_PLAYERS, L"Players");
|
||||||
DEF_STR(RB_FORCE_FEEDBACK,L"Force Feedback" );
|
DEF_STR(RB_FORCE_FEEDBACK, L"Force Feedback");
|
||||||
DEF_STR(RB_FILE_FORMAT, L"File Format" );
|
DEF_STR(RB_FILE_FORMAT, L"File Format");
|
||||||
|
|
||||||
//Select ROM
|
//Select ROM
|
||||||
DEF_STR(SELECT_ROM_DIR, L"Select current ROM directory" );
|
DEF_STR(SELECT_ROM_DIR, L"Select current ROM directory");
|
||||||
|
|
||||||
//Messages
|
//Messages
|
||||||
DEF_STR(RB_NOT_GOOD_FILE,L"Bad ROM? Use GoodN64 & check for updated RDB." );
|
DEF_STR(RB_NOT_GOOD_FILE, L"Bad ROM? Use GoodN64 & check for updated RDB.");
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Options *
|
* Options *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Options Title
|
//Options Title
|
||||||
DEF_STR(OPTIONS_TITLE,L"Settings");
|
DEF_STR(OPTIONS_TITLE, L"Settings");
|
||||||
|
|
||||||
//Tabs
|
//Tabs
|
||||||
DEF_STR(TAB_PLUGIN, L"Plugins");
|
DEF_STR(TAB_PLUGIN, L"Plugins");
|
||||||
DEF_STR(TAB_DIRECTORY, L"Directories");
|
DEF_STR(TAB_DIRECTORY, L"Directories");
|
||||||
DEF_STR(TAB_OPTIONS, L"Options");
|
DEF_STR(TAB_OPTIONS, L"Options");
|
||||||
DEF_STR(TAB_ROMSELECTION,L"ROM Selection");
|
DEF_STR(TAB_ROMSELECTION, L"ROM Selection");
|
||||||
DEF_STR(TAB_ADVANCED, L"Advanced");
|
DEF_STR(TAB_ADVANCED, L"Advanced");
|
||||||
DEF_STR(TAB_ROMSETTINGS, L"General Settings");
|
DEF_STR(TAB_ROMSETTINGS, L"General Settings");
|
||||||
DEF_STR(TAB_SHELLINTERGATION,L"Shell Integration");
|
DEF_STR(TAB_SHELLINTERGATION, L"Shell Integration");
|
||||||
DEF_STR(TAB_ROMNOTES, L"Notes");
|
DEF_STR(TAB_ROMNOTES, L"Notes");
|
||||||
DEF_STR(TAB_SHORTCUTS, L"Keyboard Shortcuts");
|
DEF_STR(TAB_SHORTCUTS, L"Keyboard Shortcuts");
|
||||||
DEF_STR(TAB_ROMSTATUS, L"Status");
|
DEF_STR(TAB_ROMSTATUS, L"Status");
|
||||||
|
@ -202,7 +203,7 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(PLUG_AUDIO, L" Audio (sound) plugin: ");
|
DEF_STR(PLUG_AUDIO, L" Audio (sound) plugin: ");
|
||||||
DEF_STR(PLUG_CTRL, L" Input (controller) plugin: ");
|
DEF_STR(PLUG_CTRL, L" Input (controller) plugin: ");
|
||||||
DEF_STR(PLUG_HLE_GFX, L"Graphics HLE");
|
DEF_STR(PLUG_HLE_GFX, L"Graphics HLE");
|
||||||
DEF_STR(PLUG_HLE_AUDIO,L"Audio HLE");
|
DEF_STR(PLUG_HLE_AUDIO, L"Audio HLE");
|
||||||
DEF_STR(PLUG_DEFAULT, L"** Use System Plugin **");
|
DEF_STR(PLUG_DEFAULT, L"** Use System Plugin **");
|
||||||
|
|
||||||
//Directory Dialog
|
//Directory Dialog
|
||||||
|
@ -215,7 +216,7 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(DIR_SELECT_PLUGIN, L"Select plugin directory");
|
DEF_STR(DIR_SELECT_PLUGIN, L"Select plugin directory");
|
||||||
DEF_STR(DIR_SELECT_ROM, L"Select ROM directory");
|
DEF_STR(DIR_SELECT_ROM, L"Select ROM directory");
|
||||||
DEF_STR(DIR_SELECT_AUTO, L"Select N64 native saves directory");
|
DEF_STR(DIR_SELECT_AUTO, L"Select N64 native saves directory");
|
||||||
DEF_STR(DIR_SELECT_INSTANT,L"Select saved states directory");
|
DEF_STR(DIR_SELECT_INSTANT, L"Select saved states directory");
|
||||||
DEF_STR(DIR_SELECT_SCREEN, L"Select screenshot directory");
|
DEF_STR(DIR_SELECT_SCREEN, L"Select screenshot directory");
|
||||||
DEF_STR(DIR_TEXTURE, L" Texture pack directory: ");
|
DEF_STR(DIR_TEXTURE, L" Texture pack directory: ");
|
||||||
DEF_STR(DIR_SELECT_TEXTURE, L"Select texture pack directory");
|
DEF_STR(DIR_SELECT_TEXTURE, L"Select texture pack directory");
|
||||||
|
@ -258,7 +259,7 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(ADVANCE_DEBUGGER, L"Enable debugger");
|
DEF_STR(ADVANCE_DEBUGGER, L"Enable debugger");
|
||||||
DEF_STR(ADVANCE_SMM_CACHE, L"Cache");
|
DEF_STR(ADVANCE_SMM_CACHE, L"Cache");
|
||||||
DEF_STR(ADVANCE_SMM_PIDMA, L"PI DMA");
|
DEF_STR(ADVANCE_SMM_PIDMA, L"PI DMA");
|
||||||
DEF_STR(ADVANCE_SMM_VALIDATE,L"Start changed");
|
DEF_STR(ADVANCE_SMM_VALIDATE, L"Start changed");
|
||||||
DEF_STR(ADVANCE_SMM_PROTECT, L"Protect memory");
|
DEF_STR(ADVANCE_SMM_PROTECT, L"Protect memory");
|
||||||
DEF_STR(ADVANCE_SMM_TLB, L"TLB unmapping");
|
DEF_STR(ADVANCE_SMM_TLB, L"TLB unmapping");
|
||||||
|
|
||||||
|
@ -409,13 +410,13 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(CHEAT_NOTES, L"&Notes:");
|
DEF_STR(CHEAT_NOTES, L"&Notes:");
|
||||||
DEF_STR(CHEAT_ADDCHEAT_ADD, L"Add Cheat");
|
DEF_STR(CHEAT_ADDCHEAT_ADD, L"Add Cheat");
|
||||||
DEF_STR(CHEAT_ADDCHEAT_NEW, L"New Cheat");
|
DEF_STR(CHEAT_ADDCHEAT_NEW, L"New Cheat");
|
||||||
DEF_STR(CHEAT_ADDCHEAT_CODEDES,L"<address> <value>");
|
DEF_STR(CHEAT_ADDCHEAT_CODEDES, L"<address> <value>");
|
||||||
DEF_STR(CHEAT_ADDCHEAT_OPT, L"Options:");
|
DEF_STR(CHEAT_ADDCHEAT_OPT, L"Options:");
|
||||||
DEF_STR(CHEAT_ADDCHEAT_OPTDES, L"<value> <label>");
|
DEF_STR(CHEAT_ADDCHEAT_OPTDES, L"<value> <label>");
|
||||||
|
|
||||||
//Edit Cheat
|
//Edit Cheat
|
||||||
DEF_STR(CHEAT_EDITCHEAT_WINDOW,L"Edit Cheat");
|
DEF_STR(CHEAT_EDITCHEAT_WINDOW, L"Edit Cheat");
|
||||||
DEF_STR(CHEAT_EDITCHEAT_UPDATE,L"Update Cheat");
|
DEF_STR(CHEAT_EDITCHEAT_UPDATE, L"Update Cheat");
|
||||||
DEF_STR(CHEAT_CHANGED_MSG, L"Cheat has been changed.\n\nDo you want to update?");
|
DEF_STR(CHEAT_CHANGED_MSG, L"Cheat has been changed.\n\nDo you want to update?");
|
||||||
DEF_STR(CHEAT_CHANGED_TITLE, L"Cheat updated");
|
DEF_STR(CHEAT_CHANGED_TITLE, L"Cheat updated");
|
||||||
|
|
||||||
|
@ -455,7 +456,7 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(MSG_FAIL_IMAGE, L"File loaded does not appear to be a valid N64 ROM.\n\nVerify your ROMs with GoodN64.");
|
DEF_STR(MSG_FAIL_IMAGE, L"File loaded does not appear to be a valid N64 ROM.\n\nVerify your ROMs with GoodN64.");
|
||||||
DEF_STR(MSG_UNKNOWN_COUNTRY, L"Unknown country");
|
DEF_STR(MSG_UNKNOWN_COUNTRY, L"Unknown country");
|
||||||
DEF_STR(MSG_UNKNOWN_CIC_CHIP, L"Unknown CIC chip");
|
DEF_STR(MSG_UNKNOWN_CIC_CHIP, L"Unknown CIC chip");
|
||||||
DEF_STR(MSG_UNKNOWN_FILE_FORMAT,L"Unknown file format");
|
DEF_STR(MSG_UNKNOWN_FILE_FORMAT, L"Unknown file format");
|
||||||
DEF_STR(MSG_UNKNOWN_MEM_ACTION, L"Unknown memory action\n\nEmulation stopped");
|
DEF_STR(MSG_UNKNOWN_MEM_ACTION, L"Unknown memory action\n\nEmulation stopped");
|
||||||
DEF_STR(MSG_UNHANDLED_OP, L"Unhandled R4300i opcode at");
|
DEF_STR(MSG_UNHANDLED_OP, L"Unhandled R4300i opcode at");
|
||||||
DEF_STR(MSG_NONMAPPED_SPACE, L"Executing from non-mapped space.\n\nVerify ROM and its settings.");
|
DEF_STR(MSG_NONMAPPED_SPACE, L"Executing from non-mapped space.\n\nVerify ROM and its settings.");
|
||||||
|
@ -464,7 +465,7 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
DEF_STR(MSG_PIF2_ERROR, L"Copyright sequence not found in LUT. Game will no longer function.");
|
DEF_STR(MSG_PIF2_ERROR, L"Copyright sequence not found in LUT. Game will no longer function.");
|
||||||
DEF_STR(MSG_PIF2_TITLE, L"Copy Protection Failure");
|
DEF_STR(MSG_PIF2_TITLE, L"Copy Protection Failure");
|
||||||
DEF_STR(MSG_PLUGIN_CHANGE, L"Changing a plugin requires Project64 to reset a running ROM.\nIf you don't want to lose your place, answer No and save the current state first.\n\nChange plugins and reset ROM now?");
|
DEF_STR(MSG_PLUGIN_CHANGE, L"Changing a plugin requires Project64 to reset a running ROM.\nIf you don't want to lose your place, answer No and save the current state first.\n\nChange plugins and reset ROM now?");
|
||||||
DEF_STR(MSG_PLUGIN_CHANGE_TITLE,L"Change Plugins");
|
DEF_STR(MSG_PLUGIN_CHANGE_TITLE, L"Change Plugins");
|
||||||
DEF_STR(MSG_EMULATION_ENDED, L"Emulation ended");
|
DEF_STR(MSG_EMULATION_ENDED, L"Emulation ended");
|
||||||
DEF_STR(MSG_EMULATION_STARTED, L"Emulation started");
|
DEF_STR(MSG_EMULATION_STARTED, L"Emulation started");
|
||||||
DEF_STR(MSG_UNABLED_LOAD_STATE, L"Unable to load state");
|
DEF_STR(MSG_UNABLED_LOAD_STATE, L"Unable to load state");
|
||||||
|
@ -496,8 +497,8 @@ void CLanguage::LoadDefaultStrings (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
CLanguage::CLanguage() :
|
CLanguage::CLanguage() :
|
||||||
m_emptyString(L""),
|
m_emptyString(L""),
|
||||||
m_LanguageLoaded(false)
|
m_LanguageLoaded(false)
|
||||||
{
|
{
|
||||||
LoadDefaultStrings();
|
LoadDefaultStrings();
|
||||||
if (g_Settings)
|
if (g_Settings)
|
||||||
|
@ -506,7 +507,7 @@ CLanguage::CLanguage() :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CLanguage::LoadCurrentStrings ( void )
|
bool CLanguage::LoadCurrentStrings(void)
|
||||||
{
|
{
|
||||||
LanguageList LangList = GetLangList();
|
LanguageList LangList = GetLangList();
|
||||||
stdstr Filename;
|
stdstr Filename;
|
||||||
|
@ -538,7 +539,7 @@ bool CLanguage::LoadCurrentStrings ( void )
|
||||||
|
|
||||||
//Search for utf8 file marker
|
//Search for utf8 file marker
|
||||||
uint8_t utf_bom[3];
|
uint8_t utf_bom[3];
|
||||||
if (fread(&utf_bom, sizeof(utf_bom),1,file) != 1 ||
|
if (fread(&utf_bom, sizeof(utf_bom), 1, file) != 1 ||
|
||||||
utf_bom[0] != 0xEF ||
|
utf_bom[0] != 0xEF ||
|
||||||
utf_bom[1] != 0xBB ||
|
utf_bom[1] != 0xBB ||
|
||||||
utf_bom[2] != 0xBF)
|
utf_bom[2] != 0xBF)
|
||||||
|
@ -557,14 +558,14 @@ bool CLanguage::LoadCurrentStrings ( void )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
LanguageList & CLanguage::GetLangList (void)
|
LanguageList & CLanguage::GetLangList(void)
|
||||||
{
|
{
|
||||||
if (m_LanguageList.size() > 0)
|
if (m_LanguageList.size() > 0)
|
||||||
{
|
{
|
||||||
return m_LanguageList;
|
return m_LanguageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPath LanguageFiles(g_Settings->LoadStringVal(Setting_LanguageDir),"*.pj.Lang");
|
CPath LanguageFiles(g_Settings->LoadStringVal(Setting_LanguageDir), "*.pj.Lang");
|
||||||
if (LanguageFiles.FindFirst())
|
if (LanguageFiles.FindFirst())
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
|
@ -572,7 +573,7 @@ LanguageList & CLanguage::GetLangList (void)
|
||||||
LanguageFile File; //We temporally store the values in here to added to the list
|
LanguageFile File; //We temporally store the values in here to added to the list
|
||||||
|
|
||||||
File.Filename = (std::string &)LanguageFiles;
|
File.Filename = (std::string &)LanguageFiles;
|
||||||
File.LanguageName = GetLangString(LanguageFiles,LANGUAGE_NAME);
|
File.LanguageName = GetLangString(LanguageFiles, LANGUAGE_NAME);
|
||||||
|
|
||||||
if (File.LanguageName.length() == 0)
|
if (File.LanguageName.length() == 0)
|
||||||
{
|
{
|
||||||
|
@ -586,7 +587,7 @@ LanguageList & CLanguage::GetLangList (void)
|
||||||
return m_LanguageList;
|
return m_LanguageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::wstring & CLanguage::GetString (LanguageStringID StringID)
|
const std::wstring & CLanguage::GetString(LanguageStringID StringID)
|
||||||
{
|
{
|
||||||
LANG_STRINGS::iterator CurrentString = m_CurrentStrings.find(StringID);
|
LANG_STRINGS::iterator CurrentString = m_CurrentStrings.find(StringID);
|
||||||
if (CurrentString != m_CurrentStrings.end())
|
if (CurrentString != m_CurrentStrings.end())
|
||||||
|
@ -600,12 +601,12 @@ const std::wstring & CLanguage::GetString (LanguageStringID StringID)
|
||||||
return DefString->second;
|
return DefString->second;
|
||||||
}
|
}
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
#endif
|
#endif
|
||||||
return m_emptyString;
|
return m_emptyString;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID ID )
|
std::wstring CLanguage::GetLangString(const char * FileName, LanguageStringID ID)
|
||||||
{
|
{
|
||||||
FILE *file = fopen(FileName, "rb");
|
FILE *file = fopen(FileName, "rb");
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
|
@ -615,7 +616,7 @@ std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID
|
||||||
|
|
||||||
//Search for utf8 file marker
|
//Search for utf8 file marker
|
||||||
uint8_t utf_bom[3];
|
uint8_t utf_bom[3];
|
||||||
if (fread(&utf_bom, sizeof(utf_bom),1,file) != 1 ||
|
if (fread(&utf_bom, sizeof(utf_bom), 1, file) != 1 ||
|
||||||
utf_bom[0] != 0xEF ||
|
utf_bom[0] != 0xEF ||
|
||||||
utf_bom[1] != 0xBB ||
|
utf_bom[1] != 0xBB ||
|
||||||
utf_bom[2] != 0xBF)
|
utf_bom[2] != 0xBF)
|
||||||
|
@ -638,10 +639,10 @@ std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID
|
||||||
return L"";
|
return L"";
|
||||||
}
|
}
|
||||||
|
|
||||||
LANG_STR CLanguage::GetNextLangString (void * OpenFile)
|
LANG_STR CLanguage::GetNextLangString(void * OpenFile)
|
||||||
{
|
{
|
||||||
enum { MAX_STRING_LEN = 400 };
|
enum { MAX_STRING_LEN = 400 };
|
||||||
int StringID;
|
int32_t StringID;
|
||||||
char szString[MAX_STRING_LEN]; //temp store the string from the file
|
char szString[MAX_STRING_LEN]; //temp store the string from the file
|
||||||
|
|
||||||
FILE * file = (FILE *)OpenFile;
|
FILE * file = (FILE *)OpenFile;
|
||||||
|
@ -649,46 +650,46 @@ LANG_STR CLanguage::GetNextLangString (void * OpenFile)
|
||||||
//while(token!='#' && !feof(file)) { fread(&token, 1, 1, file); }
|
//while(token!='#' && !feof(file)) { fread(&token, 1, 1, file); }
|
||||||
if (feof(file))
|
if (feof(file))
|
||||||
{
|
{
|
||||||
return LANG_STR(0,L"");
|
return LANG_STR(0, L"");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Search for token #
|
//Search for token #
|
||||||
char token=0;
|
char token = 0;
|
||||||
while (token!='#' && !feof(file))
|
while (token != '#' && !feof(file))
|
||||||
{
|
{
|
||||||
fread(&token, 1, 1, file);
|
fread(&token, 1, 1, file);
|
||||||
}
|
}
|
||||||
if (feof(file))
|
if (feof(file))
|
||||||
{
|
{
|
||||||
return LANG_STR(0,L"");
|
return LANG_STR(0, L"");
|
||||||
}
|
}
|
||||||
|
|
||||||
//get StringID after token
|
//get StringID after token
|
||||||
fscanf(file, "%d", &StringID);
|
fscanf(file, "%d", &StringID);
|
||||||
|
|
||||||
//Search for token #
|
//Search for token #
|
||||||
while(token!='#' && !feof(file))
|
while (token != '#' && !feof(file))
|
||||||
{
|
{
|
||||||
fread(&token, 1, 1, file);
|
fread(&token, 1, 1, file);
|
||||||
}
|
}
|
||||||
if (feof(file))
|
if (feof(file))
|
||||||
{
|
{
|
||||||
StringID = EMPTY_STRING; return LANG_STR(0,L"");
|
StringID = EMPTY_STRING; return LANG_STR(0, L"");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Search for start of string '"'
|
//Search for start of string '"'
|
||||||
while (token!='"' && !feof(file))
|
while (token != '"' && !feof(file))
|
||||||
{
|
{
|
||||||
fread(&token, 1, 1, file);
|
fread(&token, 1, 1, file);
|
||||||
}
|
}
|
||||||
if (feof(file))
|
if (feof(file))
|
||||||
{
|
{
|
||||||
StringID = EMPTY_STRING; return LANG_STR(0,L"");
|
StringID = EMPTY_STRING; return LANG_STR(0, L"");
|
||||||
}
|
}
|
||||||
|
|
||||||
int pos = 0;
|
int32_t pos = 0;
|
||||||
fread(&token, 1, 1, file);
|
fread(&token, 1, 1, file);
|
||||||
while (token!='"' && !feof(file))
|
while (token != '"' && !feof(file))
|
||||||
{
|
{
|
||||||
szString[pos++] = token;
|
szString[pos++] = token;
|
||||||
fread(&token, 1, 1, file);
|
fread(&token, 1, 1, file);
|
||||||
|
@ -699,22 +700,22 @@ LANG_STR CLanguage::GetNextLangString (void * OpenFile)
|
||||||
}
|
}
|
||||||
szString[pos++] = 0;
|
szString[pos++] = 0;
|
||||||
stdstr text(szString);
|
stdstr text(szString);
|
||||||
text.Replace("\\n","\n");
|
text.Replace("\\n", "\n");
|
||||||
return LANG_STR(StringID,text.ToUTF16());
|
return LANG_STR(StringID, text.ToUTF16());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLanguage::SetLanguage ( const wchar_t * LanguageName )
|
void CLanguage::SetLanguage(const wchar_t * LanguageName)
|
||||||
{
|
{
|
||||||
m_SelectedLanguage = LanguageName;
|
m_SelectedLanguage = LanguageName;
|
||||||
if (LoadCurrentStrings())
|
if (LoadCurrentStrings())
|
||||||
{
|
{
|
||||||
stdstr Language;
|
stdstr Language;
|
||||||
Language.FromUTF16(LanguageName);
|
Language.FromUTF16(LanguageName);
|
||||||
g_Settings->SaveString(Setting_CurrentLanguage,Language);
|
g_Settings->SaveString(Setting_CurrentLanguage, Language);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CLanguage::IsCurrentLang( LanguageFile & File )
|
bool CLanguage::IsCurrentLang(LanguageFile & File)
|
||||||
{
|
{
|
||||||
if (m_SelectedLanguage == File.LanguageName)
|
if (m_SelectedLanguage == File.LanguageName)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -14,8 +14,9 @@
|
||||||
#include <string> //stl string
|
#include <string> //stl string
|
||||||
#include <map> //stl map
|
#include <map> //stl map
|
||||||
#include <list> //stl list
|
#include <list> //stl list
|
||||||
|
#include <common/stdtypes.h>
|
||||||
|
|
||||||
typedef std::map<int, std::wstring, std::less<int> > LANG_STRINGS;
|
typedef std::map<int32_t, std::wstring, std::less<int32_t> > LANG_STRINGS;
|
||||||
typedef LANG_STRINGS::value_type LANG_STR;
|
typedef LANG_STRINGS::value_type LANG_STR;
|
||||||
|
|
||||||
struct LanguageFile
|
struct LanguageFile
|
||||||
|
@ -29,14 +30,14 @@ typedef std::list<LanguageFile> LanguageList;
|
||||||
class CLanguage
|
class CLanguage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CLanguage ();
|
CLanguage();
|
||||||
|
|
||||||
const std::wstring & GetString ( LanguageStringID StringID );
|
const std::wstring & GetString(LanguageStringID StringID);
|
||||||
LanguageList & GetLangList ( void );
|
LanguageList & GetLangList(void);
|
||||||
void SetLanguage ( const wchar_t * LanguageName );
|
void SetLanguage(const wchar_t * LanguageName);
|
||||||
bool LoadCurrentStrings ( void );
|
bool LoadCurrentStrings(void);
|
||||||
bool IsCurrentLang ( LanguageFile & File );
|
bool IsCurrentLang(LanguageFile & File);
|
||||||
bool IsLanguageLoaded ( void ) const { return m_LanguageLoaded; }
|
bool IsLanguageLoaded(void) const { return m_LanguageLoaded; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CLanguage(const CLanguage&); // Disable copy constructor
|
CLanguage(const CLanguage&); // Disable copy constructor
|
||||||
|
@ -48,16 +49,16 @@ private:
|
||||||
LANG_STRINGS m_CurrentStrings, m_DefaultStrings;
|
LANG_STRINGS m_CurrentStrings, m_DefaultStrings;
|
||||||
LanguageList m_LanguageList;
|
LanguageList m_LanguageList;
|
||||||
|
|
||||||
std::wstring GetLangString ( const char * FileName, LanguageStringID ID );
|
std::wstring GetLangString(const char * FileName, LanguageStringID ID);
|
||||||
LANG_STR GetNextLangString ( void * OpenFile );
|
LANG_STR GetNextLangString(void * OpenFile);
|
||||||
void LoadDefaultStrings ( void );
|
void LoadDefaultStrings(void);
|
||||||
|
|
||||||
bool m_LanguageLoaded;
|
bool m_LanguageLoaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CLanguage * g_Lang;
|
extern CLanguage * g_Lang;
|
||||||
|
|
||||||
inline const wchar_t * GS (LanguageStringID StringID)
|
inline const wchar_t * GS(LanguageStringID StringID)
|
||||||
{
|
{
|
||||||
return g_Lang->GetString(StringID).c_str();
|
return g_Lang->GetString(StringID).c_str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -15,199 +15,48 @@ CLanguageSelector::CLanguageSelector()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLanguageSelector::Select ( void )
|
void CLanguageSelector::Select(void)
|
||||||
{
|
{
|
||||||
DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_Lang_Select),NULL,(DLGPROC)LangSelectProc, (LPARAM)this);
|
DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_Lang_Select), NULL, (DLGPROC)LangSelectProc, (LPARAM)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static WNDPROC pfnWndLangSelectOkProc = NULL;
|
LRESULT CALLBACK CLanguageSelector::LangSelectProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
static HBITMAP hOkButton = NULL;
|
|
||||||
|
|
||||||
DWORD CALLBACK LangSelectOkProc (HWND hWnd, DWORD uMsg, DWORD wParam, DWORD lParam)
|
|
||||||
{
|
|
||||||
static bool m_fPressed = false;
|
|
||||||
static HBITMAP hOkButtonDown = NULL;
|
|
||||||
|
|
||||||
switch (uMsg)
|
|
||||||
{
|
|
||||||
case WM_PAINT:
|
|
||||||
{
|
|
||||||
PAINTSTRUCT ps;
|
|
||||||
|
|
||||||
if (BeginPaint(hWnd,&ps))
|
|
||||||
{
|
|
||||||
if (m_fPressed)
|
|
||||||
{
|
|
||||||
if (hOkButtonDown == NULL)
|
|
||||||
{
|
|
||||||
hOkButtonDown = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK_DOWN));
|
|
||||||
}
|
|
||||||
if (hOkButtonDown)
|
|
||||||
{
|
|
||||||
RECT rcClient;
|
|
||||||
GetClientRect(hWnd, &rcClient);
|
|
||||||
|
|
||||||
BITMAP bmTL1;
|
|
||||||
GetObject(hOkButtonDown, sizeof(BITMAP), &bmTL1);
|
|
||||||
HDC memdc = CreateCompatibleDC(ps.hdc);
|
|
||||||
HGDIOBJ save = SelectObject(memdc, hOkButtonDown);
|
|
||||||
BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
|
|
||||||
SelectObject(memdc, save);
|
|
||||||
DeleteDC(memdc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (hOkButton)
|
|
||||||
{
|
|
||||||
RECT rcClient;
|
|
||||||
GetClientRect(hWnd, &rcClient);
|
|
||||||
|
|
||||||
BITMAP bmTL1;
|
|
||||||
GetObject(hOkButton, sizeof(BITMAP), &bmTL1);
|
|
||||||
HDC memdc = CreateCompatibleDC(ps.hdc);
|
|
||||||
HGDIOBJ save = SelectObject(memdc, hOkButton);
|
|
||||||
BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
|
|
||||||
SelectObject(memdc, save);
|
|
||||||
DeleteDC(memdc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EndPaint(hWnd,&ps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
if (::GetCapture() == hWnd)
|
|
||||||
{
|
|
||||||
POINT ptCursor = { ((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)) };
|
|
||||||
ClientToScreen(hWnd, &ptCursor);
|
|
||||||
RECT rect;
|
|
||||||
GetWindowRect(hWnd, &rect);
|
|
||||||
bool uPressed = ::PtInRect(&rect, ptCursor)==TRUE;
|
|
||||||
if ( m_fPressed != uPressed )
|
|
||||||
{
|
|
||||||
m_fPressed = uPressed;
|
|
||||||
::InvalidateRect(hWnd, NULL, TRUE);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_LBUTTONDOWN:
|
|
||||||
{
|
|
||||||
LRESULT lRet = 0;
|
|
||||||
lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
||||||
SetCapture(hWnd);
|
|
||||||
if ( ::GetCapture()==hWnd )
|
|
||||||
{
|
|
||||||
m_fPressed = true;
|
|
||||||
|
|
||||||
if (m_fPressed)
|
|
||||||
{
|
|
||||||
::InvalidateRect(hWnd, NULL, TRUE);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lRet;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
{
|
|
||||||
LRESULT lRet = 0;
|
|
||||||
lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
||||||
if ( ::GetCapture() == hWnd )
|
|
||||||
{
|
|
||||||
::ReleaseCapture();
|
|
||||||
if ( m_fPressed )
|
|
||||||
{
|
|
||||||
::SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_fPressed = false;
|
|
||||||
|
|
||||||
return lRet;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CallWindowProc(pfnWndLangSelectOkProc, hWnd, uMsg, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
{
|
||||||
static HBITMAP hbmpBackgroundTop = NULL;
|
static HBITMAP hbmpBackgroundTop = NULL;
|
||||||
static HBITMAP hbmpBackgroundBottom = NULL;
|
|
||||||
static HBITMAP hbmpBackgroundMiddle = NULL;
|
|
||||||
static HFONT hTextFont = NULL;
|
static HFONT hTextFont = NULL;
|
||||||
static CLanguageSelector * lngClass;
|
static CLanguageSelector * lngClass;
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE);
|
|
||||||
{
|
{
|
||||||
lngClass = (CLanguageSelector *)lParam;
|
lngClass = (CLanguageSelector *)lParam;
|
||||||
|
|
||||||
LanguageList LangList = g_Lang->GetLangList();
|
LanguageList LangList = g_Lang->GetLangList();
|
||||||
if (LangList.size() == 0)
|
if (LangList.size() == 0)
|
||||||
{
|
{
|
||||||
EndDialog(hDlg,0);
|
EndDialog(hDlg, 0);
|
||||||
}
|
}
|
||||||
for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
|
for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
|
||||||
{
|
{
|
||||||
int index = SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_ADDSTRING,0,(WPARAM)Language->LanguageName.c_str());
|
int index = SendMessageW(GetDlgItem(hDlg, IDC_LANG_SEL), CB_ADDSTRING, 0, (WPARAM)Language->LanguageName.c_str());
|
||||||
if (_wcsicmp(Language->LanguageName.c_str(),L"English") == 0)
|
if (_wcsicmp(Language->LanguageName.c_str(), L"English") == 0)
|
||||||
{
|
{
|
||||||
SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,index,0);
|
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, index, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
|
int Index = SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETCURSEL, 0, 0);
|
||||||
if (Index < 0)
|
if (Index < 0)
|
||||||
{
|
{
|
||||||
SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,0,0);
|
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum { ROUND_EDGE = 15 };
|
|
||||||
|
|
||||||
DWORD dwStyle = GetWindowLong(hDlg, GWL_STYLE);
|
|
||||||
dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
|
|
||||||
SetWindowLong(hDlg, GWL_STYLE, dwStyle);
|
|
||||||
|
|
||||||
// Use the size of the image
|
// Use the size of the image
|
||||||
hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_TOP));
|
hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_ABOUT_LOGO));
|
||||||
hbmpBackgroundBottom = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_BOTTOM));
|
|
||||||
hbmpBackgroundMiddle = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_MIDDLE));
|
|
||||||
BITMAP bmTL;
|
BITMAP bmTL;
|
||||||
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
|
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
|
||||||
|
|
||||||
if (hbmpBackgroundTop)
|
|
||||||
{
|
|
||||||
// int iHeight = bmTL.bmHeight;
|
|
||||||
int iWidth = bmTL.bmWidth;
|
|
||||||
|
|
||||||
RECT rect;
|
|
||||||
GetWindowRect(hDlg, &rect);
|
|
||||||
rect.left -= rect.left;
|
|
||||||
rect.bottom -= rect.top;
|
|
||||||
rect.top -= rect.top;
|
|
||||||
|
|
||||||
// Tweaked
|
|
||||||
HRGN hWindowRegion= CreateRoundRectRgn
|
|
||||||
(
|
|
||||||
rect.left,
|
|
||||||
rect.top,
|
|
||||||
rect.left+iWidth+GetSystemMetrics(SM_CXEDGE)-1,
|
|
||||||
rect.bottom+GetSystemMetrics(SM_CYEDGE)-1,
|
|
||||||
ROUND_EDGE,
|
|
||||||
ROUND_EDGE
|
|
||||||
);
|
|
||||||
|
|
||||||
if (hWindowRegion)
|
|
||||||
{
|
|
||||||
SetWindowRgn(hDlg, hWindowRegion, TRUE);
|
|
||||||
DeleteObject(hWindowRegion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hTextFont = ::CreateFont
|
hTextFont = ::CreateFont
|
||||||
(
|
(
|
||||||
18,
|
18,
|
||||||
|
@ -222,39 +71,10 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
OUT_DEFAULT_PRECIS,
|
OUT_DEFAULT_PRECIS,
|
||||||
CLIP_DEFAULT_PRECIS,
|
CLIP_DEFAULT_PRECIS,
|
||||||
PROOF_QUALITY,
|
PROOF_QUALITY,
|
||||||
DEFAULT_PITCH|FF_DONTCARE,
|
DEFAULT_PITCH | FF_DONTCARE,
|
||||||
"Arial"
|
"Arial"
|
||||||
);
|
);
|
||||||
SendDlgItemMessage(hDlg,IDC_SELECT_LANG,WM_SETFONT,(WPARAM)hTextFont,TRUE);
|
SendDlgItemMessage(hDlg, IDC_SELECT_LANG, WM_SETFONT, (WPARAM)hTextFont, TRUE);
|
||||||
}
|
|
||||||
|
|
||||||
hOkButton = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK));
|
|
||||||
pfnWndLangSelectOkProc = (WNDPROC)::GetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC);
|
|
||||||
::SetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC,(LONG_PTR)LangSelectOkProc);
|
|
||||||
break;
|
|
||||||
case WM_NCHITTEST:
|
|
||||||
{
|
|
||||||
int xPos = LOWORD(lParam);
|
|
||||||
int yPos = HIWORD(lParam);
|
|
||||||
RECT client, a;
|
|
||||||
GetClientRect(hDlg,&a);
|
|
||||||
GetClientRect(hDlg,&client);
|
|
||||||
ClientToScreen(hDlg,(LPPOINT)&client);
|
|
||||||
client.right += client.left;
|
|
||||||
client.bottom += client.top;
|
|
||||||
|
|
||||||
int nCaption = GetSystemMetrics(SM_CYCAPTION)*4;
|
|
||||||
|
|
||||||
LRESULT lResult = HTCLIENT;
|
|
||||||
|
|
||||||
//check caption
|
|
||||||
if (xPos <= client.right && xPos >= client.left &&
|
|
||||||
(yPos >= client.top+ 0)&& (yPos <= client.top + 0+nCaption))
|
|
||||||
{
|
|
||||||
lResult = HTCAPTION;
|
|
||||||
}
|
|
||||||
SetWindowLong(hDlg, DWLP_MSGRESULT, lResult);
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_CTLCOLORSTATIC:
|
case WM_CTLCOLORSTATIC:
|
||||||
|
@ -265,19 +85,33 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
|
return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
{
|
||||||
|
HPEN outline;
|
||||||
|
HBRUSH fill;
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
outline = CreatePen(PS_SOLID, 1, 0x00FFFFFF);
|
||||||
|
fill = CreateSolidBrush(0x00FFFFFF);
|
||||||
|
SelectObject((HDC)wParam, outline);
|
||||||
|
SelectObject((HDC)wParam, fill);
|
||||||
|
|
||||||
|
GetClientRect(hDlg, &rect);
|
||||||
|
|
||||||
|
Rectangle((HDC)wParam, rect.left, rect.top, rect.right, rect.bottom);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
|
||||||
if (BeginPaint(hDlg,&ps))
|
if (BeginPaint(hDlg, &ps))
|
||||||
{
|
{
|
||||||
RECT rcClient;
|
RECT rcClient;
|
||||||
GetClientRect(hDlg, &rcClient);
|
GetClientRect(hDlg, &rcClient);
|
||||||
|
|
||||||
BITMAP bmTL_top, bmTL_bottom, bmTL_Middle;
|
BITMAP bmTL_top;
|
||||||
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
|
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
|
||||||
GetObject(hbmpBackgroundBottom, sizeof(BITMAP), &bmTL_bottom);
|
|
||||||
GetObject(hbmpBackgroundMiddle, sizeof(BITMAP), &bmTL_Middle);
|
|
||||||
|
|
||||||
HDC memdc = CreateCompatibleDC(ps.hdc);
|
HDC memdc = CreateCompatibleDC(ps.hdc);
|
||||||
HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
|
HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
|
||||||
|
@ -285,26 +119,7 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
SelectObject(memdc, save);
|
SelectObject(memdc, save);
|
||||||
DeleteDC(memdc);
|
DeleteDC(memdc);
|
||||||
|
|
||||||
memdc = CreateCompatibleDC(ps.hdc);
|
EndPaint(hDlg, &ps);
|
||||||
save = SelectObject(memdc, hbmpBackgroundMiddle);
|
|
||||||
for (int x = bmTL_top.bmHeight; x < rcClient.bottom; x += bmTL_Middle.bmHeight)
|
|
||||||
{
|
|
||||||
//BitBlt(ps.hdc, 0, bmTL_top.bmHeight, bmTL_Middle.bmWidth, rcClient.bottom - (bmTL_bottom.bmHeight + bmTL_top.bmHeight), memdc, 0, 0, SRCCOPY);
|
|
||||||
BitBlt(ps.hdc, 0, x, bmTL_Middle.bmWidth, bmTL_Middle.bmHeight, memdc, 0, 0, SRCCOPY);
|
|
||||||
}
|
|
||||||
SelectObject(memdc, save);
|
|
||||||
DeleteDC(memdc);
|
|
||||||
|
|
||||||
BITMAP ;
|
|
||||||
memdc = CreateCompatibleDC(ps.hdc);
|
|
||||||
save = SelectObject(memdc, hbmpBackgroundBottom);
|
|
||||||
BitBlt(ps.hdc, 0, rcClient.bottom - bmTL_bottom.bmHeight, bmTL_bottom.bmWidth, bmTL_bottom.bmHeight, memdc, 0, 0, SRCCOPY);
|
|
||||||
SelectObject(memdc, save);
|
|
||||||
DeleteDC(memdc);
|
|
||||||
|
|
||||||
BITMAP ;
|
|
||||||
|
|
||||||
EndPaint(hDlg,&ps);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -316,14 +131,6 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
{
|
{
|
||||||
DeleteObject(hbmpBackgroundTop);
|
DeleteObject(hbmpBackgroundTop);
|
||||||
}
|
}
|
||||||
if (hbmpBackgroundBottom)
|
|
||||||
{
|
|
||||||
DeleteObject(hbmpBackgroundBottom);
|
|
||||||
}
|
|
||||||
if (hbmpBackgroundMiddle)
|
|
||||||
{
|
|
||||||
DeleteObject(hbmpBackgroundMiddle);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hTextFont)
|
if (hTextFont)
|
||||||
{
|
{
|
||||||
|
@ -331,17 +138,17 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
|
int Index = SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETCURSEL, 0, 0);
|
||||||
|
|
||||||
if (Index >= 0)
|
if (Index >= 0)
|
||||||
{
|
{
|
||||||
wchar_t String[255];
|
wchar_t String[255];
|
||||||
SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETLBTEXT,Index,(LPARAM)String);
|
SendMessageW(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETLBTEXT, Index, (LPARAM)String);
|
||||||
g_Lang->SetLanguage(String);
|
g_Lang->SetLanguage(String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EndDialog(hDlg,0);
|
EndDialog(hDlg, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -13,13 +13,13 @@
|
||||||
class CLanguageSelector
|
class CLanguageSelector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CLanguageSelector ();
|
CLanguageSelector();
|
||||||
|
|
||||||
void Select ( void );
|
void Select(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
|
CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
|
||||||
CLanguageSelector& operator=(const CLanguageSelector&); // Disable assignment
|
CLanguageSelector& operator=(const CLanguageSelector&); // Disable assignment
|
||||||
|
|
||||||
static LRESULT CALLBACK LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
static LRESULT CALLBACK LangSelectProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
};
|
};
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
|
* http://www.pj64-emu.com/ *
|
||||||
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
|
* *
|
||||||
|
* License: *
|
||||||
|
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
|
#include <common/Util.h>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <Objbase.h>
|
||||||
|
|
||||||
|
void CN64System::StartEmulationThead()
|
||||||
|
{
|
||||||
|
ThreadInfo * Info = new ThreadInfo;
|
||||||
|
HANDLE * hThread = new HANDLE;
|
||||||
|
*hThread = NULL;
|
||||||
|
|
||||||
|
//create the needed info into a structure to pass as one parameter
|
||||||
|
//for creating a thread
|
||||||
|
Info->ThreadHandle = hThread;
|
||||||
|
|
||||||
|
*hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)StartEmulationThread, Info, 0, (LPDWORD)&Info->ThreadID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CN64System::StartEmulationThread(ThreadInfo * Info)
|
||||||
|
{
|
||||||
|
if (g_Settings->LoadBool(Setting_CN64TimeCritical))
|
||||||
|
{
|
||||||
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CoInitialize(NULL);
|
||||||
|
|
||||||
|
EmulationStarting(Info->ThreadHandle, Info->ThreadID);
|
||||||
|
delete ((HANDLE *)Info->ThreadHandle);
|
||||||
|
delete Info;
|
||||||
|
|
||||||
|
CoUninitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CN64System::CloseCpu()
|
||||||
|
{
|
||||||
|
if (m_CPU_Handle == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_EndEmulation = true;
|
||||||
|
if (g_Settings->LoadBool(GameRunning_CPU_Paused))
|
||||||
|
{
|
||||||
|
m_hPauseEvent.Trigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetCurrentThreadId() == m_CPU_ThreadID)
|
||||||
|
{
|
||||||
|
ExternalEvent(SysEvent_CloseCPU);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE hThread = m_CPU_Handle;
|
||||||
|
m_CPU_Handle = NULL;
|
||||||
|
for (int count = 0; count < 200; count++)
|
||||||
|
{
|
||||||
|
pjutil::Sleep(100);
|
||||||
|
if (g_Notify->ProcessGuiMessages())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD ExitCode;
|
||||||
|
if (GetExitCodeThread(hThread, &ExitCode))
|
||||||
|
{
|
||||||
|
if (ExitCode != STILL_ACTIVE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hThread)
|
||||||
|
{
|
||||||
|
DWORD ExitCode;
|
||||||
|
GetExitCodeThread(hThread, &ExitCode);
|
||||||
|
if (ExitCode == STILL_ACTIVE)
|
||||||
|
{
|
||||||
|
TerminateThread(hThread, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hThread);
|
||||||
|
CpuStopped();
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -339,7 +339,8 @@ void CInterpreterCPU::ExecuteCPU()
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} __except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
}
|
||||||
|
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
|
||||||
{
|
{
|
||||||
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||||
}
|
}
|
||||||
|
@ -448,7 +449,7 @@ void CInterpreterCPU::ExecuteOps(int32_t Cycles)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
|
||||||
{
|
{
|
||||||
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,13 +10,15 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\N64 System\Interpreter\Interpreter Ops.h>
|
||||||
|
|
||||||
class CInterpreterCPU :
|
class CInterpreterCPU :
|
||||||
private R4300iOp
|
private R4300iOp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void BuildCPU();
|
static void BuildCPU();
|
||||||
static void ExecuteCPU();
|
static void ExecuteCPU();
|
||||||
static void ExecuteOps(int Cycles);
|
static void ExecuteOps(int32_t Cycles);
|
||||||
static void InPermLoop();
|
static void InPermLoop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,8 +9,9 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include <Project64\Logging.h>
|
||||||
|
|
||||||
bool DelaySlotEffectsCompare ( uint32_t PC, uint32_t Reg1, uint32_t Reg2 );
|
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
|
||||||
|
|
||||||
#define ADDRESS_ERROR_EXCEPTION(Address,FromRead) \
|
#define ADDRESS_ERROR_EXCEPTION(Address,FromRead) \
|
||||||
g_Reg->DoAddressError(m_NextInstruction == JUMP,Address,FromRead);\
|
g_Reg->DoAddressError(m_NextInstruction == JUMP,Address,FromRead);\
|
||||||
|
@ -35,16 +36,16 @@ bool DelaySlotEffectsCompare ( uint32_t PC, uint32_t Reg1, uint32_t Reg2 );
|
||||||
|
|
||||||
R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
{
|
{
|
||||||
Jump_Opcode[ 0] = SPECIAL;
|
Jump_Opcode[0] = SPECIAL;
|
||||||
Jump_Opcode[ 1] = REGIMM;
|
Jump_Opcode[1] = REGIMM;
|
||||||
Jump_Opcode[ 2] = R4300iOp::J;
|
Jump_Opcode[2] = R4300iOp::J;
|
||||||
Jump_Opcode[ 3] = JAL;
|
Jump_Opcode[3] = JAL;
|
||||||
Jump_Opcode[ 4] = BEQ;
|
Jump_Opcode[4] = BEQ;
|
||||||
Jump_Opcode[ 5] = BNE;
|
Jump_Opcode[5] = BNE;
|
||||||
Jump_Opcode[ 6] = BLEZ;
|
Jump_Opcode[6] = BLEZ;
|
||||||
Jump_Opcode[ 7] = BGTZ;
|
Jump_Opcode[7] = BGTZ;
|
||||||
Jump_Opcode[ 8] = ADDI;
|
Jump_Opcode[8] = ADDI;
|
||||||
Jump_Opcode[ 9] = ADDIU;
|
Jump_Opcode[9] = ADDIU;
|
||||||
Jump_Opcode[10] = SLTI;
|
Jump_Opcode[10] = SLTI;
|
||||||
Jump_Opcode[11] = SLTIU;
|
Jump_Opcode[11] = SLTIU;
|
||||||
Jump_Opcode[12] = ANDI;
|
Jump_Opcode[12] = ANDI;
|
||||||
|
@ -100,16 +101,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Opcode[62] = R4300iOp::UnknownOpcode;
|
Jump_Opcode[62] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Opcode[63] = R4300iOp::SD;
|
Jump_Opcode[63] = R4300iOp::SD;
|
||||||
|
|
||||||
Jump_Special[ 0] = SPECIAL_SLL;
|
Jump_Special[0] = SPECIAL_SLL;
|
||||||
Jump_Special[ 1] = R4300iOp::UnknownOpcode;
|
Jump_Special[1] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[ 2] = SPECIAL_SRL;
|
Jump_Special[2] = SPECIAL_SRL;
|
||||||
Jump_Special[ 3] = SPECIAL_SRA;
|
Jump_Special[3] = SPECIAL_SRA;
|
||||||
Jump_Special[ 4] = SPECIAL_SLLV;
|
Jump_Special[4] = SPECIAL_SLLV;
|
||||||
Jump_Special[ 5] = R4300iOp::UnknownOpcode;
|
Jump_Special[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[ 6] = SPECIAL_SRLV;
|
Jump_Special[6] = SPECIAL_SRLV;
|
||||||
Jump_Special[ 7] = SPECIAL_SRAV;
|
Jump_Special[7] = SPECIAL_SRAV;
|
||||||
Jump_Special[ 8] = SPECIAL_JR;
|
Jump_Special[8] = SPECIAL_JR;
|
||||||
Jump_Special[ 9] = SPECIAL_JALR;
|
Jump_Special[9] = SPECIAL_JALR;
|
||||||
Jump_Special[10] = R4300iOp::UnknownOpcode;
|
Jump_Special[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[11] = R4300iOp::UnknownOpcode;
|
Jump_Special[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Special[12] = R4300iOp::SPECIAL_SYSCALL;
|
Jump_Special[12] = R4300iOp::SPECIAL_SYSCALL;
|
||||||
|
@ -165,16 +166,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Special[62] = R4300iOp::SPECIAL_DSRL32;
|
Jump_Special[62] = R4300iOp::SPECIAL_DSRL32;
|
||||||
Jump_Special[63] = R4300iOp::SPECIAL_DSRA32;
|
Jump_Special[63] = R4300iOp::SPECIAL_DSRA32;
|
||||||
|
|
||||||
Jump_Regimm[ 0] = REGIMM_BLTZ;
|
Jump_Regimm[0] = REGIMM_BLTZ;
|
||||||
Jump_Regimm[ 1] = REGIMM_BGEZ;
|
Jump_Regimm[1] = REGIMM_BGEZ;
|
||||||
Jump_Regimm[ 2] = REGIMM_BLTZL;
|
Jump_Regimm[2] = REGIMM_BLTZL;
|
||||||
Jump_Regimm[ 3] = REGIMM_BGEZL;
|
Jump_Regimm[3] = REGIMM_BGEZL;
|
||||||
Jump_Regimm[ 4] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[4] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[ 5] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[ 6] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[ 7] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[ 8] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[ 9] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -198,16 +199,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_Regimm[30] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[30] = R4300iOp::UnknownOpcode;
|
||||||
Jump_Regimm[31] = R4300iOp::UnknownOpcode;
|
Jump_Regimm[31] = R4300iOp::UnknownOpcode;
|
||||||
|
|
||||||
Jump_CoP0[ 0] = COP0_MF;
|
Jump_CoP0[0] = COP0_MF;
|
||||||
Jump_CoP0[ 1] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[1] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 2] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[2] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 3] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[3] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 4] = COP0_MT;
|
Jump_CoP0[4] = COP0_MT;
|
||||||
Jump_CoP0[ 5] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 6] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP0[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -231,16 +232,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP0[30] = R4300iOp::COP0_CO;
|
Jump_CoP0[30] = R4300iOp::COP0_CO;
|
||||||
Jump_CoP0[31] = R4300iOp::COP0_CO;
|
Jump_CoP0[31] = R4300iOp::COP0_CO;
|
||||||
|
|
||||||
Jump_CoP0_Function[ 0] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[0] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[ 1] = R4300iOp::COP0_CO_TLBR;
|
Jump_CoP0_Function[1] = R4300iOp::COP0_CO_TLBR;
|
||||||
Jump_CoP0_Function[ 2] = R4300iOp::COP0_CO_TLBWI;
|
Jump_CoP0_Function[2] = R4300iOp::COP0_CO_TLBWI;
|
||||||
Jump_CoP0_Function[ 3] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[3] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[ 4] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[4] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[ 5] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[ 6] = R4300iOp::COP0_CO_TLBWR;
|
Jump_CoP0_Function[6] = R4300iOp::COP0_CO_TLBWR;
|
||||||
Jump_CoP0_Function[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[ 8] = R4300iOp::COP0_CO_TLBP;
|
Jump_CoP0_Function[8] = R4300iOp::COP0_CO_TLBP;
|
||||||
Jump_CoP0_Function[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -296,16 +297,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP0_Function[62] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[62] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP0_Function[63] = R4300iOp::UnknownOpcode;
|
Jump_CoP0_Function[63] = R4300iOp::UnknownOpcode;
|
||||||
|
|
||||||
Jump_CoP1[ 0] = COP1_MF;
|
Jump_CoP1[0] = COP1_MF;
|
||||||
Jump_CoP1[ 1] = R4300iOp::COP1_DMF;
|
Jump_CoP1[1] = R4300iOp::COP1_DMF;
|
||||||
Jump_CoP1[ 2] = COP1_CF;
|
Jump_CoP1[2] = COP1_CF;
|
||||||
Jump_CoP1[ 3] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[3] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[ 4] = R4300iOp::COP1_MT;
|
Jump_CoP1[4] = R4300iOp::COP1_MT;
|
||||||
Jump_CoP1[ 5] = COP1_DMT;
|
Jump_CoP1[5] = COP1_DMT;
|
||||||
Jump_CoP1[ 6] = R4300iOp::COP1_CT;
|
Jump_CoP1[6] = R4300iOp::COP1_CT;
|
||||||
Jump_CoP1[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[ 8] = R4300iOp::COP1_BC;
|
Jump_CoP1[8] = R4300iOp::COP1_BC;
|
||||||
Jump_CoP1[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -329,16 +330,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP1[30] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[30] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1[31] = R4300iOp::UnknownOpcode;
|
Jump_CoP1[31] = R4300iOp::UnknownOpcode;
|
||||||
|
|
||||||
Jump_CoP1_BC[ 0] = R4300iOp::COP1_BCF;
|
Jump_CoP1_BC[0] = R4300iOp::COP1_BCF;
|
||||||
Jump_CoP1_BC[ 1] = R4300iOp::COP1_BCT;
|
Jump_CoP1_BC[1] = R4300iOp::COP1_BCT;
|
||||||
Jump_CoP1_BC[ 2] = R4300iOp::COP1_BCFL;
|
Jump_CoP1_BC[2] = R4300iOp::COP1_BCFL;
|
||||||
Jump_CoP1_BC[ 3] = R4300iOp::COP1_BCTL;
|
Jump_CoP1_BC[3] = R4300iOp::COP1_BCTL;
|
||||||
Jump_CoP1_BC[ 4] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[4] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[ 5] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[ 6] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -362,16 +363,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP1_BC[30] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[30] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_BC[31] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_BC[31] = R4300iOp::UnknownOpcode;
|
||||||
|
|
||||||
Jump_CoP1_S[ 0] = R4300iOp::COP1_S_ADD;
|
Jump_CoP1_S[0] = R4300iOp::COP1_S_ADD;
|
||||||
Jump_CoP1_S[ 1] = R4300iOp::COP1_S_SUB;
|
Jump_CoP1_S[1] = R4300iOp::COP1_S_SUB;
|
||||||
Jump_CoP1_S[ 2] = R4300iOp::COP1_S_MUL;
|
Jump_CoP1_S[2] = R4300iOp::COP1_S_MUL;
|
||||||
Jump_CoP1_S[ 3] = R4300iOp::COP1_S_DIV;
|
Jump_CoP1_S[3] = R4300iOp::COP1_S_DIV;
|
||||||
Jump_CoP1_S[ 4] = R4300iOp::COP1_S_SQRT;
|
Jump_CoP1_S[4] = R4300iOp::COP1_S_SQRT;
|
||||||
Jump_CoP1_S[ 5] = R4300iOp::COP1_S_ABS;
|
Jump_CoP1_S[5] = R4300iOp::COP1_S_ABS;
|
||||||
Jump_CoP1_S[ 6] = R4300iOp::COP1_S_MOV;
|
Jump_CoP1_S[6] = R4300iOp::COP1_S_MOV;
|
||||||
Jump_CoP1_S[ 7] = R4300iOp::COP1_S_NEG;
|
Jump_CoP1_S[7] = R4300iOp::COP1_S_NEG;
|
||||||
Jump_CoP1_S[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_S[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_S[ 9] = R4300iOp::COP1_S_TRUNC_L;
|
Jump_CoP1_S[9] = R4300iOp::COP1_S_TRUNC_L;
|
||||||
Jump_CoP1_S[10] = R4300iOp::COP1_S_CEIL_L; //added by Witten
|
Jump_CoP1_S[10] = R4300iOp::COP1_S_CEIL_L; //added by Witten
|
||||||
Jump_CoP1_S[11] = R4300iOp::COP1_S_FLOOR_L; //added by Witten
|
Jump_CoP1_S[11] = R4300iOp::COP1_S_FLOOR_L; //added by Witten
|
||||||
Jump_CoP1_S[12] = R4300iOp::COP1_S_ROUND_W;
|
Jump_CoP1_S[12] = R4300iOp::COP1_S_ROUND_W;
|
||||||
|
@ -427,16 +428,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP1_S[62] = R4300iOp::COP1_S_CMP;
|
Jump_CoP1_S[62] = R4300iOp::COP1_S_CMP;
|
||||||
Jump_CoP1_S[63] = R4300iOp::COP1_S_CMP;
|
Jump_CoP1_S[63] = R4300iOp::COP1_S_CMP;
|
||||||
|
|
||||||
Jump_CoP1_D[ 0] = R4300iOp::COP1_D_ADD;
|
Jump_CoP1_D[0] = R4300iOp::COP1_D_ADD;
|
||||||
Jump_CoP1_D[ 1] = R4300iOp::COP1_D_SUB;
|
Jump_CoP1_D[1] = R4300iOp::COP1_D_SUB;
|
||||||
Jump_CoP1_D[ 2] = R4300iOp::COP1_D_MUL;
|
Jump_CoP1_D[2] = R4300iOp::COP1_D_MUL;
|
||||||
Jump_CoP1_D[ 3] = R4300iOp::COP1_D_DIV;
|
Jump_CoP1_D[3] = R4300iOp::COP1_D_DIV;
|
||||||
Jump_CoP1_D[ 4] = R4300iOp::COP1_D_SQRT;
|
Jump_CoP1_D[4] = R4300iOp::COP1_D_SQRT;
|
||||||
Jump_CoP1_D[ 5] = R4300iOp::COP1_D_ABS;
|
Jump_CoP1_D[5] = R4300iOp::COP1_D_ABS;
|
||||||
Jump_CoP1_D[ 6] = R4300iOp::COP1_D_MOV;
|
Jump_CoP1_D[6] = R4300iOp::COP1_D_MOV;
|
||||||
Jump_CoP1_D[ 7] = R4300iOp::COP1_D_NEG;
|
Jump_CoP1_D[7] = R4300iOp::COP1_D_NEG;
|
||||||
Jump_CoP1_D[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_D[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_D[ 9] = R4300iOp::COP1_D_TRUNC_L; //added by Witten
|
Jump_CoP1_D[9] = R4300iOp::COP1_D_TRUNC_L; //added by Witten
|
||||||
Jump_CoP1_D[10] = R4300iOp::COP1_D_CEIL_L; //added by Witten
|
Jump_CoP1_D[10] = R4300iOp::COP1_D_CEIL_L; //added by Witten
|
||||||
Jump_CoP1_D[11] = R4300iOp::COP1_D_FLOOR_L; //added by Witten
|
Jump_CoP1_D[11] = R4300iOp::COP1_D_FLOOR_L; //added by Witten
|
||||||
Jump_CoP1_D[12] = R4300iOp::COP1_D_ROUND_W;
|
Jump_CoP1_D[12] = R4300iOp::COP1_D_ROUND_W;
|
||||||
|
@ -492,16 +493,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP1_D[62] = R4300iOp::COP1_D_CMP;
|
Jump_CoP1_D[62] = R4300iOp::COP1_D_CMP;
|
||||||
Jump_CoP1_D[63] = R4300iOp::COP1_D_CMP;
|
Jump_CoP1_D[63] = R4300iOp::COP1_D_CMP;
|
||||||
|
|
||||||
Jump_CoP1_W[ 0] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[0] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 1] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[1] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 2] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[2] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 3] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[3] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 4] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[4] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 5] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 6] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -557,16 +558,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
|
||||||
Jump_CoP1_W[62] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[62] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_W[63] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_W[63] = R4300iOp::UnknownOpcode;
|
||||||
|
|
||||||
Jump_CoP1_L[ 0] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[0] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 1] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[1] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 2] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[2] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 3] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[3] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 4] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[4] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 5] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[5] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 6] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[6] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 7] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[7] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 8] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[8] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[ 9] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[9] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[10] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[10] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[11] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[11] = R4300iOp::UnknownOpcode;
|
||||||
Jump_CoP1_L[12] = R4300iOp::UnknownOpcode;
|
Jump_CoP1_L[12] = R4300iOp::UnknownOpcode;
|
||||||
|
@ -646,7 +647,7 @@ void R4300iOp32::BEQ()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -666,7 +667,7 @@ void R4300iOp32::BNE()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -685,7 +686,7 @@ void R4300iOp32::BLEZ() {
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -705,7 +706,7 @@ void R4300iOp32::BGTZ()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -769,7 +770,7 @@ void R4300iOp32::SLTIU()
|
||||||
int64_t imm64;
|
int64_t imm64;
|
||||||
|
|
||||||
imm64 = imm32;
|
imm64 = imm32;
|
||||||
_GPR[m_Opcode.rt].W[0] = _GPR[m_Opcode.rs].UW[0] < (uint64_t)imm64?1:0;
|
_GPR[m_Opcode.rt].W[0] = _GPR[m_Opcode.rs].UW[0] < (uint64_t)imm64 ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void R4300iOp32::ANDI()
|
void R4300iOp32::ANDI()
|
||||||
|
@ -806,7 +807,7 @@ void R4300iOp32::BEQL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -827,7 +828,7 @@ void R4300iOp32::BNEL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -848,7 +849,7 @@ void R4300iOp32::BLEZL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -869,7 +870,7 @@ void R4300iOp32::BGTZL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
m_NextInstruction = PERMLOOP_DO_DELAY;
|
m_NextInstruction = PERMLOOP_DO_DELAY;
|
||||||
}
|
}
|
||||||
|
@ -885,7 +886,7 @@ void R4300iOp32::BGTZL()
|
||||||
void R4300iOp32::LB()
|
void R4300iOp32::LB()
|
||||||
{
|
{
|
||||||
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
||||||
if (!g_MMU->LB_VAddr(Address,_GPR[m_Opcode.rt].UB[0]))
|
if (!g_MMU->LB_VAddr(Address, _GPR[m_Opcode.rt].UB[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -906,7 +907,7 @@ void R4300iOp32::LH()
|
||||||
{
|
{
|
||||||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||||
}
|
}
|
||||||
if (!g_MMU->LH_VAddr(Address,_GPR[m_Opcode.rt].UHW[0]))
|
if (!g_MMU->LH_VAddr(Address, _GPR[m_Opcode.rt].UHW[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -927,7 +928,7 @@ void R4300iOp32::LWL()
|
||||||
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
||||||
Offset = Address & 3;
|
Offset = Address & 3;
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr((Address & ~3),Value))
|
if (!g_MMU->LW_VAddr((Address & ~3), Value))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -949,12 +950,12 @@ void R4300iOp32::LW()
|
||||||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_LogOptions.GenerateLog)
|
if (GenerateLog())
|
||||||
{
|
{
|
||||||
Log_LW((*_PROGRAM_COUNTER),Address);
|
Log_LW((*_PROGRAM_COUNTER), Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
|
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -971,7 +972,7 @@ void R4300iOp32::LW()
|
||||||
void R4300iOp32::LBU()
|
void R4300iOp32::LBU()
|
||||||
{
|
{
|
||||||
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
||||||
if (!g_MMU->LB_VAddr(Address,_GPR[m_Opcode.rt].UB[0]))
|
if (!g_MMU->LB_VAddr(Address, _GPR[m_Opcode.rt].UB[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -992,7 +993,7 @@ void R4300iOp32::LHU()
|
||||||
{
|
{
|
||||||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||||
}
|
}
|
||||||
if (!g_MMU->LH_VAddr(Address,_GPR[m_Opcode.rt].UHW[0]))
|
if (!g_MMU->LH_VAddr(Address, _GPR[m_Opcode.rt].UHW[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -1013,9 +1014,9 @@ void R4300iOp32::LWR()
|
||||||
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
|
||||||
Offset = Address & 3;
|
Offset = Address & 3;
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr((Address & ~3),Value))
|
if (!g_MMU->LW_VAddr((Address & ~3), Value))
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f(__FUNCTION__ " TLB: %X", Address).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f(__FUNCTION__ " TLB: %X", Address).ToUTF16().c_str());
|
||||||
|
@ -1035,7 +1036,7 @@ void R4300iOp32::LWU()
|
||||||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
|
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -1057,7 +1058,7 @@ void R4300iOp32::LL()
|
||||||
ADDRESS_ERROR_EXCEPTION(Address, true);
|
ADDRESS_ERROR_EXCEPTION(Address, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
|
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
|
||||||
{
|
{
|
||||||
if (bShowTLBMisses())
|
if (bShowTLBMisses())
|
||||||
{
|
{
|
||||||
|
@ -1203,7 +1204,7 @@ void R4300iOp32::REGIMM_BLTZ()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1223,7 +1224,7 @@ void R4300iOp32::REGIMM_BGEZ()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1243,7 +1244,7 @@ void R4300iOp32::REGIMM_BLTZL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1264,7 +1265,7 @@ void R4300iOp32::REGIMM_BGEZL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1285,7 +1286,7 @@ void R4300iOp32::REGIMM_BLTZAL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1295,7 +1296,7 @@ void R4300iOp32::REGIMM_BLTZAL()
|
||||||
{
|
{
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||||
}
|
}
|
||||||
_GPR[31].W[0]= (int32_t)((*_PROGRAM_COUNTER) + 8);
|
_GPR[31].W[0] = (int32_t)((*_PROGRAM_COUNTER) + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void R4300iOp32::REGIMM_BGEZAL()
|
void R4300iOp32::REGIMM_BGEZAL()
|
||||||
|
@ -1306,7 +1307,7 @@ void R4300iOp32::REGIMM_BGEZAL()
|
||||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
|
||||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||||
{
|
{
|
||||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
|
||||||
{
|
{
|
||||||
CInterpreterCPU::InPermLoop();
|
CInterpreterCPU::InPermLoop();
|
||||||
}
|
}
|
||||||
|
@ -1322,7 +1323,7 @@ void R4300iOp32::REGIMM_BGEZAL()
|
||||||
/************************** COP0 functions **************************/
|
/************************** COP0 functions **************************/
|
||||||
void R4300iOp32::COP0_MF()
|
void R4300iOp32::COP0_MF()
|
||||||
{
|
{
|
||||||
if (g_LogOptions.LogCP0reads)
|
if (LogCP0reads())
|
||||||
{
|
{
|
||||||
LogMessage("%08X: R4300i Read from %s (0x%08X)", (*_PROGRAM_COUNTER), CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
LogMessage("%08X: R4300i Read from %s (0x%08X)", (*_PROGRAM_COUNTER), CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||||
}
|
}
|
||||||
|
@ -1336,12 +1337,12 @@ void R4300iOp32::COP0_MF()
|
||||||
|
|
||||||
void R4300iOp32::COP0_MT()
|
void R4300iOp32::COP0_MT()
|
||||||
{
|
{
|
||||||
if (g_LogOptions.LogCP0changes)
|
if (LogCP0changes())
|
||||||
{
|
{
|
||||||
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)",(*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0],CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)", (*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0], CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
|
||||||
if (m_Opcode.rd == 11) //Compare
|
if (m_Opcode.rd == 11) //Compare
|
||||||
{
|
{
|
||||||
LogMessage("%08X: Cause register changed from %08X to %08X",(*_PROGRAM_COUNTER), g_Reg->CAUSE_REGISTER, (g_Reg->CAUSE_REGISTER & ~CAUSE_IP7));
|
LogMessage("%08X: Cause register changed from %08X to %08X", (*_PROGRAM_COUNTER), g_Reg->CAUSE_REGISTER, (g_Reg->CAUSE_REGISTER & ~CAUSE_IP7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1397,7 +1398,7 @@ void R4300iOp32::COP0_MT()
|
||||||
break;
|
break;
|
||||||
case 13: //cause
|
case 13: //cause
|
||||||
_CP0[m_Opcode.rd] &= 0xFFFFCFF;
|
_CP0[m_Opcode.rd] &= 0xFFFFCFF;
|
||||||
if ((_GPR[m_Opcode.rt].UW[0] & 0x300) != 0 && g_Settings->LoadBool(Debugger_Enabled) )
|
if ((_GPR[m_Opcode.rt].UW[0] & 0x300) != 0 && g_Settings->LoadBool(Debugger_Enabled))
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"Set IP0 or IP1");
|
g_Notify->DisplayError(L"Set IP0 or IP1");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,6 +10,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Interpreter Ops.h"
|
||||||
|
|
||||||
class R4300iOp32 :
|
class R4300iOp32 :
|
||||||
public R4300iOp
|
public R4300iOp
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,7 +10,12 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\Settings\Debug Settings.h>
|
||||||
|
#include <Project64\N64 System\Mips\Register Class.h>
|
||||||
|
#include <Project64\N64 System\Mips\OpCode.h>
|
||||||
|
|
||||||
class R4300iOp :
|
class R4300iOp :
|
||||||
|
public CLogging,
|
||||||
protected CDebugSettings,
|
protected CDebugSettings,
|
||||||
protected CSystemRegisters
|
protected CSystemRegisters
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,6 +9,9 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "Audio.h"
|
||||||
|
#include <Project64\N64 System\System Globals.h>
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
|
|
||||||
CAudio::CAudio()
|
CAudio::CAudio()
|
||||||
{
|
{
|
||||||
|
@ -17,7 +20,6 @@ CAudio::CAudio()
|
||||||
|
|
||||||
CAudio::~CAudio()
|
CAudio::~CAudio()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::Reset()
|
void CAudio::Reset()
|
||||||
|
@ -30,35 +32,37 @@ void CAudio::Reset()
|
||||||
m_FramesPerSecond = 60;
|
m_FramesPerSecond = 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD CAudio::GetLength()
|
uint32_t CAudio::GetLength()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
|
||||||
DWORD TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
|
uint32_t TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
|
||||||
if (TimeLeft > 0)
|
if (TimeLeft > 0)
|
||||||
{
|
{
|
||||||
Res = (TimeLeft / m_CountsPerByte);
|
Res = (TimeLeft / m_CountsPerByte);
|
||||||
}
|
}
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Done (res = %d, TimeLeft = %d)",Res, TimeLeft);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Done (res = %d, TimeLeft = %d)", Res, TimeLeft);
|
||||||
return (Res+3)&~3;
|
return (Res + 3)&~3;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD CAudio::GetStatus()
|
uint32_t CAudio::GetStatus()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": m_Status = %X",m_Status);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": m_Status = %X", m_Status);
|
||||||
return m_Status;
|
return m_Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::LenChanged()
|
void CAudio::LenChanged()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (g_Reg->AI_LEN_REG = %d)",g_Reg->AI_LEN_REG);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (g_Reg->AI_LEN_REG = %d)", g_Reg->AI_LEN_REG);
|
||||||
if (g_Reg->AI_LEN_REG != 0)
|
if (g_Reg->AI_LEN_REG != 0)
|
||||||
{
|
{
|
||||||
if (g_Reg->AI_LEN_REG >= 0x40000)
|
if (g_Reg->AI_LEN_REG >= 0x40000)
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Ignoring Write, To Large (%X)",g_Reg->AI_LEN_REG);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Ignoring Write, To Large (%X)", g_Reg->AI_LEN_REG);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
m_Status |= ai_busy;
|
m_Status |= ai_busy;
|
||||||
DWORD AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
|
uint32_t AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
|
||||||
if (m_SecondBuff == 0)
|
if (m_SecondBuff == 0)
|
||||||
{
|
{
|
||||||
if (AudioLeft == 0)
|
if (AudioLeft == 0)
|
||||||
|
@ -81,7 +85,7 @@ void CAudio::LenChanged()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Reset Timer to 0");
|
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Reset Timer to 0");
|
||||||
g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy);
|
g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy);
|
||||||
g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt);
|
g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt);
|
||||||
m_SecondBuff = 0;
|
m_SecondBuff = 0;
|
||||||
|
@ -92,18 +96,18 @@ void CAudio::LenChanged()
|
||||||
{
|
{
|
||||||
g_Plugins->Audio()->AiLenChanged();
|
g_Plugins->Audio()->AiLenChanged();
|
||||||
}
|
}
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Done");
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::InterruptTimerDone()
|
void CAudio::InterruptTimerDone()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
|
||||||
m_Status &= ~ai_full;
|
m_Status &= ~ai_full;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_AI;
|
g_Reg->MI_INTR_REG |= MI_INTR_AI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
if (m_SecondBuff != 0)
|
if (m_SecondBuff != 0)
|
||||||
{
|
{
|
||||||
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt,m_SecondBuff * m_CountsPerByte,false);
|
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt, m_SecondBuff * m_CountsPerByte, false);
|
||||||
m_SecondBuff = 0;
|
m_SecondBuff = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -114,30 +118,29 @@ void CAudio::InterruptTimerDone()
|
||||||
{
|
{
|
||||||
g_System->SyncToAudio();
|
g_System->SyncToAudio();
|
||||||
}
|
}
|
||||||
WriteTrace(TraceAudio,__FUNCTION__ ": Done");
|
WriteTrace(TraceAudio, __FUNCTION__ ": Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::BusyTimerDone()
|
void CAudio::BusyTimerDone()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
m_Status &= ~ai_busy;
|
m_Status &= ~ai_busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::SetViIntr ( DWORD VI_INTR_TIME )
|
void CAudio::SetViIntr(uint32_t VI_INTR_TIME)
|
||||||
{
|
{
|
||||||
double CountsPerSecond = (DWORD)((double)VI_INTR_TIME * m_FramesPerSecond);
|
double CountsPerSecond = (uint32_t)((double)VI_INTR_TIME * m_FramesPerSecond);
|
||||||
if (m_BytesPerSecond != 0 && (g_System->AiCountPerBytes() == 0))
|
if (m_BytesPerSecond != 0 && (g_System->AiCountPerBytes() == 0))
|
||||||
{
|
{
|
||||||
m_CountsPerByte = (int)((double)CountsPerSecond / (double)m_BytesPerSecond);
|
m_CountsPerByte = (int32_t)((double)CountsPerSecond / (double)m_BytesPerSecond);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CAudio::SetFrequency(uint32_t Dacrate, uint32_t System)
|
||||||
void CAudio::SetFrequency (DWORD Dacrate, DWORD System)
|
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X",Dacrate,System,g_Reg->AI_BITRATE_REG);
|
WriteTraceF(TraceAudio, __FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X", Dacrate, System, g_Reg->AI_BITRATE_REG);
|
||||||
DWORD Frequency;
|
uint32_t Frequency;
|
||||||
|
|
||||||
switch (System)
|
switch (System)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -21,19 +21,22 @@ public:
|
||||||
CAudio();
|
CAudio();
|
||||||
~CAudio();
|
~CAudio();
|
||||||
|
|
||||||
DWORD GetLength ();
|
uint32_t GetLength ();
|
||||||
DWORD GetStatus ();
|
uint32_t GetStatus ();
|
||||||
void LenChanged ();
|
void LenChanged ();
|
||||||
void InterruptTimerDone();
|
void InterruptTimerDone();
|
||||||
void BusyTimerDone ();
|
void BusyTimerDone ();
|
||||||
void Reset ();
|
void Reset ();
|
||||||
void SetViIntr ( DWORD VI_INTR_TIME );
|
void SetViIntr ( uint32_t VI_INTR_TIME );
|
||||||
void SetFrequency ( DWORD Dacrate, DWORD System );
|
void SetFrequency ( uint32_t Dacrate, uint32_t System );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DWORD m_SecondBuff;
|
CAudio(const CAudio&); // Disable copy constructor
|
||||||
DWORD m_Status;
|
CAudio& operator=(const CAudio&); // Disable assignment
|
||||||
DWORD m_BytesPerSecond;
|
|
||||||
int m_CountsPerByte;
|
uint32_t m_SecondBuff;
|
||||||
int m_FramesPerSecond;
|
uint32_t m_Status;
|
||||||
|
uint32_t m_BytesPerSecond;
|
||||||
|
int32_t m_CountsPerByte;
|
||||||
|
int32_t m_FramesPerSecond;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,38 +11,46 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
|
CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
|
||||||
m_FlashRam(FlashRam),
|
m_FlashRam(FlashRam),
|
||||||
m_Sram(Sram)
|
m_Sram(Sram)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::OnFirstDMA()
|
void CDMA::OnFirstDMA()
|
||||||
{
|
{
|
||||||
|
int16_t offset;
|
||||||
|
const uint32_t base = 0x00000000;
|
||||||
|
const uint32_t rt = g_MMU->RdramSize();
|
||||||
|
|
||||||
switch (g_Rom->CicChipID())
|
switch (g_Rom->CicChipID())
|
||||||
{
|
{
|
||||||
case CIC_NUS_6101: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_6101: offset = +0x0318; break;
|
||||||
case CIC_NUS_5167: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_5167: offset = +0x0318; break;
|
||||||
case CIC_UNKNOWN:
|
case CIC_UNKNOWN:
|
||||||
case CIC_NUS_6102: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_6102: offset = +0x0318; break;
|
||||||
case CIC_NUS_6103: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_6103: offset = +0x0318; break;
|
||||||
case CIC_NUS_6105: *(DWORD *)&((g_MMU->Rdram())[0x3F0]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_6105: offset = +0x03F0; break;
|
||||||
case CIC_NUS_6106: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_6106: offset = +0x0318; break;
|
||||||
default: g_Notify->DisplayError(stdstr_f("Unhandled CicChip(%d) in first DMA",g_Rom->CicChipID()).ToUTF16().c_str());
|
default:
|
||||||
|
g_Notify->DisplayError(
|
||||||
|
stdstr_f("Unhandled CicChip(%d) in first DMA", g_Rom->CicChipID()).ToUTF16().c_str()
|
||||||
|
);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
g_MMU->SW_PAddr(base + offset, rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::PI_DMA_READ()
|
void CDMA::PI_DMA_READ()
|
||||||
{
|
{
|
||||||
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
||||||
DWORD PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
|
uint32_t PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
|
||||||
|
|
||||||
if ((PI_RD_LEN_REG & 1) != 0)
|
if ((PI_RD_LEN_REG & 1) != 0)
|
||||||
{
|
{
|
||||||
PI_RD_LEN_REG += 1;
|
PI_RD_LEN_REG += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
|
if (g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
|
@ -57,9 +65,9 @@ void CDMA::PI_DMA_READ()
|
||||||
//Write ROM Area (for 64DD Convert)
|
//Write ROM Area (for 64DD Convert)
|
||||||
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites))
|
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites))
|
||||||
{
|
{
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
BYTE * ROM = g_Rom->GetRomAddress();
|
uint8_t * ROM = g_Rom->GetRomAddress();
|
||||||
BYTE * RDRAM = g_MMU->Rdram();
|
uint8_t * RDRAM = g_MMU->Rdram();
|
||||||
|
|
||||||
DWORD OldProtect;
|
DWORD OldProtect;
|
||||||
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READWRITE, &OldProtect);
|
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READWRITE, &OldProtect);
|
||||||
|
@ -74,7 +82,7 @@ void CDMA::PI_DMA_READ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD Len;
|
uint32_t Len;
|
||||||
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
||||||
for (i = 0; i < Len; i++)
|
for (i = 0; i < Len; i++)
|
||||||
{
|
{
|
||||||
|
@ -101,7 +109,7 @@ void CDMA::PI_DMA_READ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08088000)
|
if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
|
||||||
{
|
{
|
||||||
if (g_System->m_SaveUsing == SaveChip_Auto)
|
if (g_System->m_SaveUsing == SaveChip_Auto)
|
||||||
{
|
{
|
||||||
|
@ -122,7 +130,7 @@ void CDMA::PI_DMA_READ()
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
{
|
{
|
||||||
m_FlashRam.DmaToFlashram(
|
m_FlashRam.DmaToFlashram(
|
||||||
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
|
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
||||||
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
PI_RD_LEN_REG
|
PI_RD_LEN_REG
|
||||||
);
|
);
|
||||||
|
@ -134,7 +142,7 @@ void CDMA::PI_DMA_READ()
|
||||||
}
|
}
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("**** FLashRam DMA Read address %08X *****",g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("**** FLashRam DMA Read address %08X *****", g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
|
@ -152,7 +160,7 @@ void CDMA::PI_DMA_READ()
|
||||||
|
|
||||||
void CDMA::PI_DMA_WRITE()
|
void CDMA::PI_DMA_WRITE()
|
||||||
{
|
{
|
||||||
DWORD PI_WR_LEN_REG = ((g_Reg->PI_WR_LEN_REG) & 0x00FFFFFFul) + 1;
|
uint32_t PI_WR_LEN_REG = ((g_Reg->PI_WR_LEN_REG) & 0x00FFFFFFul) + 1;
|
||||||
|
|
||||||
if ((PI_WR_LEN_REG & 1) != 0)
|
if ((PI_WR_LEN_REG & 1) != 0)
|
||||||
{
|
{
|
||||||
|
@ -160,7 +168,7 @@ void CDMA::PI_DMA_WRITE()
|
||||||
}
|
}
|
||||||
|
|
||||||
g_Reg->PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
||||||
if ( g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG > g_MMU->RdramSize())
|
if (g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG > g_MMU->RdramSize())
|
||||||
{
|
{
|
||||||
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { g_Notify->DisplayError(stdstr_f("PI_DMA_WRITE not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG).ToUTF16().c_str()); }
|
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { g_Notify->DisplayError(stdstr_f("PI_DMA_WRITE not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG).ToUTF16().c_str()); }
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
|
@ -169,7 +177,7 @@ void CDMA::PI_DMA_WRITE()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08088000)
|
if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08088000)
|
||||||
{
|
{
|
||||||
if (g_System->m_SaveUsing == SaveChip_Auto)
|
if (g_System->m_SaveUsing == SaveChip_Auto)
|
||||||
{
|
{
|
||||||
|
@ -178,7 +186,7 @@ void CDMA::PI_DMA_WRITE()
|
||||||
if (g_System->m_SaveUsing == SaveChip_Sram)
|
if (g_System->m_SaveUsing == SaveChip_Sram)
|
||||||
{
|
{
|
||||||
m_Sram.DmaFromSram(
|
m_Sram.DmaFromSram(
|
||||||
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
|
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
||||||
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
PI_WR_LEN_REG
|
PI_WR_LEN_REG
|
||||||
);
|
);
|
||||||
|
@ -190,7 +198,7 @@ void CDMA::PI_DMA_WRITE()
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
{
|
{
|
||||||
m_FlashRam.DmaFromFlashram(
|
m_FlashRam.DmaFromFlashram(
|
||||||
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
|
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
||||||
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
PI_WR_LEN_REG
|
PI_WR_LEN_REG
|
||||||
);
|
);
|
||||||
|
@ -201,33 +209,33 @@ void CDMA::PI_DMA_WRITE()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FFFFFFF)
|
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FFFFFFF)
|
||||||
{
|
{
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
|
|
||||||
#ifdef tofix
|
#ifdef tofix
|
||||||
#ifdef ROM_IN_MAPSPACE
|
#ifdef ROM_IN_MAPSPACE
|
||||||
if (WrittenToRom)
|
if (WrittenToRom)
|
||||||
{
|
{
|
||||||
DWORD OldProtect;
|
uint32_t OldProtect;
|
||||||
VirtualProtect(ROM,m_RomFileSize,PAGE_READONLY, &OldProtect);
|
VirtualProtect(ROM,m_RomFileSize,PAGE_READONLY, &OldProtect);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BYTE * ROM = g_Rom->GetRomAddress();
|
uint8_t * ROM = g_Rom->GetRomAddress();
|
||||||
BYTE * RDRAM = g_MMU->Rdram();
|
uint8_t * RDRAM = g_MMU->Rdram();
|
||||||
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
||||||
if (g_Reg->PI_CART_ADDR_REG + PI_WR_LEN_REG < g_Rom->GetRomSize())
|
if (g_Reg->PI_CART_ADDR_REG + PI_WR_LEN_REG < g_Rom->GetRomSize())
|
||||||
{
|
{
|
||||||
for (i = 0; i < PI_WR_LEN_REG; i ++)
|
for (i = 0; i < PI_WR_LEN_REG; i++)
|
||||||
{
|
{
|
||||||
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
|
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_Reg->PI_CART_ADDR_REG >= g_Rom->GetRomSize())
|
else if (g_Reg->PI_CART_ADDR_REG >= g_Rom->GetRomSize())
|
||||||
{
|
{
|
||||||
DWORD cart = g_Reg->PI_CART_ADDR_REG - g_Rom->GetRomSize();
|
uint32_t cart = g_Reg->PI_CART_ADDR_REG - g_Rom->GetRomSize();
|
||||||
while (cart >= g_Rom->GetRomSize())
|
while (cart >= g_Rom->GetRomSize())
|
||||||
{
|
{
|
||||||
cart -= g_Rom->GetRomSize();
|
cart -= g_Rom->GetRomSize();
|
||||||
|
@ -239,15 +247,15 @@ void CDMA::PI_DMA_WRITE()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD Len;
|
uint32_t Len;
|
||||||
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
||||||
for (i = 0; i < Len; i ++)
|
for (i = 0; i < Len; i++)
|
||||||
{
|
{
|
||||||
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
|
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
|
||||||
}
|
}
|
||||||
for (i = Len; i < PI_WR_LEN_REG - Len; i ++)
|
for (i = Len; i < PI_WR_LEN_REG - Len; i++)
|
||||||
{
|
{
|
||||||
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
|
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_Reg->PI_CART_ADDR_REG += 0x10000000;
|
g_Reg->PI_CART_ADDR_REG += 0x10000000;
|
||||||
|
@ -259,13 +267,13 @@ void CDMA::PI_DMA_WRITE()
|
||||||
}
|
}
|
||||||
if (g_Recompiler && g_System->bSMM_PIDMA())
|
if (g_Recompiler && g_System->bSMM_PIDMA())
|
||||||
{
|
{
|
||||||
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG,CRecompiler::Remove_DMA);
|
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA);
|
||||||
}
|
}
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
//ChangeTimer(PiTimer,(int)(PI_WR_LEN_REG * 8.9) + 50);
|
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9) + 50);
|
||||||
//ChangeTimer(PiTimer,(int)(PI_WR_LEN_REG * 8.9));
|
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,7 +284,6 @@ void CDMA::PI_DMA_WRITE()
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::SP_DMA_READ()
|
void CDMA::SP_DMA_READ()
|
||||||
|
@ -305,19 +312,19 @@ void CDMA::SP_DMA_READ()
|
||||||
|
|
||||||
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
if (((g_Reg->SP_RD_LEN_REG + 1) & 3) != 0)
|
if (((g_Reg->SP_RD_LEN_REG + 1) & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy( g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG,
|
memcpy(g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG,
|
||||||
g_Reg->SP_RD_LEN_REG + 1 );
|
g_Reg->SP_RD_LEN_REG + 1);
|
||||||
|
|
||||||
g_Reg->SP_DMA_BUSY_REG = 0;
|
g_Reg->SP_DMA_BUSY_REG = 0;
|
||||||
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
||||||
|
@ -345,19 +352,19 @@ void CDMA::SP_DMA_WRITE()
|
||||||
|
|
||||||
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0)
|
if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy( g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF),
|
memcpy(g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF),
|
||||||
g_Reg->SP_WR_LEN_REG + 1);
|
g_Reg->SP_WR_LEN_REG + 1);
|
||||||
|
|
||||||
g_Reg->SP_DMA_BUSY_REG = 0;
|
g_Reg->SP_DMA_BUSY_REG = 0;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,6 +9,9 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Project64\Settings\Debug Settings.h>
|
||||||
|
#include <Project64\N64 System\Mips\FlashRam.h>
|
||||||
|
#include <Project64\N64 System\Mips\Sram.h>
|
||||||
|
|
||||||
class CDMA :
|
class CDMA :
|
||||||
private CDebugSettings
|
private CDebugSettings
|
||||||
|
@ -22,12 +25,12 @@ public:
|
||||||
void PI_DMA_WRITE();
|
void PI_DMA_WRITE();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CDMA (CFlashram & FlashRam, CSram & Sram);
|
CDMA(CFlashram & FlashRam, CSram & Sram);
|
||||||
|
|
||||||
//void SI_DMA_READ();
|
|
||||||
//void SI_DMA_WRITE();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
CDMA(const CDMA&); // Disable copy constructor
|
||||||
|
CDMA& operator=(const CDMA&); // Disable assignment
|
||||||
|
|
||||||
CFlashram & m_FlashRam;
|
CFlashram & m_FlashRam;
|
||||||
CSram & m_Sram;
|
CSram & m_Sram;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,13 +9,16 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "Eeprom.h"
|
||||||
|
#include <Project64\N64 System\System Globals.h>
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
CEeprom::CEeprom(bool ReadOnly):
|
CEeprom::CEeprom(bool ReadOnly) :
|
||||||
m_ReadOnly(ReadOnly),
|
m_ReadOnly(ReadOnly),
|
||||||
m_hFile(NULL)
|
m_hFile(NULL)
|
||||||
{
|
{
|
||||||
memset(m_EEPROM,0xFF,sizeof(m_EEPROM));
|
memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
|
||||||
}
|
}
|
||||||
|
|
||||||
CEeprom::~CEeprom()
|
CEeprom::~CEeprom()
|
||||||
|
@ -27,13 +30,13 @@ CEeprom::~CEeprom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char byte2bcd(int n)
|
uint8_t byte2bcd(int32_t n)
|
||||||
{
|
{
|
||||||
n %= 100;
|
n %= 100;
|
||||||
return (unsigned char)(((n / 10) << 4) | (n % 10));
|
return (uint8_t)(((n / 10) << 4) | (n % 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEeprom::EepromCommand ( BYTE * Command)
|
void CEeprom::EepromCommand(uint8_t * Command)
|
||||||
{
|
{
|
||||||
time_t curtime_time;
|
time_t curtime_time;
|
||||||
struct tm curtime;
|
struct tm curtime;
|
||||||
|
@ -64,7 +67,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Command[3] = 0x00;
|
Command[3] = 0x00;
|
||||||
Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K?0x80:0xC0;
|
Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K ? 0x80 : 0xC0;
|
||||||
Command[5] = 0x00;
|
Command[5] = 0x00;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -77,7 +80,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
||||||
}
|
}
|
||||||
ReadFrom(&Command[4],Command[3]);
|
ReadFrom(&Command[4], Command[3]);
|
||||||
break;
|
break;
|
||||||
case 5: //Write to Eeprom
|
case 5: //Write to Eeprom
|
||||||
if (Command[0] != 10 && bHaveDebugger())
|
if (Command[0] != 10 && bHaveDebugger())
|
||||||
|
@ -88,7 +91,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
||||||
}
|
}
|
||||||
WriteTo(&Command[4],Command[3]);
|
WriteTo(&Command[4], Command[3]);
|
||||||
break;
|
break;
|
||||||
case 6: //RTC Status query
|
case 6: //RTC Status query
|
||||||
Command[3] = 0x00;
|
Command[3] = 0x00;
|
||||||
|
@ -131,7 +134,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
|
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d",Command[2]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d", Command[2]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,9 +144,9 @@ void CEeprom::LoadEeprom()
|
||||||
CPath FileName;
|
CPath FileName;
|
||||||
DWORD dwRead;
|
DWORD dwRead;
|
||||||
|
|
||||||
memset(m_EEPROM,0xFF,sizeof(m_EEPROM));
|
memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
|
||||||
|
|
||||||
FileName.SetDriveDirectory( g_Settings->LoadStringVal(Directory_NativeSave).c_str());
|
FileName.SetDriveDirectory(g_Settings->LoadStringVal(Directory_NativeSave).c_str());
|
||||||
FileName.SetName(g_Settings->LoadStringVal(Game_GameName).c_str());
|
FileName.SetName(g_Settings->LoadStringVal(Game_GameName).c_str());
|
||||||
FileName.SetExtension("eep");
|
FileName.SetExtension("eep");
|
||||||
|
|
||||||
|
@ -152,47 +155,47 @@ void CEeprom::LoadEeprom()
|
||||||
FileName.DirectoryCreate();
|
FileName.DirectoryCreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hFile = CreateFile(FileName,m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,
|
m_hFile = CreateFile(FileName, m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
||||||
if (m_hFile == INVALID_HANDLE_VALUE)
|
if (m_hFile == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceError,__FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X",(LPCTSTR)FileName, m_ReadOnly, GetLastError());
|
WriteTraceF(TraceError, __FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X", (LPCTSTR)FileName, m_ReadOnly, GetLastError());
|
||||||
g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM));
|
g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
|
SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
|
||||||
ReadFile(m_hFile,m_EEPROM,sizeof(m_EEPROM),&dwRead,NULL);
|
ReadFile(m_hFile, m_EEPROM, sizeof(m_EEPROM), &dwRead, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEeprom::ReadFrom(BYTE * Buffer, int line)
|
void CEeprom::ReadFrom(uint8_t * Buffer, int32_t line)
|
||||||
{
|
{
|
||||||
int i;
|
int32_t i;
|
||||||
|
|
||||||
if (m_hFile == NULL)
|
if (m_hFile == NULL)
|
||||||
{
|
{
|
||||||
LoadEeprom();
|
LoadEeprom();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
Buffer[i] = m_EEPROM[line*8+i];
|
Buffer[i] = m_EEPROM[line * 8 + i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEeprom::WriteTo(BYTE * Buffer, int line)
|
void CEeprom::WriteTo(uint8_t * Buffer, int32_t line)
|
||||||
{
|
{
|
||||||
DWORD dwWritten;
|
DWORD dwWritten;
|
||||||
int i;
|
int32_t i;
|
||||||
|
|
||||||
if (m_hFile == NULL)
|
if (m_hFile == NULL)
|
||||||
{
|
{
|
||||||
LoadEeprom();
|
LoadEeprom();
|
||||||
}
|
}
|
||||||
for (i=0;i<8;i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
m_EEPROM[line*8+i]=Buffer[i];
|
m_EEPROM[line * 8 + i] = Buffer[i];
|
||||||
}
|
}
|
||||||
SetFilePointer(m_hFile,line*8,NULL,FILE_BEGIN);
|
SetFilePointer(m_hFile, line * 8, NULL, FILE_BEGIN);
|
||||||
WriteFile( m_hFile,Buffer,8,&dwWritten,NULL );
|
WriteFile(m_hFile, Buffer, 8, &dwWritten, NULL);
|
||||||
FlushFileBuffers(m_hFile);
|
FlushFileBuffers(m_hFile);
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -14,17 +14,21 @@ class CEeprom :
|
||||||
private CDebugSettings
|
private CDebugSettings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CEeprom ( bool ReadOnly );
|
CEeprom(bool ReadOnly);
|
||||||
~CEeprom();
|
~CEeprom();
|
||||||
|
|
||||||
void EepromCommand ( BYTE * Command );
|
void EepromCommand(uint8_t * Command);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadEeprom ();
|
CEeprom(void); // Disable default constructor
|
||||||
void ReadFrom ( BYTE * Buffer, int line );
|
CEeprom(const CEeprom&); // Disable copy constructor
|
||||||
void WriteTo ( BYTE * Buffer, int line );
|
CEeprom& operator=(const CEeprom&); // Disable assignment
|
||||||
|
|
||||||
BYTE m_EEPROM[0x800];
|
void LoadEeprom();
|
||||||
|
void ReadFrom(uint8_t * Buffer, int32_t line);
|
||||||
|
void WriteTo(uint8_t * Buffer, int32_t line);
|
||||||
|
|
||||||
|
uint8_t m_EEPROM[0x800];
|
||||||
bool m_ReadOnly;
|
bool m_ReadOnly;
|
||||||
HANDLE m_hFile;
|
void * m_hFile;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include <Project64\User Interface\LoggingUI.h>
|
||||||
|
|
||||||
int CPifRamSettings::m_RefCount = 0;
|
int CPifRamSettings::m_RefCount = 0;
|
||||||
bool CPifRamSettings::m_bShowPifRamErrors = false;
|
bool CPifRamSettings::m_bShowPifRamErrors = false;
|
||||||
|
@ -18,7 +19,7 @@ CPifRamSettings::CPifRamSettings()
|
||||||
m_RefCount += 1;
|
m_RefCount += 1;
|
||||||
if (m_RefCount == 1)
|
if (m_RefCount == 1)
|
||||||
{
|
{
|
||||||
g_Settings->RegisterChangeCB(Debugger_ShowPifErrors,NULL,RefreshSettings);
|
g_Settings->RegisterChangeCB(Debugger_ShowPifErrors, NULL, RefreshSettings);
|
||||||
RefreshSettings(NULL);
|
RefreshSettings(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +29,7 @@ CPifRamSettings::~CPifRamSettings()
|
||||||
m_RefCount -= 1;
|
m_RefCount -= 1;
|
||||||
if (m_RefCount == 0)
|
if (m_RefCount == 0)
|
||||||
{
|
{
|
||||||
g_Settings->UnregisterChangeCB(Debugger_ShowPifErrors,NULL,RefreshSettings);
|
g_Settings->UnregisterChangeCB(Debugger_ShowPifErrors, NULL, RefreshSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,21 +38,20 @@ void CPifRamSettings::RefreshSettings(void *)
|
||||||
m_bShowPifRamErrors = g_Settings->LoadBool(Debugger_ShowPifErrors);
|
m_bShowPifRamErrors = g_Settings->LoadBool(Debugger_ShowPifErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPifRam::CPifRam( bool SavesReadOnly ) :
|
CPifRam::CPifRam(bool SavesReadOnly) :
|
||||||
CEeprom(SavesReadOnly)
|
CEeprom(SavesReadOnly)
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
CPifRam::~CPifRam()
|
CPifRam::~CPifRam()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPifRam::Reset()
|
void CPifRam::Reset()
|
||||||
{
|
{
|
||||||
memset(m_PifRam,0,sizeof(m_PifRam));
|
memset(m_PifRam, 0, sizeof(m_PifRam));
|
||||||
memset(m_PifRom,0,sizeof(m_PifRom));
|
memset(m_PifRom, 0, sizeof(m_PifRom));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int length)
|
void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int length)
|
||||||
|
@ -86,7 +86,6 @@ void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int length)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CPifRam::PifRamRead()
|
void CPifRam::PifRamRead()
|
||||||
{
|
{
|
||||||
if (m_PifRam[0x3F] == 0x2)
|
if (m_PifRam[0x3F] == 0x2)
|
||||||
|
@ -97,7 +96,7 @@ void CPifRam::PifRamRead()
|
||||||
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
||||||
|
|
||||||
int Channel = 0;
|
int Channel = 0;
|
||||||
for (int CurPos = 0; CurPos < 0x40; CurPos ++)
|
for (int CurPos = 0; CurPos < 0x40; CurPos++)
|
||||||
{
|
{
|
||||||
switch (m_PifRam[CurPos])
|
switch (m_PifRam[CurPos])
|
||||||
{
|
{
|
||||||
|
@ -120,12 +119,12 @@ void CPifRam::PifRamRead()
|
||||||
{
|
{
|
||||||
if (g_Plugins->Control()->ReadController)
|
if (g_Plugins->Control()->ReadController)
|
||||||
{
|
{
|
||||||
g_Plugins->Control()->ReadController(Channel,&m_PifRam[CurPos]);
|
g_Plugins->Control()->ReadController(Channel, &m_PifRam[CurPos]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ReadControllerCommand(Channel,&m_PifRam[CurPos]);
|
ReadControllerCommand(Channel, &m_PifRam[CurPos]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CurPos += m_PifRam[CurPos] + (m_PifRam[CurPos + 1] & 0x3F) + 1;
|
CurPos += m_PifRam[CurPos] + (m_PifRam[CurPos + 1] & 0x3F) + 1;
|
||||||
|
@ -135,7 +134,7 @@ void CPifRam::PifRamRead()
|
||||||
{
|
{
|
||||||
if (bShowPifRamErrors())
|
if (bShowPifRamErrors())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("Unknown Command in PifRamRead(%X)",m_PifRam[CurPos]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("Unknown Command in PifRamRead(%X)", m_PifRam[CurPos]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
CurPos = 0x40;
|
CurPos = 0x40;
|
||||||
}
|
}
|
||||||
|
@ -144,7 +143,7 @@ void CPifRam::PifRamRead()
|
||||||
}
|
}
|
||||||
if (g_Plugins->Control()->ReadController)
|
if (g_Plugins->Control()->ReadController)
|
||||||
{
|
{
|
||||||
g_Plugins->Control()->ReadController(-1,NULL);
|
g_Plugins->Control()->ReadController(-1, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +152,7 @@ void CPifRam::PifRamWrite()
|
||||||
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
||||||
int Channel = 0, CurPos;
|
int Channel = 0, CurPos;
|
||||||
|
|
||||||
if ( m_PifRam[0x3F] > 0x1)
|
if (m_PifRam[0x3F] > 0x1)
|
||||||
{
|
{
|
||||||
switch (m_PifRam[0x3F])
|
switch (m_PifRam[0x3F])
|
||||||
{
|
{
|
||||||
|
@ -163,21 +162,21 @@ void CPifRam::PifRamWrite()
|
||||||
char Challenge[30], Response[30];
|
char Challenge[30], Response[30];
|
||||||
for (int i = 0; i < 15; i++)
|
for (int i = 0; i < 15; i++)
|
||||||
{
|
{
|
||||||
Challenge[i*2] = (m_PifRam[48+i] >> 4) & 0x0f;
|
Challenge[i * 2] = (m_PifRam[48 + i] >> 4) & 0x0f;
|
||||||
Challenge[i*2+1] = m_PifRam[48+i] & 0x0f;
|
Challenge[i * 2 + 1] = m_PifRam[48 + i] & 0x0f;
|
||||||
}
|
}
|
||||||
n64_cic_nus_6105(Challenge, Response, CHALLENGE_LENGTH - 2);
|
n64_cic_nus_6105(Challenge, Response, CHALLENGE_LENGTH - 2);
|
||||||
QWORD ResponseValue = 0;
|
QWORD ResponseValue = 0;
|
||||||
m_PifRam[46] = m_PifRam[47] = 0x00;
|
m_PifRam[46] = m_PifRam[47] = 0x00;
|
||||||
for (int z = 8; z > 0; z--)
|
for (int z = 8; z > 0; z--)
|
||||||
{
|
{
|
||||||
ResponseValue = (ResponseValue << 8) | ((Response[(z - 1)*2] << 4) + Response[(z - 1)*2+1]);
|
ResponseValue = (ResponseValue << 8) | ((Response[(z - 1) * 2] << 4) + Response[(z - 1) * 2 + 1]);
|
||||||
}
|
}
|
||||||
std::memcpy(&m_PifRam[48], &ResponseValue, sizeof(QWORD));
|
std::memcpy(&m_PifRam[48], &ResponseValue, sizeof(QWORD));
|
||||||
ResponseValue = 0;
|
ResponseValue = 0;
|
||||||
for (int z = 7; z > 0; z--)
|
for (int z = 7; z > 0; z--)
|
||||||
{
|
{
|
||||||
ResponseValue = (ResponseValue << 8) | ((Response[((z + 8) - 1)*2] << 4) + Response[((z + 8) - 1)*2+1]);
|
ResponseValue = (ResponseValue << 8) | ((Response[((z + 8) - 1) * 2] << 4) + Response[((z + 8) - 1) * 2 + 1]);
|
||||||
}
|
}
|
||||||
std::memcpy(&m_PifRam[56], &ResponseValue, sizeof(QWORD));
|
std::memcpy(&m_PifRam[56], &ResponseValue, sizeof(QWORD));
|
||||||
}
|
}
|
||||||
|
@ -189,18 +188,18 @@ void CPifRam::PifRamWrite()
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
break;
|
break;
|
||||||
case 0x10:
|
case 0x10:
|
||||||
memset(m_PifRom,0,0x7C0);
|
memset(m_PifRom, 0, 0x7C0);
|
||||||
break;
|
break;
|
||||||
case 0x30:
|
case 0x30:
|
||||||
m_PifRam[0x3F] = 0x80;
|
m_PifRam[0x3F] = 0x80;
|
||||||
break;
|
break;
|
||||||
case 0xC0:
|
case 0xC0:
|
||||||
memset(m_PifRam,0,0x40);
|
memset(m_PifRam, 0, 0x40);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (bShowPifRamErrors())
|
if (bShowPifRamErrors())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("Unkown PifRam control: %d",m_PifRam[0x3F]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("Unkown PifRam control: %d", m_PifRam[0x3F]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -229,12 +228,12 @@ void CPifRam::PifRamWrite()
|
||||||
{
|
{
|
||||||
if (g_Plugins->Control()->ControllerCommand)
|
if (g_Plugins->Control()->ControllerCommand)
|
||||||
{
|
{
|
||||||
g_Plugins->Control()->ControllerCommand(Channel,&m_PifRam[CurPos]);
|
g_Plugins->Control()->ControllerCommand(Channel, &m_PifRam[CurPos]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ProcessControllerCommand(Channel,&m_PifRam[CurPos]);
|
ProcessControllerCommand(Channel, &m_PifRam[CurPos]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Channel == 4)
|
else if (Channel == 4)
|
||||||
|
@ -255,7 +254,7 @@ void CPifRam::PifRamWrite()
|
||||||
{
|
{
|
||||||
if (bShowPifRamErrors())
|
if (bShowPifRamErrors())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("Unknown Command in PifRamWrite(%X)",m_PifRam[CurPos]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("Unknown Command in PifRamWrite(%X)", m_PifRam[CurPos]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
CurPos = 0x40;
|
CurPos = 0x40;
|
||||||
}
|
}
|
||||||
|
@ -265,7 +264,7 @@ void CPifRam::PifRamWrite()
|
||||||
m_PifRam[0x3F] = 0;
|
m_PifRam[0x3F] = 0;
|
||||||
if (g_Plugins->Control()->ControllerCommand)
|
if (g_Plugins->Control()->ControllerCommand)
|
||||||
{
|
{
|
||||||
g_Plugins->Control()->ControllerCommand(-1,NULL);
|
g_Plugins->Control()->ControllerCommand(-1, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,37 +307,37 @@ void CPifRam::SI_DMA_READ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_LogOptions.LogPRDMAMemStores)
|
if (LogPRDMAMemStores())
|
||||||
{
|
{
|
||||||
int32_t count;
|
int32_t count;
|
||||||
char HexData[100], AsciiData[100], Addon[20];
|
char HexData[100], AsciiData[100], Addon[20];
|
||||||
LogMessage("\tData DMAed to RDRAM:");
|
LogMessage("\tData DMAed to RDRAM:");
|
||||||
LogMessage("\t--------------------");
|
LogMessage("\t--------------------");
|
||||||
for (count = 0; count < 16; count ++ )
|
for (count = 0; count < 16; count++)
|
||||||
{
|
{
|
||||||
if ((count % 4) == 0)
|
if ((count % 4) == 0)
|
||||||
{
|
{
|
||||||
sprintf(HexData,"\0");
|
sprintf(HexData, "\0");
|
||||||
sprintf(AsciiData,"\0");
|
sprintf(AsciiData, "\0");
|
||||||
}
|
}
|
||||||
sprintf(Addon,"%02X %02X %02X %02X",
|
sprintf(Addon, "%02X %02X %02X %02X",
|
||||||
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
||||||
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3] );
|
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3]);
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
if (((count + 1) % 4) != 0)
|
if (((count + 1) % 4) != 0)
|
||||||
{
|
{
|
||||||
sprintf(Addon,"-");
|
sprintf(Addon, "-");
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(Addon,"%c%c%c%c",
|
sprintf(Addon, "%c%c%c%c",
|
||||||
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
||||||
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3] );
|
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3]);
|
||||||
strcat(AsciiData,Addon);
|
strcat(AsciiData, Addon);
|
||||||
|
|
||||||
if (((count + 1) % 4) == 0)
|
if (((count + 1) % 4) == 0)
|
||||||
{
|
{
|
||||||
LogMessage("\t%s %s",HexData, AsciiData);
|
LogMessage("\t%s %s", HexData, AsciiData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LogMessage("");
|
LogMessage("");
|
||||||
|
@ -394,38 +393,38 @@ void CPifRam::SI_DMA_WRITE()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_LogOptions.LogPRDMAMemLoads)
|
if (LogPRDMAMemLoads())
|
||||||
{
|
{
|
||||||
int32_t count;
|
int32_t count;
|
||||||
char HexData[100], AsciiData[100], Addon[20];
|
char HexData[100], AsciiData[100], Addon[20];
|
||||||
LogMessage("");
|
LogMessage("");
|
||||||
LogMessage("\tData DMAed to the Pif Ram:");
|
LogMessage("\tData DMAed to the Pif Ram:");
|
||||||
LogMessage("\t--------------------------");
|
LogMessage("\t--------------------------");
|
||||||
for (count = 0; count < 16; count ++ )
|
for (count = 0; count < 16; count++)
|
||||||
{
|
{
|
||||||
if ((count % 4) == 0)
|
if ((count % 4) == 0)
|
||||||
{
|
{
|
||||||
sprintf(HexData,"\0");
|
sprintf(HexData, "\0");
|
||||||
sprintf(AsciiData,"\0");
|
sprintf(AsciiData, "\0");
|
||||||
}
|
}
|
||||||
sprintf(Addon,"%02X %02X %02X %02X",
|
sprintf(Addon, "%02X %02X %02X %02X",
|
||||||
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
||||||
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3] );
|
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3]);
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
if (((count + 1) % 4) != 0)
|
if (((count + 1) % 4) != 0)
|
||||||
{
|
{
|
||||||
sprintf(Addon,"-");
|
sprintf(Addon, "-");
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(Addon,"%c%c%c%c",
|
sprintf(Addon, "%c%c%c%c",
|
||||||
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1],
|
||||||
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3] );
|
m_PifRam[(count << 2) + 2], m_PifRam[(count << 2) + 3]);
|
||||||
strcat(AsciiData,Addon);
|
strcat(AsciiData, Addon);
|
||||||
|
|
||||||
if (((count + 1) % 4) == 0)
|
if (((count + 1) % 4) == 0)
|
||||||
{
|
{
|
||||||
LogMessage("\t%s %s",HexData, AsciiData);
|
LogMessage("\t%s %s", HexData, AsciiData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LogMessage("");
|
LogMessage("");
|
||||||
|
@ -445,7 +444,7 @@ void CPifRam::SI_DMA_WRITE()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
void CPifRam::ProcessControllerCommand(int Control, BYTE * Command)
|
||||||
{
|
{
|
||||||
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
||||||
|
|
||||||
|
@ -472,7 +471,7 @@ void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
||||||
{
|
{
|
||||||
Command[3] = 0x05;
|
Command[3] = 0x05;
|
||||||
Command[4] = 0x00;
|
Command[4] = 0x00;
|
||||||
switch ( Controllers[Control].Plugin)
|
switch (Controllers[Control].Plugin)
|
||||||
{
|
{
|
||||||
case PLUGIN_TANSFER_PAK:
|
case PLUGIN_TANSFER_PAK:
|
||||||
case PLUGIN_RUMBLE_PAK:
|
case PLUGIN_RUMBLE_PAK:
|
||||||
|
@ -505,7 +504,7 @@ void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02: //read from controller pack
|
case 0x02: //read from controller pack
|
||||||
if (g_LogOptions.LogControllerPak)
|
if (LogControllerPak())
|
||||||
{
|
{
|
||||||
LogControllerPakData("Read: Before Gettting Results");
|
LogControllerPakData("Read: Before Gettting Results");
|
||||||
}
|
}
|
||||||
|
@ -541,13 +540,13 @@ void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
||||||
{
|
{
|
||||||
Command[1] |= 0x80;
|
Command[1] |= 0x80;
|
||||||
}
|
}
|
||||||
if (g_LogOptions.LogControllerPak)
|
if (LogControllerPak())
|
||||||
{
|
{
|
||||||
LogControllerPakData("Read: After Gettting Results");
|
LogControllerPakData("Read: After Gettting Results");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x03: //write controller pak
|
case 0x03: //write controller pak
|
||||||
if (g_LogOptions.LogControllerPak)
|
if (LogControllerPak())
|
||||||
{
|
{
|
||||||
LogControllerPakData("Write: Before Processing");
|
LogControllerPakData("Write: Before Processing");
|
||||||
}
|
}
|
||||||
|
@ -581,7 +580,7 @@ void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
||||||
{
|
{
|
||||||
Command[1] |= 0x80;
|
Command[1] |= 0x80;
|
||||||
}
|
}
|
||||||
if (g_LogOptions.LogControllerPak)
|
if (LogControllerPak())
|
||||||
{
|
{
|
||||||
LogControllerPakData("Write: After Processing");
|
LogControllerPakData("Write: After Processing");
|
||||||
}
|
}
|
||||||
|
@ -589,12 +588,12 @@ void CPifRam::ProcessControllerCommand ( int Control, BYTE * Command)
|
||||||
default:
|
default:
|
||||||
if (bShowPifRamErrors())
|
if (bShowPifRamErrors())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("Unknown ControllerCommand %d",Command[2]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("Unknown ControllerCommand %d", Command[2]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPifRam::ReadControllerCommand (int Control, BYTE * Command) {
|
void CPifRam::ReadControllerCommand(int Control, BYTE * Command) {
|
||||||
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
CONTROL * Controllers = g_Plugins->Control()->PluginControllers();
|
||||||
|
|
||||||
switch (Command[2])
|
switch (Command[2])
|
||||||
|
@ -633,29 +632,29 @@ void CPifRam::ReadControllerCommand (int Control, BYTE * Command) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPifRam::LogControllerPakData (char * Description)
|
void CPifRam::LogControllerPakData(char * Description)
|
||||||
{
|
{
|
||||||
BYTE * PIF_Ram = g_MMU->PifRam();
|
BYTE * PIF_Ram = g_MMU->PifRam();
|
||||||
|
|
||||||
int count, count2;
|
int count, count2;
|
||||||
char HexData[100], AsciiData[100], Addon[20];
|
char HexData[100], AsciiData[100], Addon[20];
|
||||||
LogMessage("\t%s:",Description);
|
LogMessage("\t%s:", Description);
|
||||||
LogMessage("\t------------------------------");
|
LogMessage("\t------------------------------");
|
||||||
for (count = 0; count < 16; count ++ )
|
for (count = 0; count < 16; count++)
|
||||||
{
|
{
|
||||||
if ((count % 4) == 0)
|
if ((count % 4) == 0)
|
||||||
{
|
{
|
||||||
sprintf(HexData,"\0");
|
sprintf(HexData, "\0");
|
||||||
sprintf(AsciiData,"\0");
|
sprintf(AsciiData, "\0");
|
||||||
}
|
}
|
||||||
sprintf(Addon,"%02X %02X %02X %02X",
|
sprintf(Addon, "%02X %02X %02X %02X",
|
||||||
PIF_Ram[(count << 2) + 0], PIF_Ram[(count << 2) + 1],
|
PIF_Ram[(count << 2) + 0], PIF_Ram[(count << 2) + 1],
|
||||||
PIF_Ram[(count << 2) + 2], PIF_Ram[(count << 2) + 3] );
|
PIF_Ram[(count << 2) + 2], PIF_Ram[(count << 2) + 3]);
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
if (((count + 1) % 4) != 0)
|
if (((count + 1) % 4) != 0)
|
||||||
{
|
{
|
||||||
sprintf(Addon,"-");
|
sprintf(Addon, "-");
|
||||||
strcat(HexData,Addon);
|
strcat(HexData, Addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
Addon[0] = 0;
|
Addon[0] = 0;
|
||||||
|
@ -663,18 +662,18 @@ void CPifRam::LogControllerPakData (char * Description)
|
||||||
{
|
{
|
||||||
if (PIF_Ram[(count << 2) + count2] < 30)
|
if (PIF_Ram[(count << 2) + count2] < 30)
|
||||||
{
|
{
|
||||||
strcat(Addon,".");
|
strcat(Addon, ".");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(Addon,"%s%c",Addon,PIF_Ram[(count << 2) + count2]);
|
sprintf(Addon, "%s%c", Addon, PIF_Ram[(count << 2) + count2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strcat(AsciiData,Addon);
|
strcat(AsciiData, Addon);
|
||||||
|
|
||||||
if (((count + 1) % 4) == 0)
|
if (((count + 1) % 4) == 0)
|
||||||
{
|
{
|
||||||
LogMessage("\t%s %s",HexData, AsciiData);
|
LogMessage("\t%s %s", HexData, AsciiData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LogMessage("");
|
LogMessage("");
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\Logging.h>
|
||||||
class CPifRamSettings
|
class CPifRamSettings
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -31,6 +32,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPifRam :
|
class CPifRam :
|
||||||
|
public CLogging,
|
||||||
private CPifRamSettings,
|
private CPifRamSettings,
|
||||||
private CEeprom
|
private CEeprom
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,42 +9,43 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include <Project64\User Interface\LoggingUI.h>
|
||||||
|
|
||||||
const char * CRegName::GPR[32] = {"r0","at","v0","v1","a0","a1","a2","a3",
|
const char * CRegName::GPR[32] = { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
|
||||||
"t0","t1","t2","t3","t4","t5","t6","t7",
|
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
|
||||||
"s0","s1","s2","s3","s4","s5","s6","s7",
|
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
|
||||||
"t8","t9","k0","k1","gp","sp","s8","ra"};
|
"t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" };
|
||||||
|
|
||||||
const char *CRegName::GPR_Hi[32] = {"r0.HI","at.HI","v0.HI","v1.HI","a0.HI","a1.HI",
|
const char *CRegName::GPR_Hi[32] = { "r0.HI", "at.HI", "v0.HI", "v1.HI", "a0.HI", "a1.HI",
|
||||||
"a2.HI","a3.HI","t0.HI","t1.HI","t2.HI","t3.HI",
|
"a2.HI", "a3.HI", "t0.HI", "t1.HI", "t2.HI", "t3.HI",
|
||||||
"t4.HI","t5.HI","t6.HI","t7.HI","s0.HI","s1.HI",
|
"t4.HI", "t5.HI", "t6.HI", "t7.HI", "s0.HI", "s1.HI",
|
||||||
"s2.HI","s3.HI","s4.HI","s5.HI","s6.HI","s7.HI",
|
"s2.HI", "s3.HI", "s4.HI", "s5.HI", "s6.HI", "s7.HI",
|
||||||
"t8.HI","t9.HI","k0.HI","k1.HI","gp.HI","sp.HI",
|
"t8.HI", "t9.HI", "k0.HI", "k1.HI", "gp.HI", "sp.HI",
|
||||||
"s8.HI","ra.HI"};
|
"s8.HI", "ra.HI" };
|
||||||
|
|
||||||
const char *CRegName::GPR_Lo[32] = {"r0.LO","at.LO","v0.LO","v1.LO","a0.LO","a1.LO",
|
const char *CRegName::GPR_Lo[32] = { "r0.LO", "at.LO", "v0.LO", "v1.LO", "a0.LO", "a1.LO",
|
||||||
"a2.LO","a3.LO","t0.LO","t1.LO","t2.LO","t3.LO",
|
"a2.LO", "a3.LO", "t0.LO", "t1.LO", "t2.LO", "t3.LO",
|
||||||
"t4.LO","t5.LO","t6.LO","t7.LO","s0.LO","s1.LO",
|
"t4.LO", "t5.LO", "t6.LO", "t7.LO", "s0.LO", "s1.LO",
|
||||||
"s2.LO","s3.LO","s4.LO","s5.LO","s6.LO","s7.LO",
|
"s2.LO", "s3.LO", "s4.LO", "s5.LO", "s6.LO", "s7.LO",
|
||||||
"t8.LO","t9.LO","k0.LO","k1.LO","gp.LO","sp.LO",
|
"t8.LO", "t9.LO", "k0.LO", "k1.LO", "gp.LO", "sp.LO",
|
||||||
"s8.LO","ra.LO"};
|
"s8.LO", "ra.LO" };
|
||||||
|
|
||||||
const char * CRegName::Cop0[32] = {"Index","Random","EntryLo0","EntryLo1","Context","PageMask","Wired","",
|
const char * CRegName::Cop0[32] = { "Index", "Random", "EntryLo0", "EntryLo1", "Context", "PageMask", "Wired", "",
|
||||||
"BadVAddr","Count","EntryHi","Compare","Status","Cause","EPC","PRId",
|
"BadVAddr", "Count", "EntryHi", "Compare", "Status", "Cause", "EPC", "PRId",
|
||||||
"Config","LLAddr","WatchLo","WatchHi","XContext","","","",
|
"Config", "LLAddr", "WatchLo", "WatchHi", "XContext", "", "", "",
|
||||||
"","","ECC","CacheErr","TagLo","TagHi","ErrEPC",""};
|
"", "", "ECC", "CacheErr", "TagLo", "TagHi", "ErrEPC", "" };
|
||||||
|
|
||||||
const char * CRegName::FPR[32] = {"f0","f1","f2","f3","f4","f5","f6","f7",
|
const char * CRegName::FPR[32] = { "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
|
||||||
"f8","f9","f10","f11","f12","f13","f14","f15",
|
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
||||||
"f16","f17","f18","f19","f20","f21","f22","f23",
|
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
||||||
"f24","f25","f26","f27","f28","f29","f30","f31"};
|
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" };
|
||||||
|
|
||||||
const char * CRegName::FPR_Ctrl[32] = {"Revision","Unknown","Unknown","Unknown","Unknown",
|
const char * CRegName::FPR_Ctrl[32] = { "Revision", "Unknown", "Unknown", "Unknown", "Unknown",
|
||||||
"Unknown","Unknown","Unknown","Unknown","Unknown","Unknown",
|
"Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
|
||||||
"Unknown","Unknown","Unknown","Unknown","Unknown","Unknown",
|
"Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
|
||||||
"Unknown","Unknown","Unknown","Unknown","Unknown","Unknown",
|
"Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
|
||||||
"Unknown","Unknown","Unknown","Unknown","Unknown","Unknown",
|
"Unknown", "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
|
||||||
"Unknown","Unknown","FCSR"};
|
"Unknown", "Unknown", "FCSR" };
|
||||||
|
|
||||||
uint32_t * CSystemRegisters::_PROGRAM_COUNTER = NULL;
|
uint32_t * CSystemRegisters::_PROGRAM_COUNTER = NULL;
|
||||||
MIPS_DWORD * CSystemRegisters::_GPR = NULL;
|
MIPS_DWORD * CSystemRegisters::_GPR = NULL;
|
||||||
|
@ -59,169 +60,169 @@ uint32_t * CSystemRegisters::_LLBit = NULL;
|
||||||
ROUNDING_MODE * CSystemRegisters::_RoundingModel = NULL;
|
ROUNDING_MODE * CSystemRegisters::_RoundingModel = NULL;
|
||||||
|
|
||||||
CP0registers::CP0registers(uint32_t * _CP0) :
|
CP0registers::CP0registers(uint32_t * _CP0) :
|
||||||
INDEX_REGISTER(_CP0[0]),
|
INDEX_REGISTER(_CP0[0]),
|
||||||
RANDOM_REGISTER(_CP0[1]),
|
RANDOM_REGISTER(_CP0[1]),
|
||||||
ENTRYLO0_REGISTER(_CP0[2]),
|
ENTRYLO0_REGISTER(_CP0[2]),
|
||||||
ENTRYLO1_REGISTER(_CP0[3]),
|
ENTRYLO1_REGISTER(_CP0[3]),
|
||||||
CONTEXT_REGISTER(_CP0[4]),
|
CONTEXT_REGISTER(_CP0[4]),
|
||||||
PAGE_MASK_REGISTER(_CP0[5]),
|
PAGE_MASK_REGISTER(_CP0[5]),
|
||||||
WIRED_REGISTER(_CP0[6]),
|
WIRED_REGISTER(_CP0[6]),
|
||||||
BAD_VADDR_REGISTER(_CP0[8]),
|
BAD_VADDR_REGISTER(_CP0[8]),
|
||||||
COUNT_REGISTER(_CP0[9]),
|
COUNT_REGISTER(_CP0[9]),
|
||||||
ENTRYHI_REGISTER(_CP0[10]),
|
ENTRYHI_REGISTER(_CP0[10]),
|
||||||
COMPARE_REGISTER(_CP0[11]),
|
COMPARE_REGISTER(_CP0[11]),
|
||||||
STATUS_REGISTER(_CP0[12]),
|
STATUS_REGISTER(_CP0[12]),
|
||||||
CAUSE_REGISTER(_CP0[13]),
|
CAUSE_REGISTER(_CP0[13]),
|
||||||
EPC_REGISTER(_CP0[14]),
|
EPC_REGISTER(_CP0[14]),
|
||||||
CONFIG_REGISTER(_CP0[16]),
|
CONFIG_REGISTER(_CP0[16]),
|
||||||
TAGLO_REGISTER(_CP0[28]),
|
TAGLO_REGISTER(_CP0[28]),
|
||||||
TAGHI_REGISTER(_CP0[29]),
|
TAGHI_REGISTER(_CP0[29]),
|
||||||
ERROREPC_REGISTER(_CP0[30]),
|
ERROREPC_REGISTER(_CP0[30]),
|
||||||
FAKE_CAUSE_REGISTER(_CP0[32])
|
FAKE_CAUSE_REGISTER(_CP0[32])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Rdram_InterfaceReg::Rdram_InterfaceReg(uint32_t * _RdramInterface) :
|
Rdram_InterfaceReg::Rdram_InterfaceReg(uint32_t * _RdramInterface) :
|
||||||
RDRAM_CONFIG_REG(_RdramInterface[0]),
|
RDRAM_CONFIG_REG(_RdramInterface[0]),
|
||||||
RDRAM_DEVICE_TYPE_REG(_RdramInterface[0]),
|
RDRAM_DEVICE_TYPE_REG(_RdramInterface[0]),
|
||||||
RDRAM_DEVICE_ID_REG(_RdramInterface[1]),
|
RDRAM_DEVICE_ID_REG(_RdramInterface[1]),
|
||||||
RDRAM_DELAY_REG(_RdramInterface[2]),
|
RDRAM_DELAY_REG(_RdramInterface[2]),
|
||||||
RDRAM_MODE_REG(_RdramInterface[3]),
|
RDRAM_MODE_REG(_RdramInterface[3]),
|
||||||
RDRAM_REF_INTERVAL_REG(_RdramInterface[4]),
|
RDRAM_REF_INTERVAL_REG(_RdramInterface[4]),
|
||||||
RDRAM_REF_ROW_REG(_RdramInterface[5]),
|
RDRAM_REF_ROW_REG(_RdramInterface[5]),
|
||||||
RDRAM_RAS_INTERVAL_REG(_RdramInterface[6]),
|
RDRAM_RAS_INTERVAL_REG(_RdramInterface[6]),
|
||||||
RDRAM_MIN_INTERVAL_REG(_RdramInterface[7]),
|
RDRAM_MIN_INTERVAL_REG(_RdramInterface[7]),
|
||||||
RDRAM_ADDR_SELECT_REG(_RdramInterface[8]),
|
RDRAM_ADDR_SELECT_REG(_RdramInterface[8]),
|
||||||
RDRAM_DEVICE_MANUF_REG(_RdramInterface[9])
|
RDRAM_DEVICE_MANUF_REG(_RdramInterface[9])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Mips_InterfaceReg::Mips_InterfaceReg(uint32_t * _MipsInterface) :
|
Mips_InterfaceReg::Mips_InterfaceReg(uint32_t * _MipsInterface) :
|
||||||
MI_INIT_MODE_REG(_MipsInterface[0]),
|
MI_INIT_MODE_REG(_MipsInterface[0]),
|
||||||
MI_MODE_REG(_MipsInterface[0]),
|
MI_MODE_REG(_MipsInterface[0]),
|
||||||
MI_VERSION_REG(_MipsInterface[1]),
|
MI_VERSION_REG(_MipsInterface[1]),
|
||||||
MI_NOOP_REG(_MipsInterface[1]),
|
MI_NOOP_REG(_MipsInterface[1]),
|
||||||
MI_INTR_REG(_MipsInterface[2]),
|
MI_INTR_REG(_MipsInterface[2]),
|
||||||
MI_INTR_MASK_REG(_MipsInterface[3])
|
MI_INTR_MASK_REG(_MipsInterface[3])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Video_InterfaceReg::Video_InterfaceReg(uint32_t * _VideoInterface) :
|
Video_InterfaceReg::Video_InterfaceReg(uint32_t * _VideoInterface) :
|
||||||
VI_STATUS_REG(_VideoInterface[0]),
|
VI_STATUS_REG(_VideoInterface[0]),
|
||||||
VI_CONTROL_REG(_VideoInterface[0]),
|
VI_CONTROL_REG(_VideoInterface[0]),
|
||||||
VI_ORIGIN_REG(_VideoInterface[1]),
|
VI_ORIGIN_REG(_VideoInterface[1]),
|
||||||
VI_DRAM_ADDR_REG(_VideoInterface[1]),
|
VI_DRAM_ADDR_REG(_VideoInterface[1]),
|
||||||
VI_WIDTH_REG(_VideoInterface[2]),
|
VI_WIDTH_REG(_VideoInterface[2]),
|
||||||
VI_H_WIDTH_REG(_VideoInterface[2]),
|
VI_H_WIDTH_REG(_VideoInterface[2]),
|
||||||
VI_INTR_REG(_VideoInterface[3]),
|
VI_INTR_REG(_VideoInterface[3]),
|
||||||
VI_V_INTR_REG(_VideoInterface[3]),
|
VI_V_INTR_REG(_VideoInterface[3]),
|
||||||
VI_CURRENT_REG(_VideoInterface[4]),
|
VI_CURRENT_REG(_VideoInterface[4]),
|
||||||
VI_V_CURRENT_LINE_REG(_VideoInterface[4]),
|
VI_V_CURRENT_LINE_REG(_VideoInterface[4]),
|
||||||
VI_BURST_REG(_VideoInterface[5]),
|
VI_BURST_REG(_VideoInterface[5]),
|
||||||
VI_TIMING_REG(_VideoInterface[5]),
|
VI_TIMING_REG(_VideoInterface[5]),
|
||||||
VI_V_SYNC_REG(_VideoInterface[6]),
|
VI_V_SYNC_REG(_VideoInterface[6]),
|
||||||
VI_H_SYNC_REG(_VideoInterface[7]),
|
VI_H_SYNC_REG(_VideoInterface[7]),
|
||||||
VI_LEAP_REG(_VideoInterface[8]),
|
VI_LEAP_REG(_VideoInterface[8]),
|
||||||
VI_H_SYNC_LEAP_REG(_VideoInterface[8]),
|
VI_H_SYNC_LEAP_REG(_VideoInterface[8]),
|
||||||
VI_H_START_REG(_VideoInterface[9]),
|
VI_H_START_REG(_VideoInterface[9]),
|
||||||
VI_H_VIDEO_REG(_VideoInterface[9]),
|
VI_H_VIDEO_REG(_VideoInterface[9]),
|
||||||
VI_V_START_REG(_VideoInterface[10]),
|
VI_V_START_REG(_VideoInterface[10]),
|
||||||
VI_V_VIDEO_REG(_VideoInterface[10]),
|
VI_V_VIDEO_REG(_VideoInterface[10]),
|
||||||
VI_V_BURST_REG(_VideoInterface[11]),
|
VI_V_BURST_REG(_VideoInterface[11]),
|
||||||
VI_X_SCALE_REG(_VideoInterface[12]),
|
VI_X_SCALE_REG(_VideoInterface[12]),
|
||||||
VI_Y_SCALE_REG(_VideoInterface[13])
|
VI_Y_SCALE_REG(_VideoInterface[13])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioInterfaceReg::AudioInterfaceReg(uint32_t * _AudioInterface) :
|
AudioInterfaceReg::AudioInterfaceReg(uint32_t * _AudioInterface) :
|
||||||
AI_DRAM_ADDR_REG(_AudioInterface[0]),
|
AI_DRAM_ADDR_REG(_AudioInterface[0]),
|
||||||
AI_LEN_REG(_AudioInterface[1]),
|
AI_LEN_REG(_AudioInterface[1]),
|
||||||
AI_CONTROL_REG(_AudioInterface[2]),
|
AI_CONTROL_REG(_AudioInterface[2]),
|
||||||
AI_STATUS_REG(_AudioInterface[3]),
|
AI_STATUS_REG(_AudioInterface[3]),
|
||||||
AI_DACRATE_REG(_AudioInterface[4]),
|
AI_DACRATE_REG(_AudioInterface[4]),
|
||||||
AI_BITRATE_REG(_AudioInterface[5])
|
AI_BITRATE_REG(_AudioInterface[5])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PeripheralInterfaceReg::PeripheralInterfaceReg(uint32_t * PeripheralInterface) :
|
PeripheralInterfaceReg::PeripheralInterfaceReg(uint32_t * PeripheralInterface) :
|
||||||
PI_DRAM_ADDR_REG(PeripheralInterface[0]),
|
PI_DRAM_ADDR_REG(PeripheralInterface[0]),
|
||||||
PI_CART_ADDR_REG(PeripheralInterface[1]),
|
PI_CART_ADDR_REG(PeripheralInterface[1]),
|
||||||
PI_RD_LEN_REG(PeripheralInterface[2]),
|
PI_RD_LEN_REG(PeripheralInterface[2]),
|
||||||
PI_WR_LEN_REG(PeripheralInterface[3]),
|
PI_WR_LEN_REG(PeripheralInterface[3]),
|
||||||
PI_STATUS_REG(PeripheralInterface[4]),
|
PI_STATUS_REG(PeripheralInterface[4]),
|
||||||
PI_BSD_DOM1_LAT_REG(PeripheralInterface[5]),
|
PI_BSD_DOM1_LAT_REG(PeripheralInterface[5]),
|
||||||
PI_DOMAIN1_REG(PeripheralInterface[5]),
|
PI_DOMAIN1_REG(PeripheralInterface[5]),
|
||||||
PI_BSD_DOM1_PWD_REG(PeripheralInterface[6]),
|
PI_BSD_DOM1_PWD_REG(PeripheralInterface[6]),
|
||||||
PI_BSD_DOM1_PGS_REG(PeripheralInterface[7]),
|
PI_BSD_DOM1_PGS_REG(PeripheralInterface[7]),
|
||||||
PI_BSD_DOM1_RLS_REG(PeripheralInterface[8]),
|
PI_BSD_DOM1_RLS_REG(PeripheralInterface[8]),
|
||||||
PI_BSD_DOM2_LAT_REG(PeripheralInterface[9]),
|
PI_BSD_DOM2_LAT_REG(PeripheralInterface[9]),
|
||||||
PI_DOMAIN2_REG(PeripheralInterface[9]),
|
PI_DOMAIN2_REG(PeripheralInterface[9]),
|
||||||
PI_BSD_DOM2_PWD_REG(PeripheralInterface[10]),
|
PI_BSD_DOM2_PWD_REG(PeripheralInterface[10]),
|
||||||
PI_BSD_DOM2_PGS_REG(PeripheralInterface[11]),
|
PI_BSD_DOM2_PGS_REG(PeripheralInterface[11]),
|
||||||
PI_BSD_DOM2_RLS_REG(PeripheralInterface[12])
|
PI_BSD_DOM2_RLS_REG(PeripheralInterface[12])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
RDRAMInt_InterfaceReg::RDRAMInt_InterfaceReg(uint32_t * RdramInterface) :
|
RDRAMInt_InterfaceReg::RDRAMInt_InterfaceReg(uint32_t * RdramInterface) :
|
||||||
RI_MODE_REG(RdramInterface[0]),
|
RI_MODE_REG(RdramInterface[0]),
|
||||||
RI_CONFIG_REG(RdramInterface[1]),
|
RI_CONFIG_REG(RdramInterface[1]),
|
||||||
RI_CURRENT_LOAD_REG(RdramInterface[2]),
|
RI_CURRENT_LOAD_REG(RdramInterface[2]),
|
||||||
RI_SELECT_REG(RdramInterface[3]),
|
RI_SELECT_REG(RdramInterface[3]),
|
||||||
RI_COUNT_REG(RdramInterface[4]),
|
RI_COUNT_REG(RdramInterface[4]),
|
||||||
RI_REFRESH_REG(RdramInterface[4]),
|
RI_REFRESH_REG(RdramInterface[4]),
|
||||||
RI_LATENCY_REG(RdramInterface[5]),
|
RI_LATENCY_REG(RdramInterface[5]),
|
||||||
RI_RERROR_REG(RdramInterface[6]),
|
RI_RERROR_REG(RdramInterface[6]),
|
||||||
RI_WERROR_REG(RdramInterface[7])
|
RI_WERROR_REG(RdramInterface[7])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayControlReg::DisplayControlReg(uint32_t * _DisplayProcessor) :
|
DisplayControlReg::DisplayControlReg(uint32_t * _DisplayProcessor) :
|
||||||
DPC_START_REG(_DisplayProcessor[0]),
|
DPC_START_REG(_DisplayProcessor[0]),
|
||||||
DPC_END_REG(_DisplayProcessor[1]),
|
DPC_END_REG(_DisplayProcessor[1]),
|
||||||
DPC_CURRENT_REG(_DisplayProcessor[2]),
|
DPC_CURRENT_REG(_DisplayProcessor[2]),
|
||||||
DPC_STATUS_REG(_DisplayProcessor[3]),
|
DPC_STATUS_REG(_DisplayProcessor[3]),
|
||||||
DPC_CLOCK_REG(_DisplayProcessor[4]),
|
DPC_CLOCK_REG(_DisplayProcessor[4]),
|
||||||
DPC_BUFBUSY_REG(_DisplayProcessor[5]),
|
DPC_BUFBUSY_REG(_DisplayProcessor[5]),
|
||||||
DPC_PIPEBUSY_REG(_DisplayProcessor[6]),
|
DPC_PIPEBUSY_REG(_DisplayProcessor[6]),
|
||||||
DPC_TMEM_REG(_DisplayProcessor[7])
|
DPC_TMEM_REG(_DisplayProcessor[7])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SigProcessor_InterfaceReg::SigProcessor_InterfaceReg(uint32_t * _SignalProcessorInterface) :
|
SigProcessor_InterfaceReg::SigProcessor_InterfaceReg(uint32_t * _SignalProcessorInterface) :
|
||||||
SP_MEM_ADDR_REG(_SignalProcessorInterface[0]),
|
SP_MEM_ADDR_REG(_SignalProcessorInterface[0]),
|
||||||
SP_DRAM_ADDR_REG(_SignalProcessorInterface[1]),
|
SP_DRAM_ADDR_REG(_SignalProcessorInterface[1]),
|
||||||
SP_RD_LEN_REG(_SignalProcessorInterface[2]),
|
SP_RD_LEN_REG(_SignalProcessorInterface[2]),
|
||||||
SP_WR_LEN_REG(_SignalProcessorInterface[3]),
|
SP_WR_LEN_REG(_SignalProcessorInterface[3]),
|
||||||
SP_STATUS_REG(_SignalProcessorInterface[4]),
|
SP_STATUS_REG(_SignalProcessorInterface[4]),
|
||||||
SP_DMA_FULL_REG(_SignalProcessorInterface[5]),
|
SP_DMA_FULL_REG(_SignalProcessorInterface[5]),
|
||||||
SP_DMA_BUSY_REG(_SignalProcessorInterface[6]),
|
SP_DMA_BUSY_REG(_SignalProcessorInterface[6]),
|
||||||
SP_SEMAPHORE_REG(_SignalProcessorInterface[7]),
|
SP_SEMAPHORE_REG(_SignalProcessorInterface[7]),
|
||||||
SP_PC_REG(_SignalProcessorInterface[8]),
|
SP_PC_REG(_SignalProcessorInterface[8]),
|
||||||
SP_IBIST_REG(_SignalProcessorInterface[9])
|
SP_IBIST_REG(_SignalProcessorInterface[9])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial_InterfaceReg::Serial_InterfaceReg(uint32_t * SerialInterface) :
|
Serial_InterfaceReg::Serial_InterfaceReg(uint32_t * SerialInterface) :
|
||||||
SI_DRAM_ADDR_REG(SerialInterface[0]),
|
SI_DRAM_ADDR_REG(SerialInterface[0]),
|
||||||
SI_PIF_ADDR_RD64B_REG(SerialInterface[1]),
|
SI_PIF_ADDR_RD64B_REG(SerialInterface[1]),
|
||||||
SI_PIF_ADDR_WR64B_REG(SerialInterface[2]),
|
SI_PIF_ADDR_WR64B_REG(SerialInterface[2]),
|
||||||
SI_STATUS_REG(SerialInterface[3])
|
SI_STATUS_REG(SerialInterface[3])
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CRegisters::CRegisters(CN64System * System, CSystemEvents * SystemEvents) :
|
CRegisters::CRegisters(CN64System * System, CSystemEvents * SystemEvents) :
|
||||||
CP0registers(m_CP0),
|
CP0registers(m_CP0),
|
||||||
Rdram_InterfaceReg(m_RDRAM_Registers),
|
Rdram_InterfaceReg(m_RDRAM_Registers),
|
||||||
Mips_InterfaceReg(m_Mips_Interface),
|
Mips_InterfaceReg(m_Mips_Interface),
|
||||||
Video_InterfaceReg(m_Video_Interface),
|
Video_InterfaceReg(m_Video_Interface),
|
||||||
AudioInterfaceReg(m_Audio_Interface),
|
AudioInterfaceReg(m_Audio_Interface),
|
||||||
PeripheralInterfaceReg(m_Peripheral_Interface),
|
PeripheralInterfaceReg(m_Peripheral_Interface),
|
||||||
RDRAMInt_InterfaceReg(m_RDRAM_Interface),
|
RDRAMInt_InterfaceReg(m_RDRAM_Interface),
|
||||||
SigProcessor_InterfaceReg(m_SigProcessor_Interface),
|
SigProcessor_InterfaceReg(m_SigProcessor_Interface),
|
||||||
DisplayControlReg(m_Display_ControlReg),
|
DisplayControlReg(m_Display_ControlReg),
|
||||||
Serial_InterfaceReg(m_SerialInterface),
|
Serial_InterfaceReg(m_SerialInterface),
|
||||||
m_System(System),
|
m_System(System),
|
||||||
m_SystemEvents(SystemEvents)
|
m_SystemEvents(SystemEvents)
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
@ -230,10 +231,10 @@ void CRegisters::Reset()
|
||||||
{
|
{
|
||||||
m_FirstInterupt = true;
|
m_FirstInterupt = true;
|
||||||
|
|
||||||
memset(m_GPR,0,sizeof(m_GPR));
|
memset(m_GPR, 0, sizeof(m_GPR));
|
||||||
memset(m_CP0,0,sizeof(m_CP0));
|
memset(m_CP0, 0, sizeof(m_CP0));
|
||||||
memset(m_FPR,0,sizeof(m_FPR));
|
memset(m_FPR, 0, sizeof(m_FPR));
|
||||||
memset(m_FPCR,0,sizeof(m_FPCR));
|
memset(m_FPCR, 0, sizeof(m_FPCR));
|
||||||
m_HI.DW = 0;
|
m_HI.DW = 0;
|
||||||
m_LO.DW = 0;
|
m_LO.DW = 0;
|
||||||
m_RoundingModel = ROUND_NEAR;
|
m_RoundingModel = ROUND_NEAR;
|
||||||
|
@ -241,15 +242,15 @@ void CRegisters::Reset()
|
||||||
m_LLBit = 0;
|
m_LLBit = 0;
|
||||||
|
|
||||||
//Reset System Registers
|
//Reset System Registers
|
||||||
memset(m_RDRAM_Interface,0,sizeof(m_RDRAM_Interface));
|
memset(m_RDRAM_Interface, 0, sizeof(m_RDRAM_Interface));
|
||||||
memset(m_RDRAM_Registers,0,sizeof(m_RDRAM_Registers));
|
memset(m_RDRAM_Registers, 0, sizeof(m_RDRAM_Registers));
|
||||||
memset(m_Mips_Interface,0,sizeof(m_Mips_Interface));
|
memset(m_Mips_Interface, 0, sizeof(m_Mips_Interface));
|
||||||
memset(m_Video_Interface,0,sizeof(m_Video_Interface));
|
memset(m_Video_Interface, 0, sizeof(m_Video_Interface));
|
||||||
memset(m_Display_ControlReg,0,sizeof(m_Display_ControlReg));
|
memset(m_Display_ControlReg, 0, sizeof(m_Display_ControlReg));
|
||||||
memset(m_Audio_Interface,0,sizeof(m_Audio_Interface));
|
memset(m_Audio_Interface, 0, sizeof(m_Audio_Interface));
|
||||||
memset(m_SigProcessor_Interface,0,sizeof(m_SigProcessor_Interface));
|
memset(m_SigProcessor_Interface, 0, sizeof(m_SigProcessor_Interface));
|
||||||
memset(m_Peripheral_Interface,0,sizeof(m_Peripheral_Interface));
|
memset(m_Peripheral_Interface, 0, sizeof(m_Peripheral_Interface));
|
||||||
memset(m_SerialInterface,0,sizeof(m_SerialInterface));
|
memset(m_SerialInterface, 0, sizeof(m_SerialInterface));
|
||||||
|
|
||||||
m_AudioIntrReg = 0;
|
m_AudioIntrReg = 0;
|
||||||
m_GfxIntrReg = 0;
|
m_GfxIntrReg = 0;
|
||||||
|
@ -291,27 +292,27 @@ void CRegisters::CheckInterrupts()
|
||||||
FAKE_CAUSE_REGISTER &= ~CAUSE_IP2;
|
FAKE_CAUSE_REGISTER &= ~CAUSE_IP2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (( STATUS_REGISTER & STATUS_IE ) == 0 )
|
if ((STATUS_REGISTER & STATUS_IE) == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_EXL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_EXL) != 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_ERL) != 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (( STATUS_REGISTER & FAKE_CAUSE_REGISTER & 0xFF00) != 0)
|
if ((STATUS_REGISTER & FAKE_CAUSE_REGISTER & 0xFF00) != 0)
|
||||||
{
|
{
|
||||||
if (m_FirstInterupt)
|
if (m_FirstInterupt)
|
||||||
{
|
{
|
||||||
m_FirstInterupt = false;
|
m_FirstInterupt = false;
|
||||||
if (g_Recompiler)
|
if (g_Recompiler)
|
||||||
{
|
{
|
||||||
g_Recompiler->ClearRecompCode_Virt(0x80000000,0x200,CRecompiler::Remove_InitialCode);
|
g_Recompiler->ClearRecompCode_Virt(0x80000000, 0x200, CRecompiler::Remove_InitialCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_SystemEvents->QueueEvent(SysEvent_ExecuteInterrupt);
|
m_SystemEvents->QueueEvent(SysEvent_ExecuteInterrupt);
|
||||||
|
@ -323,11 +324,11 @@ void CRegisters::DoAddressError(bool DelaySlot, uint32_t BadVaddr, bool FromRead
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"AddressError");
|
g_Notify->DisplayError(L"AddressError");
|
||||||
if (( STATUS_REGISTER & STATUS_EXL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_EXL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"EXL set in AddressError Exception");
|
g_Notify->DisplayError(L"EXL set in AddressError Exception");
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_ERL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"ERL set in AddressError Exception");
|
g_Notify->DisplayError(L"ERL set in AddressError Exception");
|
||||||
}
|
}
|
||||||
|
@ -359,7 +360,7 @@ void CRegisters::FixFpuLocations()
|
||||||
{
|
{
|
||||||
if ((STATUS_REGISTER & STATUS_FR) == 0)
|
if ((STATUS_REGISTER & STATUS_FR) == 0)
|
||||||
{
|
{
|
||||||
for (int count = 0; count < 32; count ++)
|
for (int count = 0; count < 32; count++)
|
||||||
{
|
{
|
||||||
m_FPR_S[count] = &m_FPR[count >> 1].F[count & 1];
|
m_FPR_S[count] = &m_FPR[count >> 1].F[count & 1];
|
||||||
m_FPR_D[count] = &m_FPR[count >> 1].D;
|
m_FPR_D[count] = &m_FPR[count >> 1].D;
|
||||||
|
@ -367,7 +368,7 @@ void CRegisters::FixFpuLocations()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (int count = 0; count < 32; count ++) {
|
for (int count = 0; count < 32; count++) {
|
||||||
m_FPR_S[count] = &m_FPR[count].F[1];
|
m_FPR_S[count] = &m_FPR[count].F[1];
|
||||||
m_FPR_D[count] = &m_FPR[count].D;
|
m_FPR_D[count] = &m_FPR[count].D;
|
||||||
}
|
}
|
||||||
|
@ -378,11 +379,11 @@ void CRegisters::DoBreakException(bool DelaySlot)
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
if (( STATUS_REGISTER & STATUS_EXL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_EXL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"EXL set in Break Exception");
|
g_Notify->DisplayError(L"EXL set in Break Exception");
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_ERL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"ERL set in Break Exception");
|
g_Notify->DisplayError(L"ERL set in Break Exception");
|
||||||
}
|
}
|
||||||
|
@ -406,11 +407,11 @@ void CRegisters::DoCopUnusableException(bool DelaySlot, int Coprocessor)
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
if (( STATUS_REGISTER & STATUS_EXL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_EXL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"EXL set in Break Exception");
|
g_Notify->DisplayError(L"EXL set in Break Exception");
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_ERL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"ERL set in Break Exception");
|
g_Notify->DisplayError(L"ERL set in Break Exception");
|
||||||
}
|
}
|
||||||
|
@ -451,7 +452,7 @@ bool CRegisters::DoIntrException(bool DelaySlot)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_LogOptions.GenerateLog && g_LogOptions.LogExceptions && !g_LogOptions.NoInterrupts)
|
if (GenerateLog() && LogExceptions() && !LogNoInterrupts())
|
||||||
{
|
{
|
||||||
LogMessage("%08X: Interrupt Generated", m_PROGRAM_COUNTER);
|
LogMessage("%08X: Interrupt Generated", m_PROGRAM_COUNTER);
|
||||||
}
|
}
|
||||||
|
@ -506,7 +507,7 @@ void CRegisters::DoTLBReadMiss(bool DelaySlot, uint32_t BadVaddr)
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f("TLBMiss - EXL Set\nBadVaddr = %X\nAddress Defined: %s",BadVaddr,g_TLB->AddressDefined(BadVaddr)?"TRUE":"FALSE").ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("TLBMiss - EXL Set\nBadVaddr = %X\nAddress Defined: %s", BadVaddr, g_TLB->AddressDefined(BadVaddr) ? "TRUE" : "FALSE").ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
m_PROGRAM_COUNTER = 0x80000180;
|
m_PROGRAM_COUNTER = 0x80000180;
|
||||||
}
|
}
|
||||||
|
@ -516,11 +517,11 @@ void CRegisters::DoSysCallException(bool DelaySlot)
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
if (( STATUS_REGISTER & STATUS_EXL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_EXL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"EXL set in SysCall Exception");
|
g_Notify->DisplayError(L"EXL set in SysCall Exception");
|
||||||
}
|
}
|
||||||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 )
|
if ((STATUS_REGISTER & STATUS_ERL) != 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"ERL set in SysCall Exception");
|
g_Notify->DisplayError(L"ERL set in SysCall Exception");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,6 +10,9 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\Settings\Game Settings.h>
|
||||||
|
#include <Project64\Logging.h>
|
||||||
|
|
||||||
//CPO registers by name
|
//CPO registers by name
|
||||||
class CP0registers
|
class CP0registers
|
||||||
{
|
{
|
||||||
|
@ -515,6 +518,7 @@ class CN64System;
|
||||||
class CSystemEvents;
|
class CSystemEvents;
|
||||||
|
|
||||||
class CRegisters :
|
class CRegisters :
|
||||||
|
public CLogging,
|
||||||
private CDebugSettings,
|
private CDebugSettings,
|
||||||
private CGameSettings,
|
private CGameSettings,
|
||||||
protected CSystemRegisters,
|
protected CSystemRegisters,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,9 +10,12 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Common/SyncEvent.h>
|
||||||
|
#include <Project64\Logging.h>
|
||||||
|
|
||||||
typedef std::list<SystemEvent> EVENT_LIST;
|
typedef std::list<SystemEvent> EVENT_LIST;
|
||||||
|
|
||||||
typedef std::map<DWORD, DWORD> FUNC_CALLS;
|
typedef std::map<uint32_t, uint32_t> FUNC_CALLS;
|
||||||
|
|
||||||
class CPlugins;
|
class CPlugins;
|
||||||
class CRSP_Plugin;
|
class CRSP_Plugin;
|
||||||
|
@ -21,6 +24,7 @@ class CRecompiler;
|
||||||
//#define TEST_SP_TRACKING //track the SP to make sure all ops pick it up fine
|
//#define TEST_SP_TRACKING //track the SP to make sure all ops pick it up fine
|
||||||
|
|
||||||
class CN64System :
|
class CN64System :
|
||||||
|
public CLogging,
|
||||||
public CMipsMemory_CallBack,
|
public CMipsMemory_CallBack,
|
||||||
public CTLB_CB,
|
public CTLB_CB,
|
||||||
private CSystemEvents,
|
private CSystemEvents,
|
||||||
|
@ -32,11 +36,6 @@ public:
|
||||||
CN64System(CPlugins * Plugins, bool SavesReadOnly);
|
CN64System(CPlugins * Plugins, bool SavesReadOnly);
|
||||||
virtual ~CN64System(void);
|
virtual ~CN64System(void);
|
||||||
|
|
||||||
struct ThreadInfo {
|
|
||||||
HANDLE * ThreadHandle;
|
|
||||||
DWORD ThreadID;
|
|
||||||
};
|
|
||||||
|
|
||||||
CProfiling m_Profile;
|
CProfiling m_Profile;
|
||||||
CCheats m_Cheats;
|
CCheats m_Cheats;
|
||||||
bool m_EndEmulation;
|
bool m_EndEmulation;
|
||||||
|
@ -46,40 +45,38 @@ public:
|
||||||
static bool RunFileImage(const char * FileLoc);
|
static bool RunFileImage(const char * FileLoc);
|
||||||
static void CloseSystem(void);
|
static void CloseSystem(void);
|
||||||
|
|
||||||
void CloseCpu ();
|
void CloseCpu();
|
||||||
void ExternalEvent ( SystemEvent action ); //covers gui interacting and timers etc..
|
void ExternalEvent(SystemEvent action); //covers gui interacting and timers etc..
|
||||||
stdstr ChooseFileToOpen ( HWND hParent );
|
void StartEmulation(bool NewThread);
|
||||||
void DisplayRomInfo ( HWND hParent );
|
void SyncToAudio();
|
||||||
void StartEmulation ( bool NewThread );
|
void IncreaseSpeed() { m_Limitor.IncreaseSpeed(); }
|
||||||
void SyncToAudio ();
|
void DecreaseSpeed() { m_Limitor.DecreaseSpeed(); }
|
||||||
void IncreaseSpeed () { m_Limitor.IncreaseSpeed(); }
|
void Reset(bool bInitReg, bool ClearMenory);
|
||||||
void DecreaseSpeed () { m_Limitor.DecreaseSpeed(); }
|
void GameReset();
|
||||||
void Reset ( bool bInitReg, bool ClearMenory );
|
void PluginReset();
|
||||||
void GameReset ();
|
|
||||||
void PluginReset ();
|
|
||||||
|
|
||||||
void Pause ();
|
void Pause();
|
||||||
void RunRSP ();
|
void RunRSP();
|
||||||
bool SaveState ();
|
bool SaveState();
|
||||||
bool LoadState ( LPCSTR FileName );
|
bool LoadState(const char * FileName);
|
||||||
bool LoadState ();
|
bool LoadState();
|
||||||
|
|
||||||
bool DmaUsed() const { return m_DMAUsed; }
|
bool DmaUsed() const { return m_DMAUsed; }
|
||||||
void SetDmaUsed(bool DMAUsed) { m_DMAUsed = DMAUsed; }
|
void SetDmaUsed(bool DMAUsed) { m_DMAUsed = DMAUsed; }
|
||||||
void SetCheatsSlectionChanged(bool changed) { m_CheatsSlectionChanged = changed; }
|
void SetCheatsSlectionChanged(bool changed) { m_CheatsSlectionChanged = changed; }
|
||||||
bool HasCheatsSlectionChanged(void) const { return m_CheatsSlectionChanged; }
|
bool HasCheatsSlectionChanged(void) const { return m_CheatsSlectionChanged; }
|
||||||
DWORD GetButtons(int Control) const { return m_Buttons[Control]; }
|
uint32_t GetButtons(int32_t Control) const { return m_Buttons[Control]; }
|
||||||
|
|
||||||
//Variable used to track that the SP is being handled and stays the same as the real SP in sync core
|
//Variable used to track that the SP is being handled and stays the same as the real SP in sync core
|
||||||
#ifdef TEST_SP_TRACKING
|
#ifdef TEST_SP_TRACKING
|
||||||
DWORD m_CurrentSP;
|
uint32_t m_CurrentSP;
|
||||||
#endif
|
#endif
|
||||||
//For Sync CPU
|
//For Sync CPU
|
||||||
void UpdateSyncCPU ( CN64System * const SecondCPU, DWORD const Cycles );
|
void UpdateSyncCPU(CN64System * const SecondCPU, uint32_t const Cycles);
|
||||||
void SyncCPU ( CN64System * const SecondCPU );
|
void SyncCPU(CN64System * const SecondCPU);
|
||||||
void SyncCPUPC ( CN64System * const SecondCPU );
|
void SyncCPUPC(CN64System * const SecondCPU);
|
||||||
void SyncSystem ();
|
void SyncSystem();
|
||||||
void SyncSystemPC ();
|
void SyncSystemPC();
|
||||||
private:
|
private:
|
||||||
//Make sure plugins can directly access this information
|
//Make sure plugins can directly access this information
|
||||||
friend CGfxPlugin;
|
friend CGfxPlugin;
|
||||||
|
@ -91,15 +88,22 @@ private:
|
||||||
friend CSystemTimer;
|
friend CSystemTimer;
|
||||||
|
|
||||||
//Used for loading and potentially executing the CPU in its own thread.
|
//Used for loading and potentially executing the CPU in its own thread.
|
||||||
static void StartEmulationThread ( ThreadInfo * Info );
|
struct ThreadInfo
|
||||||
static bool EmulationStarting ( HANDLE hThread, DWORD ThreadId );
|
{
|
||||||
|
void * ThreadHandle;
|
||||||
|
uint32_t ThreadID;
|
||||||
|
};
|
||||||
|
|
||||||
void ExecuteCPU ();
|
static void StartEmulationThread(ThreadInfo * Info);
|
||||||
void RefreshScreen ();
|
static bool EmulationStarting(void * hThread, uint32_t ThreadId);
|
||||||
void DumpSyncErrors ( CN64System * SecondCPU );
|
static void StartEmulationThead();
|
||||||
void StartEmulation2 ( bool NewThread );
|
|
||||||
bool SetActiveSystem ( bool bActive = true );
|
void ExecuteCPU();
|
||||||
void InitRegisters ( bool bPostPif, CMipsMemory & MMU );
|
void RefreshScreen();
|
||||||
|
void DumpSyncErrors(CN64System * SecondCPU);
|
||||||
|
void StartEmulation2(bool NewThread);
|
||||||
|
bool SetActiveSystem(bool bActive = true);
|
||||||
|
void InitRegisters(bool bPostPif, CMipsMemory & MMU);
|
||||||
void DisplayRSPListCount();
|
void DisplayRSPListCount();
|
||||||
|
|
||||||
//CPU Methods
|
//CPU Methods
|
||||||
|
@ -111,7 +115,7 @@ private:
|
||||||
void CpuStopped();
|
void CpuStopped();
|
||||||
|
|
||||||
//Function in CMipsMemory_CallBack
|
//Function in CMipsMemory_CallBack
|
||||||
virtual bool WriteToProtectedMemory(uint32_t Address, int length);
|
virtual bool WriteToProtectedMemory(uint32_t Address, int32_t length);
|
||||||
|
|
||||||
//Functions in CTLB_CB
|
//Functions in CTLB_CB
|
||||||
void TLB_Mapped(uint32_t VAddr, uint32_t Len, uint32_t PAddr, bool bReadOnly);
|
void TLB_Mapped(uint32_t VAddr, uint32_t Len, uint32_t PAddr, bool bReadOnly);
|
||||||
|
@ -121,7 +125,6 @@ private:
|
||||||
CPlugins * const m_Plugins; //The plugin container
|
CPlugins * const m_Plugins; //The plugin container
|
||||||
CN64System * m_SyncCPU;
|
CN64System * m_SyncCPU;
|
||||||
CPlugins * m_SyncPlugins;
|
CPlugins * m_SyncPlugins;
|
||||||
CMainGui * m_SyncWindow;
|
|
||||||
CMipsMemoryVM m_MMU_VM; //Memory of the n64
|
CMipsMemoryVM m_MMU_VM; //Memory of the n64
|
||||||
CTLB m_TLB;
|
CTLB m_TLB;
|
||||||
CRegisters m_Reg;
|
CRegisters m_Reg;
|
||||||
|
@ -131,34 +134,34 @@ private:
|
||||||
CAudio m_Audio;
|
CAudio m_Audio;
|
||||||
CSpeedLimitor m_Limitor;
|
CSpeedLimitor m_Limitor;
|
||||||
bool m_InReset;
|
bool m_InReset;
|
||||||
int m_NextTimer;
|
int32_t m_NextTimer;
|
||||||
CSystemTimer m_SystemTimer;
|
CSystemTimer m_SystemTimer;
|
||||||
bool m_bCleanFrameBox;
|
bool m_bCleanFrameBox;
|
||||||
bool m_bInitialized;
|
bool m_bInitialized;
|
||||||
bool m_RspBroke;
|
bool m_RspBroke;
|
||||||
bool m_DMAUsed;
|
bool m_DMAUsed;
|
||||||
DWORD m_Buttons[4];
|
uint32_t m_Buttons[4];
|
||||||
bool m_TestTimer;
|
bool m_TestTimer;
|
||||||
DWORD m_NextInstruction;
|
uint32_t m_NextInstruction;
|
||||||
DWORD m_JumpToLocation;
|
uint32_t m_JumpToLocation;
|
||||||
uint32_t m_TLBLoadAddress;
|
uint32_t m_TLBLoadAddress;
|
||||||
uint32_t m_TLBStoreAddress;
|
uint32_t m_TLBStoreAddress;
|
||||||
DWORD m_SyncCount;
|
uint32_t m_SyncCount;
|
||||||
bool m_CheatsSlectionChanged;
|
bool m_CheatsSlectionChanged;
|
||||||
|
|
||||||
//When Syncing cores this is the PC where it last Sync'ed correctly
|
//When Syncing cores this is the PC where it last Sync'ed correctly
|
||||||
DWORD m_LastSuccessSyncPC[10];
|
uint32_t m_LastSuccessSyncPC[10];
|
||||||
int m_CyclesToSkip;
|
int32_t m_CyclesToSkip;
|
||||||
|
|
||||||
//Handle to the cpu thread
|
//Handle to the cpu thread
|
||||||
HANDLE m_CPU_Handle;
|
void * m_CPU_Handle;
|
||||||
DWORD m_CPU_ThreadID;
|
uint32_t m_CPU_ThreadID;
|
||||||
|
|
||||||
//Handle to pause mutex
|
//Handle to pause mutex
|
||||||
void * m_hPauseEvent;
|
SyncEvent m_hPauseEvent;
|
||||||
|
|
||||||
//No of Alist and Dlist sent to the RSP
|
//No of Alist and Dlist sent to the RSP
|
||||||
DWORD m_AlistCount, m_DlistCount, m_UnknownCount;
|
uint32_t m_AlistCount, m_DlistCount, m_UnknownCount;
|
||||||
|
|
||||||
//list of function that have been called .. used in profiling
|
//list of function that have been called .. used in profiling
|
||||||
FUNC_CALLS m_FunctionCalls;
|
FUNC_CALLS m_FunctionCalls;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -28,60 +28,66 @@ CN64Rom::~CN64Rom()
|
||||||
UnallocateRomImage();
|
UnallocateRomImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CN64Rom::AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
bool CN64Rom::AllocateAndLoadN64Image(const char * FileLoc, bool LoadBootCodeOnly)
|
||||||
|
{
|
||||||
//Try to open the target file
|
//Try to open the target file
|
||||||
HANDLE hFile = CreateFile(FileLoc,GENERIC_READ,FILE_SHARE_READ,NULL,
|
HANDLE hFile = CreateFile(FileLoc, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
|
||||||
NULL);
|
NULL);
|
||||||
if (hFile == INVALID_HANDLE_VALUE) { return false; }
|
if (hFile == INVALID_HANDLE_VALUE) { return false; }
|
||||||
|
|
||||||
//Read the first 4 bytes and make sure it is a valid n64 image
|
//Read the first 4 bytes and make sure it is a valid n64 image
|
||||||
DWORD dwRead; BYTE Test[4];
|
DWORD dwRead; uint8_t Test[4];
|
||||||
|
|
||||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
|
||||||
ReadFile(hFile,Test,4,&dwRead,NULL);
|
ReadFile(hFile, Test, 4, &dwRead, NULL);
|
||||||
if (!IsValidRomImage(Test)) {
|
if (!IsValidRomImage(Test))
|
||||||
CloseHandle( hFile );
|
{
|
||||||
|
CloseHandle(hFile);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the size of the rom and try to allocate the memory needed.
|
//Get the size of the rom and try to allocate the memory needed.
|
||||||
DWORD RomFileSize = GetFileSize(hFile,NULL);
|
DWORD RomFileSize = GetFileSize(hFile, NULL);
|
||||||
//if loading boot code then just load the first 0x1000 bytes
|
//if loading boot code then just load the first 0x1000 bytes
|
||||||
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
||||||
|
|
||||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
uint8_t * Image = (uint8_t *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||||
if (Image == NULL) {
|
if (Image == NULL)
|
||||||
|
{
|
||||||
SetError(MSG_MEM_ALLOC_ERROR);
|
SetError(MSG_MEM_ALLOC_ERROR);
|
||||||
CloseHandle( hFile );
|
CloseHandle(hFile);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Load the n64 rom to the allocated memory
|
//Load the n64 rom to the allocated memory
|
||||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||||
SetFilePointer(hFile,0,0,FILE_BEGIN);
|
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
|
||||||
|
|
||||||
DWORD count, TotalRead = 0;
|
DWORD count, TotalRead = 0;
|
||||||
for (count = 0; count < (int)RomFileSize; count += ReadFromRomSection) {
|
for (count = 0; count < (int)RomFileSize; count += ReadFromRomSection)
|
||||||
|
{
|
||||||
DWORD dwToRead = RomFileSize - count;
|
DWORD dwToRead = RomFileSize - count;
|
||||||
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
||||||
|
|
||||||
if (!ReadFile(hFile,&Image[count],dwToRead,&dwRead,NULL)) {
|
if (!ReadFile(hFile, &Image[count], dwToRead, &dwRead, NULL))
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
{
|
||||||
CloseHandle( hFile );
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
|
CloseHandle(hFile);
|
||||||
SetError(MSG_FAIL_IMAGE);
|
SetError(MSG_FAIL_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
TotalRead += dwRead;
|
TotalRead += dwRead;
|
||||||
|
|
||||||
//Show Message of how much % wise of the rom has been loaded
|
//Show Message of how much % wise of the rom has been loaded
|
||||||
g_Notify->DisplayMessage(0,stdstr_f("%s: %.2f%c",GS(MSG_LOADED),((float)TotalRead/(float)RomFileSize) * 100.0f,'%').ToUTF16().c_str());
|
g_Notify->DisplayMessage(0, stdstr_f("%s: %.2f%c", GS(MSG_LOADED), ((float)TotalRead / (float)RomFileSize) * 100.0f, '%').ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
dwRead = TotalRead;
|
dwRead = TotalRead;
|
||||||
|
|
||||||
if (RomFileSize != dwRead) {
|
if (RomFileSize != dwRead)
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
{
|
||||||
CloseHandle( hFile );
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
|
CloseHandle(hFile);
|
||||||
SetError(MSG_FAIL_IMAGE);
|
SetError(MSG_FAIL_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -91,83 +97,95 @@ bool CN64Rom::AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeO
|
||||||
m_ROMImage = Image;
|
m_ROMImage = Image;
|
||||||
m_RomFileSize = RomFileSize;
|
m_RomFileSize = RomFileSize;
|
||||||
|
|
||||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||||
ByteSwapRom();
|
ByteSwapRom();
|
||||||
|
|
||||||
//Protect the memory so that it can not be written to.
|
//Protect the memory so that it can not be written to.
|
||||||
DWORD OldProtect;
|
DWORD OldProtect;
|
||||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnly) {
|
bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnly)
|
||||||
|
{
|
||||||
unzFile file = unzOpen(FileLoc);
|
unzFile file = unzOpen(FileLoc);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int port = unzGoToFirstFile(file);
|
int port = unzGoToFirstFile(file);
|
||||||
bool FoundRom = false;
|
bool FoundRom = false;
|
||||||
|
|
||||||
//scan through all files in zip to a suitable file is found
|
//scan through all files in zip to a suitable file is found
|
||||||
while(port == UNZ_OK && !FoundRom) {
|
while (port == UNZ_OK && !FoundRom)
|
||||||
|
{
|
||||||
unz_file_info info;
|
unz_file_info info;
|
||||||
char zname[_MAX_PATH];
|
char zname[_MAX_PATH];
|
||||||
|
|
||||||
unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL,0, NULL,0);
|
unzGetCurrentFileInfo(file, &info, zname, sizeof(zname), NULL, 0, NULL, 0);
|
||||||
if (unzLocateFile(file, zname, 1) != UNZ_OK ) {
|
if (unzLocateFile(file, zname, 1) != UNZ_OK)
|
||||||
|
{
|
||||||
SetError(MSG_FAIL_ZIP);
|
SetError(MSG_FAIL_ZIP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( unzOpenCurrentFile(file) != UNZ_OK ) {
|
if (unzOpenCurrentFile(file) != UNZ_OK)
|
||||||
|
{
|
||||||
SetError(MSG_FAIL_ZIP);
|
SetError(MSG_FAIL_ZIP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Read the first 4 bytes to check magic number
|
//Read the first 4 bytes to check magic number
|
||||||
BYTE Test[4];
|
uint8_t Test[4];
|
||||||
unzReadCurrentFile(file,Test,sizeof(Test));
|
unzReadCurrentFile(file, Test, sizeof(Test));
|
||||||
if (IsValidRomImage(Test)) {
|
if (IsValidRomImage(Test))
|
||||||
|
{
|
||||||
//Get the size of the rom and try to allocate the memory needed.
|
//Get the size of the rom and try to allocate the memory needed.
|
||||||
DWORD RomFileSize = info.uncompressed_size;
|
DWORD RomFileSize = info.uncompressed_size;
|
||||||
if (LoadBootCodeOnly) {
|
if (LoadBootCodeOnly)
|
||||||
|
{
|
||||||
RomFileSize = 0x1000;
|
RomFileSize = 0x1000;
|
||||||
}
|
}
|
||||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
uint8_t * Image = (uint8_t *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||||
if (Image == NULL) {
|
if (Image == NULL)
|
||||||
|
{
|
||||||
SetError(MSG_MEM_ALLOC_ERROR);
|
SetError(MSG_MEM_ALLOC_ERROR);
|
||||||
unzCloseCurrentFile(file);
|
unzCloseCurrentFile(file);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Load the n64 rom to the allocated memory
|
//Load the n64 rom to the allocated memory
|
||||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||||
memcpy(Image,Test,4);
|
memcpy(Image, Test, 4);
|
||||||
|
|
||||||
DWORD dwRead, count, TotalRead = 0;
|
DWORD dwRead, count, TotalRead = 0;
|
||||||
for (count = 4; count < (int)RomFileSize; count += ReadFromRomSection) {
|
for (count = 4; count < (int)RomFileSize; count += ReadFromRomSection)
|
||||||
|
{
|
||||||
DWORD dwToRead = RomFileSize - count;
|
DWORD dwToRead = RomFileSize - count;
|
||||||
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; }
|
||||||
|
|
||||||
dwRead = unzReadCurrentFile(file,&Image[count],dwToRead);
|
dwRead = unzReadCurrentFile(file, &Image[count], dwToRead);
|
||||||
if (dwRead == 0) {
|
if (dwRead == 0)
|
||||||
|
{
|
||||||
SetError(MSG_FAIL_ZIP);
|
SetError(MSG_FAIL_ZIP);
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
unzCloseCurrentFile(file);
|
unzCloseCurrentFile(file);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TotalRead += dwRead;
|
TotalRead += dwRead;
|
||||||
|
|
||||||
//Show Message of how much % wise of the rom has been loaded
|
//Show Message of how much % wise of the rom has been loaded
|
||||||
g_Notify->DisplayMessage(5,stdstr_f("%s: %.2f%c",GS(MSG_LOADED),((float)TotalRead/(float)RomFileSize) * 100.0f,'%').ToUTF16().c_str());
|
g_Notify->DisplayMessage(5, stdstr_f("%s: %.2f%c", GS(MSG_LOADED), ((float)TotalRead / (float)RomFileSize) * 100.0f, '%').ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
dwRead = TotalRead + 4;
|
dwRead = TotalRead + 4;
|
||||||
|
|
||||||
if (RomFileSize != dwRead) {
|
if (RomFileSize != dwRead)
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
{
|
||||||
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
unzCloseCurrentFile(file);
|
unzCloseCurrentFile(file);
|
||||||
SetError(MSG_FAIL_ZIP);
|
SetError(MSG_FAIL_ZIP);
|
||||||
g_Notify->DisplayMessage(1,L"");
|
g_Notify->DisplayMessage(1, L"");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,33 +195,38 @@ bool CN64Rom::AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnl
|
||||||
m_RomFileSize = RomFileSize;
|
m_RomFileSize = RomFileSize;
|
||||||
FoundRom = true;
|
FoundRom = true;
|
||||||
|
|
||||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||||
ByteSwapRom();
|
ByteSwapRom();
|
||||||
|
|
||||||
//Protect the memory so that it can not be written to.
|
//Protect the memory so that it can not be written to.
|
||||||
DWORD OldProtect;
|
DWORD OldProtect;
|
||||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||||
g_Notify->DisplayMessage(1,L"");
|
g_Notify->DisplayMessage(1, L"");
|
||||||
}
|
}
|
||||||
unzCloseCurrentFile(file);
|
unzCloseCurrentFile(file);
|
||||||
|
|
||||||
if (!FoundRom)
|
if (!FoundRom)
|
||||||
|
{
|
||||||
port = unzGoToNextFile(file);
|
port = unzGoToNextFile(file);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
unzClose(file);
|
unzClose(file);
|
||||||
|
|
||||||
return FoundRom;
|
return FoundRom;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::ByteSwapRom() {
|
void CN64Rom::ByteSwapRom()
|
||||||
|
{
|
||||||
DWORD count;
|
DWORD count;
|
||||||
|
|
||||||
switch (*((DWORD *)&m_ROMImage[0])) {
|
switch (*((DWORD *)&m_ROMImage[0]))
|
||||||
|
{
|
||||||
case 0x12408037:
|
case 0x12408037:
|
||||||
for( count = 0 ; count < m_RomFileSize; count += 4 ) {
|
for (count = 0; count < m_RomFileSize; count += 4)
|
||||||
m_ROMImage[count] ^= m_ROMImage[count+2];
|
{
|
||||||
|
m_ROMImage[count] ^= m_ROMImage[count + 2];
|
||||||
m_ROMImage[count + 2] ^= m_ROMImage[count];
|
m_ROMImage[count + 2] ^= m_ROMImage[count];
|
||||||
m_ROMImage[count] ^= m_ROMImage[count+2];
|
m_ROMImage[count] ^= m_ROMImage[count + 2];
|
||||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
||||||
m_ROMImage[count + 3] ^= m_ROMImage[count + 1];
|
m_ROMImage[count + 3] ^= m_ROMImage[count + 1];
|
||||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
m_ROMImage[count + 1] ^= m_ROMImage[count + 3];
|
||||||
|
@ -211,10 +234,11 @@ void CN64Rom::ByteSwapRom() {
|
||||||
break;
|
break;
|
||||||
case 0x40072780: //64DD IPL
|
case 0x40072780: //64DD IPL
|
||||||
case 0x40123780:
|
case 0x40123780:
|
||||||
for( count = 0 ; count < m_RomFileSize; count += 4 ) {
|
for (count = 0; count < m_RomFileSize; count += 4)
|
||||||
m_ROMImage[count] ^= m_ROMImage[count+3];
|
{
|
||||||
|
m_ROMImage[count] ^= m_ROMImage[count + 3];
|
||||||
m_ROMImage[count + 3] ^= m_ROMImage[count];
|
m_ROMImage[count + 3] ^= m_ROMImage[count];
|
||||||
m_ROMImage[count] ^= m_ROMImage[count+3];
|
m_ROMImage[count] ^= m_ROMImage[count + 3];
|
||||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
||||||
m_ROMImage[count + 2] ^= m_ROMImage[count + 1];
|
m_ROMImage[count + 2] ^= m_ROMImage[count + 1];
|
||||||
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
m_ROMImage[count + 1] ^= m_ROMImage[count + 2];
|
||||||
|
@ -222,13 +246,13 @@ void CN64Rom::ByteSwapRom() {
|
||||||
break;
|
break;
|
||||||
case 0x80371240: break;
|
case 0x80371240: break;
|
||||||
default:
|
default:
|
||||||
g_Notify->DisplayError(stdstr_f("ByteSwapRom: %X",m_ROMImage[0]).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f("ByteSwapRom: %X", m_ROMImage[0]).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::CalculateCicChip()
|
void CN64Rom::CalculateCicChip()
|
||||||
{
|
{
|
||||||
__int64 CRC = 0;
|
int64_t CRC = 0;
|
||||||
|
|
||||||
if (m_ROMImage == NULL)
|
if (m_ROMImage == NULL)
|
||||||
{
|
{
|
||||||
|
@ -236,8 +260,9 @@ void CN64Rom::CalculateCicChip()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int count = 0x40; count < 0x1000; count += 4) {
|
for (int count = 0x40; count < 0x1000; count += 4)
|
||||||
CRC += *(DWORD *)(m_ROMImage+count);
|
{
|
||||||
|
CRC += *(DWORD *)(m_ROMImage + count);
|
||||||
}
|
}
|
||||||
switch (CRC) {
|
switch (CRC) {
|
||||||
case 0x000000D0027FDF31: m_CicChip = CIC_NUS_6101; break;
|
case 0x000000D0027FDF31: m_CicChip = CIC_NUS_6101; break;
|
||||||
|
@ -255,7 +280,6 @@ void CN64Rom::CalculateCicChip()
|
||||||
}
|
}
|
||||||
m_CicChip = CIC_UNKNOWN; break;
|
m_CicChip = CIC_UNKNOWN; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::CalculateRomCrc()
|
void CN64Rom::CalculateRomCrc()
|
||||||
|
@ -274,7 +298,8 @@ void CN64Rom::CalculateRomCrc()
|
||||||
// 64DD IPL at=0x02E90EDD , s6=0xdd
|
// 64DD IPL at=0x02E90EDD , s6=0xdd
|
||||||
|
|
||||||
//v0 = 0xFFFFFFFF & (0x3F * at) + 1;
|
//v0 = 0xFFFFFFFF & (0x3F * at) + 1;
|
||||||
switch (m_CicChip){
|
switch (m_CicChip)
|
||||||
|
{
|
||||||
case CIC_NUS_6101:
|
case CIC_NUS_6101:
|
||||||
case CIC_NUS_6102: v0 = 0xF8CA4DDC; break;
|
case CIC_NUS_6102: v0 = 0xF8CA4DDC; break;
|
||||||
case CIC_NUS_6103: v0 = 0xA3886759; break;
|
case CIC_NUS_6103: v0 = 0xA3886759; break;
|
||||||
|
@ -298,7 +323,8 @@ void CN64Rom::CalculateRomCrc()
|
||||||
a2 = v0;
|
a2 = v0;
|
||||||
t4 = v0;
|
t4 = v0;
|
||||||
|
|
||||||
for (t0 = 0; t0 < 0x00100000; t0 += 4){
|
for (t0 = 0; t0 < 0x00100000; t0 += 4)
|
||||||
|
{
|
||||||
v0 = *(DWORD *)(m_ROMImage + t0 + 0x1000);
|
v0 = *(DWORD *)(m_ROMImage + t0 + 0x1000);
|
||||||
|
|
||||||
v1 = a3 + v0;
|
v1 = a3 + v0;
|
||||||
|
@ -316,20 +342,24 @@ void CN64Rom::CalculateRomCrc()
|
||||||
if (a2 < v0) a2 = a3 ^ v0 ^ a2;
|
if (a2 < v0) a2 = a3 ^ v0 ^ a2;
|
||||||
else a2 = a2 ^ a0;
|
else a2 = a2 ^ a0;
|
||||||
|
|
||||||
if (m_CicChip == CIC_NUS_6105){
|
if (m_CicChip == CIC_NUS_6105)
|
||||||
|
{
|
||||||
t4 = (v0 ^ (*(DWORD *)(m_ROMImage + (0xFF & t0) + 0x750))) + t4;
|
t4 = (v0 ^ (*(DWORD *)(m_ROMImage + (0xFF & t0) + 0x750))) + t4;
|
||||||
}
|
}
|
||||||
else t4 = (v0 ^ s0) + t4;
|
else t4 = (v0 ^ s0) + t4;
|
||||||
}
|
}
|
||||||
if (m_CicChip == CIC_NUS_6103){
|
if (m_CicChip == CIC_NUS_6103)
|
||||||
|
{
|
||||||
a3 = (a3 ^ t2) + t3;
|
a3 = (a3 ^ t2) + t3;
|
||||||
s0 = (s0 ^ a2) + t4;
|
s0 = (s0 ^ a2) + t4;
|
||||||
}
|
}
|
||||||
else if (m_CicChip == CIC_NUS_6106){
|
else if (m_CicChip == CIC_NUS_6106)
|
||||||
|
{
|
||||||
a3 = 0xFFFFFFFF & (a3 * t2) + t3;
|
a3 = 0xFFFFFFFF & (a3 * t2) + t3;
|
||||||
s0 = 0xFFFFFFFF & (s0 * a2) + t4;
|
s0 = 0xFFFFFFFF & (s0 * a2) + t4;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
a3 = a3 ^ t2 ^ t3;
|
a3 = a3 ^ t2 ^ t3;
|
||||||
s0 = s0 ^ a2 ^ t4;
|
s0 = s0 ^ a2 ^ t4;
|
||||||
}
|
}
|
||||||
|
@ -345,46 +375,50 @@ CICChip CN64Rom::CicChipID()
|
||||||
return m_CicChip;
|
return m_CicChip;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CN64Rom::IsValidRomImage ( BYTE Test[4] ) {
|
bool CN64Rom::IsValidRomImage(uint8_t Test[4])
|
||||||
if ( *((DWORD *)&Test[0]) == 0x40123780 ) { return true; }
|
{
|
||||||
if ( *((DWORD *)&Test[0]) == 0x12408037 ) { return true; }
|
if (*((DWORD *)&Test[0]) == 0x40123780) { return true; }
|
||||||
if ( *((DWORD *)&Test[0]) == 0x80371240 ) { return true; }
|
if (*((DWORD *)&Test[0]) == 0x12408037) { return true; }
|
||||||
if ( *((DWORD *)&Test[0]) == 0x40072780 ) { return true; } //64DD IPL
|
if (*((DWORD *)&Test[0]) == 0x80371240) { return true; }
|
||||||
|
if (*((DWORD *)&Test[0]) == 0x40072780) { return true; } //64DD IPL
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::NotificationCB ( LPCWSTR Status, CN64Rom * /*_this*/ )
|
void CN64Rom::NotificationCB(LPCWSTR Status, CN64Rom * /*_this*/)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayMessage(5,stdstr_f("%s",Status).ToUTF16().c_str());
|
g_Notify->DisplayMessage(5, stdstr_f("%s", Status).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
bool CN64Rom::LoadN64Image(const char * FileLoc, bool LoadBootCodeOnly)
|
||||||
|
{
|
||||||
UnallocateRomImage();
|
UnallocateRomImage();
|
||||||
m_ErrorMsg = EMPTY_STRING;
|
m_ErrorMsg = EMPTY_STRING;
|
||||||
|
|
||||||
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||||
_splitpath(FileLoc,drive,dir,fname,ext);
|
_splitpath(FileLoc, drive, dir, fname, ext);
|
||||||
bool Loaded7zFile = false;
|
bool Loaded7zFile = false;
|
||||||
|
|
||||||
if (strstr(FileLoc,"?") != NULL || strcmp(ext,".7z") == 0)
|
if (strstr(FileLoc, "?") != NULL || strcmp(ext, ".7z") == 0)
|
||||||
{
|
{
|
||||||
char FullPath[MAX_PATH + 100];
|
char FullPath[MAX_PATH + 100];
|
||||||
strcpy(FullPath,FileLoc);
|
strcpy(FullPath, FileLoc);
|
||||||
|
|
||||||
//this should be a 7zip file
|
//this should be a 7zip file
|
||||||
char * SubFile = strstr(FullPath,"?");
|
char * SubFile = strstr(FullPath, "?");
|
||||||
if (SubFile == NULL)
|
if (SubFile == NULL)
|
||||||
{
|
{
|
||||||
//Pop up a dialog and select file
|
//Pop up a dialog and select file
|
||||||
//allocate memory for sub name and copy selected file name to var
|
//allocate memory for sub name and copy selected file name to var
|
||||||
//return false; //remove once dialog is done
|
//return false; //remove once dialog is done
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
*SubFile = '\0';
|
*SubFile = '\0';
|
||||||
SubFile += 1;
|
SubFile += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
C7zip ZipFile(FullPath);
|
C7zip ZipFile(FullPath);
|
||||||
ZipFile.SetNotificationCallback((C7zip::LP7ZNOTIFICATION)NotificationCB,this);
|
ZipFile.SetNotificationCallback((C7zip::LP7ZNOTIFICATION)NotificationCB, this);
|
||||||
for (int i = 0; i < ZipFile.NumFiles(); i++)
|
for (int i = 0; i < ZipFile.NumFiles(); i++)
|
||||||
{
|
{
|
||||||
CSzFileItem * f = ZipFile.FileItem(i);
|
CSzFileItem * f = ZipFile.FileItem(i);
|
||||||
|
@ -408,24 +442,25 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
//if loading boot code then just load the first 0x1000 bytes
|
//if loading boot code then just load the first 0x1000 bytes
|
||||||
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
if (LoadBootCodeOnly) { RomFileSize = 0x1000; }
|
||||||
|
|
||||||
BYTE * Image = (BYTE *)VirtualAlloc(NULL,RomFileSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
uint8_t * Image = (uint8_t *)VirtualAlloc(NULL, RomFileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||||
if (Image == NULL) {
|
if (Image == NULL)
|
||||||
|
{
|
||||||
SetError(MSG_MEM_ALLOC_ERROR);
|
SetError(MSG_MEM_ALLOC_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Load the n64 rom to the allocated memory
|
//Load the n64 rom to the allocated memory
|
||||||
g_Notify->DisplayMessage(5,MSG_LOADING);
|
g_Notify->DisplayMessage(5, MSG_LOADING);
|
||||||
if (!ZipFile.GetFile(i,Image,RomFileSize))
|
if (!ZipFile.GetFile(i, Image, RomFileSize))
|
||||||
{
|
{
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
SetError(MSG_FAIL_IMAGE);
|
SetError(MSG_FAIL_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsValidRomImage(Image))
|
if (!IsValidRomImage(Image))
|
||||||
{
|
{
|
||||||
VirtualFree(Image,0,MEM_RELEASE);
|
VirtualFree(Image, 0, MEM_RELEASE);
|
||||||
SetError(MSG_FAIL_IMAGE);
|
SetError(MSG_FAIL_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -434,12 +469,12 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
m_ROMImage = Image;
|
m_ROMImage = Image;
|
||||||
m_RomFileSize = RomFileSize;
|
m_RomFileSize = RomFileSize;
|
||||||
|
|
||||||
g_Notify->DisplayMessage(5,MSG_BYTESWAP);
|
g_Notify->DisplayMessage(5, MSG_BYTESWAP);
|
||||||
ByteSwapRom();
|
ByteSwapRom();
|
||||||
|
|
||||||
//Protect the memory so that it can not be written to.
|
//Protect the memory so that it can not be written to.
|
||||||
DWORD OldProtect;
|
DWORD OldProtect;
|
||||||
VirtualProtect(m_ROMImage,m_RomFileSize,PAGE_READONLY,&OldProtect);
|
VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect);
|
||||||
|
|
||||||
Loaded7zFile = true;
|
Loaded7zFile = true;
|
||||||
break;
|
break;
|
||||||
|
@ -454,19 +489,22 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
//Try to open the file as a zip file
|
//Try to open the file as a zip file
|
||||||
if (!Loaded7zFile)
|
if (!Loaded7zFile)
|
||||||
{
|
{
|
||||||
if (!AllocateAndLoadZipImage(FileLoc,LoadBootCodeOnly)) {
|
if (!AllocateAndLoadZipImage(FileLoc, LoadBootCodeOnly))
|
||||||
if (m_ErrorMsg != EMPTY_STRING) {
|
{
|
||||||
|
if (m_ErrorMsg != EMPTY_STRING)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//other wise treat if normal file and open the passed file
|
//other wise treat if normal file and open the passed file
|
||||||
HANDLE hFile = CreateFile(FileLoc,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
|
HANDLE hFile = CreateFile(FileLoc, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,NULL);
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
||||||
if (hFile == INVALID_HANDLE_VALUE) { SetError(MSG_FAIL_OPEN_IMAGE); return false; }
|
if (hFile == INVALID_HANDLE_VALUE) { SetError(MSG_FAIL_OPEN_IMAGE); return false; }
|
||||||
|
|
||||||
//Create a file map
|
//Create a file map
|
||||||
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
|
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
|
||||||
if (hFileMapping == NULL) {
|
if (hFileMapping == NULL)
|
||||||
|
{
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
SetError(MSG_FAIL_OPEN_IMAGE);
|
SetError(MSG_FAIL_OPEN_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
|
@ -474,29 +512,34 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
|
|
||||||
//Map the file to a memory pointer .. ie a way of pretending to load the rom
|
//Map the file to a memory pointer .. ie a way of pretending to load the rom
|
||||||
//loose the bonus of being able to flip it on the fly tho.
|
//loose the bonus of being able to flip it on the fly tho.
|
||||||
BYTE * Image = (PBYTE)MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);
|
uint8_t * Image = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
|
||||||
if (Image == NULL) {
|
if (Image == NULL)
|
||||||
|
{
|
||||||
CloseHandle(hFileMapping);
|
CloseHandle(hFileMapping);
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
SetError(MSG_FAIL_OPEN_IMAGE);
|
SetError(MSG_FAIL_OPEN_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsValidRomImage(Image)) {
|
if (!IsValidRomImage(Image))
|
||||||
UnmapViewOfFile (Image);
|
{
|
||||||
|
UnmapViewOfFile(Image);
|
||||||
CloseHandle(hFileMapping);
|
CloseHandle(hFileMapping);
|
||||||
CloseHandle(hFile);
|
CloseHandle(hFile);
|
||||||
SetError(MSG_FAIL_IMAGE);
|
SetError(MSG_FAIL_IMAGE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*((DWORD *)Image) == 0x80371240) {
|
if (*((DWORD *)Image) == 0x80371240)
|
||||||
|
{
|
||||||
m_hRomFile = hFile;
|
m_hRomFile = hFile;
|
||||||
m_hRomFileMapping = hFileMapping;
|
m_hRomFileMapping = hFileMapping;
|
||||||
m_ROMImage = Image;
|
m_ROMImage = Image;
|
||||||
m_RomFileSize = GetFileSize(hFile,NULL);
|
m_RomFileSize = GetFileSize(hFile, NULL);
|
||||||
} else {
|
}
|
||||||
if (!AllocateAndLoadN64Image(FileLoc,LoadBootCodeOnly)) { return false; }
|
else
|
||||||
|
{
|
||||||
|
if (!AllocateAndLoadN64Image(FileLoc, LoadBootCodeOnly)) { return false; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -504,35 +547,45 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
char RomName[260];
|
char RomName[260];
|
||||||
int count;
|
int count;
|
||||||
//Get the header from the rom image
|
//Get the header from the rom image
|
||||||
memcpy(&RomName[0],(void *)(m_ROMImage + 0x20),20);
|
memcpy(&RomName[0], (void *)(m_ROMImage + 0x20), 20);
|
||||||
for( count = 0 ; count < 20; count += 4 ) {
|
for (count = 0; count < 20; count += 4)
|
||||||
RomName[count] ^= RomName[count+3];
|
{
|
||||||
|
RomName[count] ^= RomName[count + 3];
|
||||||
RomName[count + 3] ^= RomName[count];
|
RomName[count + 3] ^= RomName[count];
|
||||||
RomName[count] ^= RomName[count+3];
|
RomName[count] ^= RomName[count + 3];
|
||||||
RomName[count + 1] ^= RomName[count + 2];
|
RomName[count + 1] ^= RomName[count + 2];
|
||||||
RomName[count + 2] ^= RomName[count + 1];
|
RomName[count + 2] ^= RomName[count + 1];
|
||||||
RomName[count + 1] ^= RomName[count + 2];
|
RomName[count + 1] ^= RomName[count + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
//truncate all the spaces at the end of the string
|
//truncate all the spaces at the end of the string
|
||||||
for( count = 19 ; count >= 0; count -- ) {
|
for (count = 19; count >= 0; count--)
|
||||||
if (RomName[count] == ' ') {
|
{
|
||||||
|
if (RomName[count] == ' ')
|
||||||
|
{
|
||||||
RomName[count] = '\0';
|
RomName[count] = '\0';
|
||||||
} else if (RomName[count] == '\0') {
|
}
|
||||||
} else {
|
else if (RomName[count] == '\0')
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
count = -1;
|
count = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RomName[20] = '\0';
|
RomName[20] = '\0';
|
||||||
if (strlen(RomName) == 0) {
|
if (strlen(RomName) == 0)
|
||||||
|
{
|
||||||
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||||
_splitpath(FileLoc,drive,dir,fname,ext);
|
_splitpath(FileLoc, drive, dir, fname, ext);
|
||||||
strcpy(RomName,fname);
|
strcpy(RomName, fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove all /,\,: from the string
|
//remove all /,\,: from the string
|
||||||
for( count = 0 ; count < (int)strlen(RomName); count ++ ) {
|
for (count = 0; count < (int)strlen(RomName); count++)
|
||||||
switch (RomName[count]) {
|
{
|
||||||
|
switch (RomName[count])
|
||||||
|
{
|
||||||
case '/': case '\\': RomName[count] = '-'; break;
|
case '/': case '\\': RomName[count] = '-'; break;
|
||||||
case ':': RomName[count] = ';'; break;
|
case ':': RomName[count] = ';'; break;
|
||||||
}
|
}
|
||||||
|
@ -542,17 +595,19 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
m_FileName = FileLoc;
|
m_FileName = FileLoc;
|
||||||
m_MD5 = "";
|
m_MD5 = "";
|
||||||
|
|
||||||
if (!LoadBootCodeOnly) {
|
if (!LoadBootCodeOnly)
|
||||||
|
{
|
||||||
//Calculate files MD5
|
//Calculate files MD5
|
||||||
m_MD5 = MD5((const unsigned char *)m_ROMImage, m_RomFileSize).hex_digest();
|
m_MD5 = MD5((const unsigned char *)m_ROMImage, m_RomFileSize).hex_digest();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Country = (Country)m_ROMImage[0x3D];
|
m_Country = (Country)m_ROMImage[0x3D];
|
||||||
m_RomIdent.Format("%08X-%08X-C:%X",*(DWORD *)(&m_ROMImage[0x10]),*(DWORD *)(&m_ROMImage[0x14]),m_ROMImage[0x3D]);
|
m_RomIdent.Format("%08X-%08X-C:%X", *(DWORD *)(&m_ROMImage[0x10]), *(DWORD *)(&m_ROMImage[0x14]), m_ROMImage[0x3D]);
|
||||||
CalculateCicChip();
|
CalculateCicChip();
|
||||||
|
|
||||||
if (!LoadBootCodeOnly && g_Rom == this)
|
if (!LoadBootCodeOnly && g_Rom == this)
|
||||||
{
|
{
|
||||||
|
g_Settings->SaveBool(GameRunning_LoadingInProgress, false);
|
||||||
SaveRomSettingID(false);
|
SaveRomSettingID(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,29 +622,29 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||||
|
|
||||||
//Save the settings of the loaded rom, so all loaded settings about rom will be identified with
|
//Save the settings of the loaded rom, so all loaded settings about rom will be identified with
|
||||||
//this rom
|
//this rom
|
||||||
void CN64Rom::SaveRomSettingID ( bool temp )
|
void CN64Rom::SaveRomSettingID(bool temp)
|
||||||
{
|
{
|
||||||
g_Settings->SaveBool(Game_TempLoaded,temp);
|
g_Settings->SaveBool(Game_TempLoaded, temp);
|
||||||
g_Settings->SaveString(Game_GameName,m_RomName.c_str());
|
g_Settings->SaveString(Game_GameName, m_RomName.c_str());
|
||||||
g_Settings->SaveString(Game_IniKey,m_RomIdent.c_str());
|
g_Settings->SaveString(Game_IniKey, m_RomIdent.c_str());
|
||||||
|
|
||||||
switch (GetCountry())
|
switch (GetCountry())
|
||||||
{
|
{
|
||||||
case Germany: case french: case Italian:
|
case Germany: case french: case Italian:
|
||||||
case Europe: case Spanish: case Australia:
|
case Europe: case Spanish: case Australia:
|
||||||
case X_PAL: case Y_PAL:
|
case X_PAL: case Y_PAL:
|
||||||
g_Settings->SaveDword(Game_SystemType,SYSTEM_PAL);
|
g_Settings->SaveDword(Game_SystemType, SYSTEM_PAL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_Settings->SaveDword(Game_SystemType,SYSTEM_NTSC);
|
g_Settings->SaveDword(Game_SystemType, SYSTEM_NTSC);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::ClearRomSettingID()
|
void CN64Rom::ClearRomSettingID()
|
||||||
{
|
{
|
||||||
g_Settings->SaveString(Game_GameName,"");
|
g_Settings->SaveString(Game_GameName, "");
|
||||||
g_Settings->SaveString(Game_IniKey,"");
|
g_Settings->SaveString(Game_IniKey, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CN64Rom::SetError(LanguageStringID ErrorMsg)
|
void CN64Rom::SetError(LanguageStringID ErrorMsg)
|
||||||
|
@ -599,21 +654,24 @@ void CN64Rom::SetError(LanguageStringID ErrorMsg)
|
||||||
|
|
||||||
void CN64Rom::UnallocateRomImage()
|
void CN64Rom::UnallocateRomImage()
|
||||||
{
|
{
|
||||||
if (m_hRomFileMapping) {
|
if (m_hRomFileMapping)
|
||||||
UnmapViewOfFile (m_ROMImage);
|
{
|
||||||
|
UnmapViewOfFile(m_ROMImage);
|
||||||
CloseHandle(m_hRomFileMapping);
|
CloseHandle(m_hRomFileMapping);
|
||||||
m_ROMImage = NULL;
|
m_ROMImage = NULL;
|
||||||
m_hRomFileMapping = NULL;
|
m_hRomFileMapping = NULL;
|
||||||
}
|
}
|
||||||
if (m_hRomFile) {
|
if (m_hRomFile)
|
||||||
|
{
|
||||||
CloseHandle(m_hRomFile);
|
CloseHandle(m_hRomFile);
|
||||||
m_hRomFile = NULL;
|
m_hRomFile = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if this value is still set then the image was not created a map
|
//if this value is still set then the image was not created a map
|
||||||
//file but created with VirtualAllocate
|
//file but created with VirtualAllocate
|
||||||
if (m_ROMImage) {
|
if (m_ROMImage)
|
||||||
VirtualFree(m_ROMImage,0,MEM_RELEASE);
|
{
|
||||||
|
VirtualFree(m_ROMImage, 0, MEM_RELEASE);
|
||||||
m_ROMImage = NULL;
|
m_ROMImage = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -19,39 +19,39 @@ class CN64Rom :
|
||||||
enum { ReadFromRomSection = 0x400000 };
|
enum { ReadFromRomSection = 0x400000 };
|
||||||
|
|
||||||
//class variables
|
//class variables
|
||||||
HANDLE m_hRomFile, m_hRomFileMapping;
|
void * m_hRomFile, *m_hRomFileMapping;
|
||||||
BYTE * m_ROMImage;
|
uint8_t * m_ROMImage;
|
||||||
DWORD m_RomFileSize;
|
uint32_t m_RomFileSize;
|
||||||
Country m_Country;
|
Country m_Country;
|
||||||
CICChip m_CicChip;
|
CICChip m_CicChip;
|
||||||
LanguageStringID m_ErrorMsg;
|
LanguageStringID m_ErrorMsg;
|
||||||
stdstr m_RomName, m_FileName, m_MD5, m_RomIdent;
|
stdstr m_RomName, m_FileName, m_MD5, m_RomIdent;
|
||||||
|
|
||||||
bool AllocateAndLoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly );
|
bool AllocateAndLoadN64Image(const char * FileLoc, bool LoadBootCodeOnly);
|
||||||
bool AllocateAndLoadZipImage ( const char * FileLoc, bool LoadBootCodeOnly );
|
bool AllocateAndLoadZipImage(const char * FileLoc, bool LoadBootCodeOnly);
|
||||||
void ByteSwapRom ();
|
void ByteSwapRom();
|
||||||
void SetError ( LanguageStringID ErrorMsg );
|
void SetError(LanguageStringID ErrorMsg);
|
||||||
static void __stdcall NotificationCB ( LPCWSTR Status, CN64Rom * _this );
|
static void __stdcall NotificationCB(const wchar_t * Status, CN64Rom * _this);
|
||||||
void CalculateCicChip ();
|
void CalculateCicChip();
|
||||||
void CalculateRomCrc ();
|
void CalculateRomCrc();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CN64Rom();
|
CN64Rom();
|
||||||
~CN64Rom();
|
~CN64Rom();
|
||||||
|
|
||||||
bool LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly = false );
|
bool LoadN64Image(const char * FileLoc, bool LoadBootCodeOnly = false);
|
||||||
static bool IsValidRomImage( BYTE Test[4] );
|
static bool IsValidRomImage(uint8_t Test[4]);
|
||||||
void SaveRomSettingID ( bool temp );
|
void SaveRomSettingID(bool temp);
|
||||||
void ClearRomSettingID ();
|
void ClearRomSettingID();
|
||||||
CICChip CicChipID ();
|
CICChip CicChipID();
|
||||||
BYTE * GetRomAddress () { return m_ROMImage; }
|
uint8_t * GetRomAddress() { return m_ROMImage; }
|
||||||
DWORD GetRomSize () const { return m_RomFileSize; }
|
uint32_t GetRomSize() const { return m_RomFileSize; }
|
||||||
stdstr GetRomMD5 () const { return m_MD5; }
|
stdstr GetRomMD5() const { return m_MD5; }
|
||||||
stdstr GetRomName () const { return m_RomName; }
|
stdstr GetRomName() const { return m_RomName; }
|
||||||
stdstr GetFileName () const { return m_FileName; }
|
stdstr GetFileName() const { return m_FileName; }
|
||||||
Country GetCountry () const { return m_Country; }
|
Country GetCountry() const { return m_Country; }
|
||||||
void UnallocateRomImage ();
|
void UnallocateRomImage();
|
||||||
|
|
||||||
//Get a message id for the reason that you failed to load the rom
|
//Get a message id for the reason that you failed to load the rom
|
||||||
LanguageStringID GetError () const { return m_ErrorMsg; }
|
LanguageStringID GetError() const { return m_ErrorMsg; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "N64 Types.h"
|
||||||
|
|
||||||
typedef std::map<SPECIAL_TIMERS, __int64 > PROFILE_ENRTIES;
|
typedef std::map<SPECIAL_TIMERS, __int64 > PROFILE_ENRTIES;
|
||||||
typedef PROFILE_ENRTIES::iterator PROFILE_ENRTY;
|
typedef PROFILE_ENRTIES::iterator PROFILE_ENRTY;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,6 +9,16 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "Code Section.h"
|
||||||
|
#include <Project64\N64 System\Mips\OpCode.h>
|
||||||
|
#include <Project64\N64 System\System Globals.h>
|
||||||
|
#include <Project64\N64 System\Mips\Memory Class.h>
|
||||||
|
#include <Project64\N64 System\Recompiler\x86CodeLog.h>
|
||||||
|
#include <Project64\N64 System\Recompiler\Code Block.h>
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
|
#include <Project64\N64 System\Interpreter\Interpreter CPU.h>
|
||||||
|
#include <Project64\N64 System\Recompiler\Loop Analysis.h>
|
||||||
|
#include <Project64\N64 System\Recompiler\Section Info.h>
|
||||||
|
|
||||||
void InPermLoop();
|
void InPermLoop();
|
||||||
|
|
||||||
|
@ -442,6 +452,7 @@ void CCodeSection::GenerateSectionLinkage()
|
||||||
// if (g_SyncSystem) {
|
// if (g_SyncSystem) {
|
||||||
MoveConstToX86reg((uint32_t)g_BaseSystem,x86_ECX);
|
MoveConstToX86reg((uint32_t)g_BaseSystem,x86_ECX);
|
||||||
Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem");
|
Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem");
|
||||||
|
//}
|
||||||
// MoveConstToVariable(DELAY_SLOT,&m_NextInstruction,"m_NextInstruction");
|
// MoveConstToVariable(DELAY_SLOT,&m_NextInstruction,"m_NextInstruction");
|
||||||
PushImm32(stdstr_f("0x%08X",CompilePC() + 4).c_str(),CompilePC() + 4);
|
PushImm32(stdstr_f("0x%08X",CompilePC() + 4).c_str(),CompilePC() + 4);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,6 +10,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\Settings\N64System Settings.h>
|
||||||
|
#include <Project64\Settings\Recompiler Settings.h>
|
||||||
|
|
||||||
class CCodeSection;
|
class CCodeSection;
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue