git-svn-id: https://localhost/svn/Project64/trunk@27 111125ac-702d-7242-af9c-5ba8ae61c1ef
This commit is contained in:
parent
f148d1b94c
commit
f9db52309f
|
@ -1,6 +1,27 @@
|
|||
Project64 1.7.0.51
|
||||
------------------
|
||||
|
||||
|
||||
Project64 1.7.0.50
|
||||
------------------
|
||||
Update: Rearranged Source Project
|
||||
Update: Change creating of global classes
|
||||
update: Optimize writing to an ini file
|
||||
* Redesigned settings dialog to use more modern vertical pages instead of tabs
|
||||
* Plugins can now be set per rom
|
||||
* Added Soft Reset function (resets only game, like pushing reset button on console, default shortcut F1, old Hard Reset now defaults SHIFT+F1).
|
||||
* When app loses focus in fullscreen make sure it is in window mode, should improve stability on fullscreen error messages.
|
||||
* Max cheats per game raised to 50,000
|
||||
* changed how settings is used globally
|
||||
* new setting: allow user to edit VI Refresh rate (see http://forum.pj64-emu.com/showpost.php?p=4457&postcount=18)
|
||||
* changed internal of how settings work
|
||||
* Cleaned up rom browser refresh to remove more unneeded refreshes (Windows returning files in different orders)
|
||||
* re-arranged project source files (please report new errors!)
|
||||
* changed how languages is used globally
|
||||
* optimized writing to ini file
|
||||
* added RDB editor mode and indicator (see hidden settings info)
|
||||
* updated Help menu
|
||||
* updates to video plugin interface for ROM settings
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -189,15 +189,15 @@ CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile ) :
|
|||
}
|
||||
|
||||
CTraceFileLog::CTraceFileLog (LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, DWORD dwMaxFileSize) :
|
||||
m_FlushFile(FlushFile)
|
||||
m_FlushFile(FlushFile)
|
||||
{
|
||||
enum { MB = 1024 * 1024 };
|
||||
|
||||
m_hLogFile.SetFlush(false);
|
||||
m_hLogFile.SetTruncateFile(true);
|
||||
|
||||
if(dwMaxFileSize > 10240)
|
||||
m_hLogFile.SetMaxFileSize(dwMaxFileSize);
|
||||
if(dwMaxFileSize < 2048 && dwMaxFileSize > 2)
|
||||
m_hLogFile.SetMaxFileSize(dwMaxFileSize * MB);
|
||||
else
|
||||
m_hLogFile.SetMaxFileSize(5 * MB);
|
||||
|
||||
|
|
|
@ -97,8 +97,13 @@ stdstr FileVersionInfo( LPCTSTR Info, LPCTSTR FileName )
|
|||
try
|
||||
{
|
||||
Result = ReadVersionInfo(Array,Info);
|
||||
if(Result.empty())
|
||||
if(!Result.empty())
|
||||
{
|
||||
if (strcmp(Info,VERSION_PRODUCT_VERSION) == 0)
|
||||
{
|
||||
Result.replace(" ","");
|
||||
}
|
||||
} else {
|
||||
WriteTraceF(TraceError,_T("FileVersionInfo(%s), ReadVersionInfo() failed"), FileName);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,5 +37,6 @@ class CNotification;
|
|||
|
||||
//Main Files
|
||||
#include "N64 System/N64 Class.h"
|
||||
#include "N64 System/System Globals.h"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -14,27 +14,28 @@ enum STEP_TYPE NextInstruction, Main_NextInstruction, Sync_NextInstruction;
|
|||
|
||||
}
|
||||
|
||||
CN64System * g_N64System = NULL;
|
||||
CN64System * g_SyncSystem = NULL;
|
||||
CRecompiler * g_Recompiler = NULL;
|
||||
CMipsMemory * g_MMU = NULL; //Memory of the n64
|
||||
CTLB * g_TLB = NULL; //TLB Unit
|
||||
CRegisters * g_Reg = NULL; //Current Register Set attacted to the _MMU
|
||||
CNotification * g_Notify = NULL;
|
||||
CSettings * g_Settings = NULL;
|
||||
CPlugins * g_Plugins = NULL;
|
||||
CN64Rom * g_Rom = NULL; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
CAudio * g_Audio = NULL;
|
||||
#ifdef toremove
|
||||
CN64System * _N64System = NULL;
|
||||
CN64System * _SyncSystem = NULL;
|
||||
CRecompiler * _Recompiler = NULL;
|
||||
CMipsMemoryVM * _MMU = NULL; //Memory of the n64
|
||||
CTLB * _TLB = NULL; //TLB Unit
|
||||
CRegisters * _Reg = NULL; //Current Register Set attacted to the _MMU
|
||||
CNotification * _Notify = NULL;
|
||||
CSettings * _Settings = NULL;
|
||||
CPlugins * _Plugins = NULL;
|
||||
CN64Rom * _Rom = NULL; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
|
||||
//registers
|
||||
MULTI_ACCESS_QWORD * g_GPR = NULL, * g_FPR = NULL, * g_HI = NULL, * g_LO = NULL;
|
||||
DWORD * g_PROGRAM_COUNTER = NULL, * g_CP0 = NULL, * g_RegMI = NULL, * g_LLBit = NULL,
|
||||
* g_LLAddr = NULL, * g_FPCR = NULL, * g_RegSI = NULL, * g_RegRI = NULL, * g_RegPI = NULL,
|
||||
* g_RegAI = NULL, * g_RegVI = NULL, * g_RegDPC = NULL, * g_RegSP = NULL, * g_RegRDRAM = NULL;
|
||||
double ** g_FPRDoubleLocation;
|
||||
float ** g_FPRFloatLocation;
|
||||
enum TimerType * g_CurrentTimerType;
|
||||
int * g_Timer = NULL;
|
||||
MULTI_ACCESS_QWORD * _GPR = NULL, * _FPR = NULL, * g_HI = NULL, * g_LO = NULL;
|
||||
DWORD * _PROGRAM_COUNTER = NULL, * _CP0 = NULL, * _RegMI = NULL, * _LLBit = NULL,
|
||||
* _LLAddr = NULL, * _FPCR = NULL, * _RegSI = NULL, * _RegRI = NULL, * _RegPI = NULL,
|
||||
* _RegAI = NULL, * _RegVI = NULL, * _RegDPC = NULL, * _RegSP = NULL, * _RegRDRAM = NULL;
|
||||
double ** _FPRDoubleLocation;
|
||||
float ** _FPRFloatLocation;
|
||||
enum TimerType * _CurrentTimerType;
|
||||
int * _Timer = NULL;
|
||||
#endif
|
||||
|
||||
//Register Name
|
||||
const char ** g_Cop0_Name;
|
||||
|
@ -53,7 +54,7 @@ enum FUNC_LOOKUP_METHOD g_LookUpMode;
|
|||
char g_RomName [300];
|
||||
|
||||
//Plugins
|
||||
DWORD * g_AudioIntrReg = NULL;
|
||||
DWORD * _AudioIntrReg = NULL;
|
||||
CONTROL * g_Controllers;
|
||||
enum SystemType g_SystemType;
|
||||
|
||||
|
@ -122,8 +123,8 @@ void (__cdecl *ReadController) ( int Control, BYTE * Command );
|
|||
void (__cdecl *RumbleCommand) ( int Control, BOOL bRumble );
|
||||
|
||||
//Memory
|
||||
DWORD * g_TLB_ReadMap, * g_TLB_WriteMap, g_RdramSize, * g_HalfLine, * g_MemoryStack;
|
||||
BYTE * g_N64MEM, *g_RDRAM, *g_DMEM, *g_IMEM, *g_ROM, *g_PIF_Ram;
|
||||
DWORD * g_TLB_ReadMap, * g_TLB_WriteMap, g_RdramSize;
|
||||
BYTE *g_RDRAM, *g_DMEM, *g_IMEM, *g_Rom;
|
||||
|
||||
OPCODE g_Opcode;
|
||||
BOOL g_IndvidualBlock, g_Profiling;
|
||||
|
@ -148,8 +149,8 @@ void CC_Core::SetN64System (CN64System * N64System)
|
|||
|
||||
if (N64System)
|
||||
{
|
||||
g_RomFileSize = N64System->_Rom->GetRomSize();
|
||||
g_CicChip = N64System->_Rom->CicChipID();
|
||||
g_RomFileSize = _Rom->GetRomSize();
|
||||
g_CicChip = _Rom->CicChipID();
|
||||
}
|
||||
g_CurrentFrame = 0;
|
||||
SetCurrentSystem(N64System);
|
||||
|
@ -168,59 +169,58 @@ void CC_Core::SetSyncCpu ( CN64System * System )
|
|||
g_Sync_CPU_Action = new CPU_ACTION;
|
||||
memset(g_Sync_CPU_Action,0,sizeof(CPU_ACTION));
|
||||
}
|
||||
g_SyncSystem = System;
|
||||
_SyncSystem = System;
|
||||
}
|
||||
|
||||
void CC_Core::SetSettings ( )
|
||||
{
|
||||
g_Settings = _Settings;
|
||||
if (g_Settings)
|
||||
_Settings = _Settings;
|
||||
if (_Settings)
|
||||
{
|
||||
g_HaveDebugger = g_Settings->LoadBool(Debugger_Enabled);
|
||||
g_HaveDebugger = _Settings->LoadBool(Debugger_Enabled);
|
||||
if (g_HaveDebugger)
|
||||
{
|
||||
g_ShowUnhandledMemory = g_Settings->LoadBool(Debugger_ShowUnhandledMemory);
|
||||
g_ShowDListAListCount = g_Settings->LoadBool(Debugger_ShowDListAListCount);
|
||||
g_ShowUnhandledMemory = _Settings->LoadBool(Debugger_ShowUnhandledMemory);
|
||||
g_ShowDListAListCount = _Settings->LoadBool(Debugger_ShowDListAListCount);
|
||||
} else {
|
||||
g_ShowUnhandledMemory = false;
|
||||
g_ShowUnhandledMemory = false;
|
||||
|
||||
}
|
||||
g_ShowCPUPer = g_Settings->LoadBool(UserInterface_ShowCPUPer);
|
||||
g_ShowCPUPer = _Settings->LoadBool(UserInterface_ShowCPUPer);
|
||||
g_ShowTLBMisses = false;
|
||||
g_UseTlb = g_Settings->LoadBool(Game_UseTlb);
|
||||
g_CPU_Type = (CPU_TYPE)g_Settings->LoadDword(Game_CpuType);
|
||||
g_SaveUsing = (SAVE_CHIP_TYPE)g_Settings->LoadDword(Game_SaveChip);
|
||||
g_AudioSignal = g_Settings->LoadBool(Game_RspAudioSignal);
|
||||
g_RdramSize = g_Settings->LoadDword(Game_RDRamSize);
|
||||
g_ShowPifRamErrors = g_Settings->LoadDword(Debugger_ShowPifErrors);
|
||||
g_CountPerOp = g_Settings->LoadDword(Game_CounterFactor);
|
||||
g_GenerateLog = g_Settings->LoadDword(Debugger_GenerateDebugLog);
|
||||
g_DelaySI = g_Settings->LoadBool(Game_DelaySI);
|
||||
g_SPHack = g_Settings->LoadBool(Game_SPHack);
|
||||
g_FixedAudio = g_Settings->LoadBool(Game_FixedAudio);
|
||||
g_LogX86Code = g_Settings->LoadBool(Debugger_GenerateLogFiles);
|
||||
g_LookUpMode = (FUNC_LOOKUP_METHOD)g_Settings->LoadDword(Game_FuncLookupMode);
|
||||
g_DisableRegCaching = !g_Settings->LoadBool(Game_RegCache);
|
||||
g_UseLinking = g_Settings->LoadBool(Game_BlockLinking);
|
||||
g_UseTlb = _Settings->LoadBool(Game_UseTlb);
|
||||
g_CPU_Type = (CPU_TYPE)_Settings->LoadDword(Game_CpuType);
|
||||
g_SaveUsing = (SAVE_CHIP_TYPE)_Settings->LoadDword(Game_SaveChip);
|
||||
g_AudioSignal = _Settings->LoadBool(Game_RspAudioSignal);
|
||||
g_RdramSize = _Settings->LoadDword(Game_RDRamSize);
|
||||
g_ShowPifRamErrors = _Settings->LoadDword(Debugger_ShowPifErrors);
|
||||
g_CountPerOp = _Settings->LoadDword(Game_CounterFactor);
|
||||
g_GenerateLog = _Settings->LoadDword(Debugger_GenerateDebugLog);
|
||||
g_DelaySI = _Settings->LoadBool(Game_DelaySI);
|
||||
g_SPHack = _Settings->LoadBool(Game_SPHack);
|
||||
g_FixedAudio = _Settings->LoadBool(Game_FixedAudio);
|
||||
g_LogX86Code = _Settings->LoadBool(Debugger_GenerateLogFiles);
|
||||
g_LookUpMode = (FUNC_LOOKUP_METHOD)_Settings->LoadDword(Game_FuncLookupMode);
|
||||
g_DisableRegCaching = !_Settings->LoadBool(Game_RegCache);
|
||||
g_UseLinking = _Settings->LoadBool(Game_BlockLinking);
|
||||
g_ShowCompMem = false;
|
||||
g_ViRefreshRate = g_Settings->LoadDword(Game_ViRefreshRate);
|
||||
strcpy(g_RomName, g_Settings->LoadString(Game_GameName).c_str());
|
||||
g_ViRefreshRate = _Settings->LoadDword(Game_ViRefreshRate);
|
||||
strcpy(g_RomName, _Settings->LoadString(Game_GameName).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void CC_Core::SetCurrentSystem (CN64System * System )
|
||||
{
|
||||
g_MMU = NULL;
|
||||
g_Reg = NULL;
|
||||
g_TLB = NULL;
|
||||
g_Audio = NULL;
|
||||
g_Recompiler = NULL;
|
||||
_MMU = NULL;
|
||||
_Reg = NULL;
|
||||
_TLB = NULL;
|
||||
_Audio = NULL;
|
||||
_Recompiler = NULL;
|
||||
|
||||
g_N64System = System;
|
||||
g_Notify = System->_Notify;
|
||||
_N64System = System;
|
||||
|
||||
if (g_SyncSystem == System)
|
||||
if (_SyncSystem == System)
|
||||
{
|
||||
Main_NextInstruction = NextInstruction;
|
||||
g_CPU_Action = g_Sync_CPU_Action;
|
||||
|
@ -230,124 +230,122 @@ void CC_Core::SetCurrentSystem (CN64System * System )
|
|||
g_CPU_Action = g_Main_CPU_Action;
|
||||
NextInstruction = Main_NextInstruction;
|
||||
}
|
||||
if (g_N64System)
|
||||
if (_N64System)
|
||||
{
|
||||
g_Recompiler = System->_Recomp;
|
||||
g_MMU = System->_MMU;
|
||||
g_TLB = System->_MMU;
|
||||
g_Plugins = System->_Plugins;
|
||||
g_Rom = System->_Rom;
|
||||
g_Audio = System->_Audio;
|
||||
_Recompiler = System->m_Recomp;
|
||||
_MMU = &System->m_MMU_VM;
|
||||
_TLB = &System->m_TLB;
|
||||
_Plugins = System->m_Plugins;
|
||||
_Audio = &System->m_Audio;
|
||||
_Reg = &System->m_Reg;
|
||||
}
|
||||
if (g_MMU) { g_Reg = g_MMU->SystemRegisters(); }
|
||||
if (g_Reg)
|
||||
if (_Reg)
|
||||
{
|
||||
g_GPR = g_Reg->GPR;
|
||||
g_CP0 = g_Reg->CP0;
|
||||
g_FPR = g_Reg->FPR;
|
||||
g_FPCR = g_Reg->FPCR;
|
||||
g_FPRFloatLocation = g_Reg->FPR_S;
|
||||
g_FPRDoubleLocation = g_Reg->FPR_D;
|
||||
g_HI = &g_Reg->HI;
|
||||
g_LO = &g_Reg->LO;
|
||||
g_LLBit = &g_Reg->LLBit;
|
||||
g_LLAddr = &g_Reg->LLAddr;
|
||||
g_RegRI = g_Reg->RDRAM_Interface;
|
||||
g_RegRDRAM = g_Reg->RDRAM_Registers;
|
||||
g_RegMI = g_Reg->Mips_Interface;
|
||||
g_RegVI = g_Reg->Video_Interface;
|
||||
g_RegDPC = g_Reg->Display_ControlReg;
|
||||
g_RegAI = g_Reg->Audio_Interface;
|
||||
g_RegSP = g_Reg->SigProcessor_Interface;
|
||||
g_RegPI = g_Reg->Peripheral_Interface;
|
||||
g_RegSI = g_Reg->SerialInterface;
|
||||
g_AudioIntrReg = &g_Reg->AudioIntrReg;
|
||||
g_PROGRAM_COUNTER = &g_Reg->PROGRAM_COUNTER;
|
||||
g_Cop0_Name = g_Reg->Cop0_Name;
|
||||
g_Timer = &g_Reg->Timer;
|
||||
g_CurrentTimerType = &g_Reg->CurrentTimerType;
|
||||
_GPR = _Reg->GPR;
|
||||
_CP0 = _Reg->CP0;
|
||||
_FPR = _Reg->FPR;
|
||||
_FPCR = _Reg->FPCR;
|
||||
_FPRFloatLocation = _Reg->FPR_S;
|
||||
_FPRDoubleLocation = _Reg->FPR_D;
|
||||
_RegHI = &_Reg->HI;
|
||||
_RegLO = &_Reg->LO;
|
||||
_LLBit = &_Reg->LLBit;
|
||||
_LLAddr = &_Reg->LLAddr;
|
||||
_RegRI = _Reg->RDRAM_Interface;
|
||||
_RegRDRAM = _Reg->RDRAM_Registers;
|
||||
_RegMI = _Reg->Mips_Interface;
|
||||
_RegVI = _Reg->Video_Interface;
|
||||
_RegDPC = _Reg->Display_ControlReg;
|
||||
_RegAI = _Reg->Audio_Interface;
|
||||
_RegSP = _Reg->SigProcessor_Interface;
|
||||
_RegPI = _Reg->Peripheral_Interface;
|
||||
_RegSI = _Reg->SerialInterface;
|
||||
_AudioIntrReg = &_Reg->AudioIntrReg;
|
||||
_PROGRAM_COUNTER = &_Reg->PROGRAM_COUNTER;
|
||||
g_Cop0_Name = _Reg->Cop0_Name;
|
||||
_Timer = &_Reg->Timer;
|
||||
_CurrentTimerType = &_Reg->CurrentTimerType;
|
||||
}
|
||||
|
||||
CaptureScreen = g_Plugins->Gfx()->CaptureScreen;
|
||||
ChangeWindow = g_Plugins->Gfx()->ChangeWindow;
|
||||
// GetGfxDebugInfo = g_Plugins->Gfx()->GetGfxDebugInfo;
|
||||
// GFXCloseDLL = g_Plugins->Gfx()->GFXCloseDLL;
|
||||
// GFXDllAbout = g_Plugins->Gfx()->GFXDllAbout;
|
||||
// GFXDllConfig = g_Plugins->Gfx()->GFXDllConfig;
|
||||
// GfxRomClosed = g_Plugins->Gfx()->GfxRomClosed;
|
||||
// GfxRomOpen = g_Plugins->Gfx()->GfxRomOpen;
|
||||
DrawScreen = g_Plugins->Gfx()->DrawScreen;
|
||||
// FrameBufferRead = g_Plugins->Gfx()->FrameBufferRead;
|
||||
// FrameBufferWrite = g_Plugins->Gfx()->FrameBufferWrite;
|
||||
// InitiateGFX = g_Plugins->Gfx()->InitiateGFX;
|
||||
// InitiateGFXDebugger = g_Plugins->Gfx()->InitiateGFXDebugger;
|
||||
MoveScreen = g_Plugins->Gfx()->MoveScreen;
|
||||
ProcessDList = g_Plugins->Gfx()->ProcessDList;
|
||||
ProcessRDPList = g_Plugins->Gfx()->ProcessRDPList;
|
||||
ShowCFB = g_Plugins->Gfx()->ShowCFB;
|
||||
UpdateScreen = g_Plugins->Gfx()->UpdateScreen;
|
||||
ViStatusChanged = g_Plugins->Gfx()->ViStatusChanged;
|
||||
ViWidthChanged = g_Plugins->Gfx()->ViWidthChanged;
|
||||
CaptureScreen = _Plugins->Gfx()->CaptureScreen;
|
||||
ChangeWindow = _Plugins->Gfx()->ChangeWindow;
|
||||
// GetGfxDebugInfo = _Plugins->Gfx()->GetGfxDebugInfo;
|
||||
// GFXCloseDLL = _Plugins->Gfx()->GFXCloseDLL;
|
||||
// GFXDllAbout = _Plugins->Gfx()->GFXDllAbout;
|
||||
// GFXDllConfig = _Plugins->Gfx()->GFXDllConfig;
|
||||
// GfxRomClosed = _Plugins->Gfx()->GfxRomClosed;
|
||||
// GfxRomOpen = _Plugins->Gfx()->GfxRomOpen;
|
||||
DrawScreen = _Plugins->Gfx()->DrawScreen;
|
||||
// FrameBufferRead = _Plugins->Gfx()->FrameBufferRead;
|
||||
// FrameBufferWrite = _Plugins->Gfx()->FrameBufferWrite;
|
||||
// InitiateGFX = _Plugins->Gfx()->InitiateGFX;
|
||||
// InitiateGFXDebugger = _Plugins->Gfx()->InitiateGFXDebugger;
|
||||
MoveScreen = _Plugins->Gfx()->MoveScreen;
|
||||
ProcessDList = _Plugins->Gfx()->ProcessDList;
|
||||
ProcessRDPList = _Plugins->Gfx()->ProcessRDPList;
|
||||
ShowCFB = _Plugins->Gfx()->ShowCFB;
|
||||
UpdateScreen = _Plugins->Gfx()->UpdateScreen;
|
||||
ViStatusChanged = _Plugins->Gfx()->ViStatusChanged;
|
||||
ViWidthChanged = _Plugins->Gfx()->ViWidthChanged;
|
||||
|
||||
// ContCloseDLL = g_Plugins->Control()->ContCloseDLL;
|
||||
ControllerCommand = g_Plugins->Control()->ControllerCommand;
|
||||
// ContDllAbout = g_Plugins->Control()->ContDllAbout;
|
||||
// ContConfig = g_Plugins->Control()->ContConfig;
|
||||
// InitiateControllers_1_0= g_Plugins->Control()->InitiateControllers_1_0;
|
||||
// InitiateControllers_1_1= g_Plugins->Control()->InitiateControllers_1_1;
|
||||
GetKeys = g_Plugins->Control()->GetKeys;
|
||||
ReadController = g_Plugins->Control()->ReadController;
|
||||
// ContRomOpen = g_Plugins->Control()->ContRomOpen;
|
||||
// ContRomClosed = g_Plugins->Control()->ContRomClosed;
|
||||
// WM_KeyDown = g_Plugins->Control()->WM_KeyDown;
|
||||
// WM_KeyUp = g_Plugins->Control()->WM_KeyUp;
|
||||
RumbleCommand = g_Plugins->Control()->RumbleCommand;
|
||||
g_Controllers = g_Plugins->Control()->m_PluginControllers;
|
||||
// ContCloseDLL = _Plugins->Control()->ContCloseDLL;
|
||||
ControllerCommand = _Plugins->Control()->ControllerCommand;
|
||||
// ContDllAbout = _Plugins->Control()->ContDllAbout;
|
||||
// ContConfig = _Plugins->Control()->ContConfig;
|
||||
// InitiateControllers_1_0= _Plugins->Control()->InitiateControllers_1_0;
|
||||
// InitiateControllers_1_1= _Plugins->Control()->InitiateControllers_1_1;
|
||||
GetKeys = _Plugins->Control()->GetKeys;
|
||||
ReadController = _Plugins->Control()->ReadController;
|
||||
// ContRomOpen = _Plugins->Control()->ContRomOpen;
|
||||
// ContRomClosed = _Plugins->Control()->ContRomClosed;
|
||||
// WM_KeyDown = _Plugins->Control()->WM_KeyDown;
|
||||
// WM_KeyUp = _Plugins->Control()->WM_KeyUp;
|
||||
RumbleCommand = _Plugins->Control()->RumbleCommand;
|
||||
g_Controllers = _Plugins->Control()->m_PluginControllers;
|
||||
|
||||
// GetRspDebugInfo = g_Plugins->RSP()->GetRspDebugInfo;
|
||||
// RSPCloseDLL = g_Plugins->RSP()->RSPCloseDLL;
|
||||
// RSPDllAbout = g_Plugins->RSP()->RSPDllAbout;
|
||||
// RSPDllConfig = g_Plugins->RSP()->RSPDllConfig;
|
||||
// RSPRomClosed = g_Plugins->RSP()->RSPRomClosed;
|
||||
DoRspCycles = g_Plugins->RSP()->DoRspCycles;
|
||||
// InitiateRSP_1_0 = g_Plugins->RSP()->InitiateRSP_1_0;
|
||||
// InitiateRSP_1_1 = g_Plugins->RSP()->InitiateRSP_1_1;
|
||||
// InitiateRSPDebugger = g_Plugins->RSP()->InitiateRSPDebugger;
|
||||
// GetRspDebugInfo = _Plugins->RSP()->GetRspDebugInfo;
|
||||
// RSPCloseDLL = _Plugins->RSP()->RSPCloseDLL;
|
||||
// RSPDllAbout = _Plugins->RSP()->RSPDllAbout;
|
||||
// RSPDllConfig = _Plugins->RSP()->RSPDllConfig;
|
||||
// RSPRomClosed = _Plugins->RSP()->RSPRomClosed;
|
||||
DoRspCycles = _Plugins->RSP()->DoRspCycles;
|
||||
// InitiateRSP_1_0 = _Plugins->RSP()->InitiateRSP_1_0;
|
||||
// InitiateRSP_1_1 = _Plugins->RSP()->InitiateRSP_1_1;
|
||||
// InitiateRSPDebugger = _Plugins->RSP()->InitiateRSPDebugger;
|
||||
|
||||
// AiCloseDLL = g_Plugins->Audio()->AiCloseDLL;
|
||||
// AiDacrateChanged = g_Plugins->Audio()->AiDacrateChanged;
|
||||
AiLenChanged = g_Plugins->Audio()->LenChanged;
|
||||
// AiDllAbout = g_Plugins->Audio()->AiDllAbout;
|
||||
// AiDllConfig = g_Plugins->Audio()->AiDllConfig;
|
||||
// AiDllTest = g_Plugins->Audio()->AiDllTest;
|
||||
AiReadLength = g_Plugins->Audio()->ReadLength;
|
||||
// AiRomClosed = g_Plugins->Audio()->AiRomClosed;
|
||||
// AiUpdate = g_Plugins->Audio()->Update;
|
||||
// InitiateAudio = g_Plugins->Audio()->InitiateAudio;
|
||||
ProcessAList = g_Plugins->Audio()->ProcessAList;
|
||||
// AiCloseDLL = _Plugins->Audio()->AiCloseDLL;
|
||||
// AiDacrateChanged = _Plugins->Audio()->AiDacrateChanged;
|
||||
AiLenChanged = _Plugins->Audio()->LenChanged;
|
||||
// AiDllAbout = _Plugins->Audio()->AiDllAbout;
|
||||
// AiDllConfig = _Plugins->Audio()->AiDllConfig;
|
||||
// AiDllTest = _Plugins->Audio()->AiDllTest;
|
||||
AiReadLength = _Plugins->Audio()->ReadLength;
|
||||
// AiRomClosed = _Plugins->Audio()->AiRomClosed;
|
||||
// AiUpdate = _Plugins->Audio()->Update;
|
||||
// InitiateAudio = _Plugins->Audio()->InitiateAudio;
|
||||
ProcessAList = _Plugins->Audio()->ProcessAList;
|
||||
|
||||
g_N64MEM = System->_MMU->RDRAM;
|
||||
g_RDRAM = System->_MMU->RDRAM;
|
||||
g_DMEM = System->_MMU->DMEM;
|
||||
g_IMEM = System->_MMU->IMEM;
|
||||
g_ROM = System->_MMU->ROM;
|
||||
g_PIF_Ram = System->_MMU->PIF_Ram;
|
||||
g_TLB_ReadMap = System->_MMU->TLB_ReadMap;
|
||||
g_TLB_WriteMap = System->_MMU->TLB_WriteMap;
|
||||
g_HalfLine = &System->_MMU->m_HalfLine;
|
||||
g_MemoryStack = &System->_MMU->m_MemoryStack;
|
||||
g_RDRAM = _MMU->Rdram();
|
||||
g_DMEM = _MMU->Dmem();
|
||||
g_IMEM = _MMU->Imem();
|
||||
g_Rom = _Rom->GetRomAddress();
|
||||
g_TLB_ReadMap = NULL; //System->m_TLB.TLB_ReadMap;
|
||||
g_TLB_WriteMap = NULL; //System->m_TLB.TLB_WriteMap;
|
||||
#ifdef tofix
|
||||
g_MemorStack = &_MMU->m_MemoryStack;
|
||||
#endif
|
||||
}
|
||||
|
||||
void CC_Core::PauseExecution ( void )
|
||||
{
|
||||
g_N64System->Pause();
|
||||
_N64System->Pause();
|
||||
}
|
||||
|
||||
void CC_Core::RunRsp ( void )
|
||||
{
|
||||
try
|
||||
{
|
||||
g_N64System->RunRSP();
|
||||
_N64System->RunRSP();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -361,7 +359,7 @@ void CC_Core::RefreshScreen(void)
|
|||
{
|
||||
try
|
||||
{
|
||||
g_N64System->RefreshScreen();
|
||||
_N64System->RefreshScreen();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -371,22 +369,22 @@ void CC_Core::RefreshScreen(void)
|
|||
|
||||
void CC_Core::GenerateProfileLog ( void )
|
||||
{
|
||||
g_N64System->m_Profile.GenerateLog();
|
||||
_N64System->m_Profile.GenerateLog();
|
||||
}
|
||||
|
||||
void CC_Core::ResetTimer ( void )
|
||||
{
|
||||
g_N64System->m_Profile.ResetCounters();
|
||||
_N64System->m_Profile.ResetCounters();
|
||||
}
|
||||
|
||||
DWORD CC_Core::StartTimer ( DWORD Address )
|
||||
{
|
||||
return g_N64System->m_Profile.StartTimer(Address);
|
||||
return _N64System->m_Profile.StartTimer(Address);
|
||||
}
|
||||
|
||||
DWORD CC_Core::StopTimer ( void )
|
||||
{
|
||||
return g_N64System->m_Profile.StopTimer();
|
||||
return _N64System->m_Profile.StopTimer();
|
||||
}
|
||||
|
||||
void PauseExecution ( void )
|
||||
|
@ -396,65 +394,65 @@ void PauseExecution ( void )
|
|||
|
||||
void DisplayError ( const char * Message, ... )
|
||||
{
|
||||
if (g_Notify == NULL) { return; }
|
||||
if (_Notify == NULL) { return; }
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, Message );
|
||||
g_Notify->DisplayError(Message,ap);
|
||||
_Notify->DisplayError(Message,ap);
|
||||
}
|
||||
|
||||
void DisplayMessage ( int DisplayTime, const char * Message, ... )
|
||||
{
|
||||
if (g_Notify == NULL) { return; }
|
||||
if (_Notify == NULL) { return; }
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, Message );
|
||||
g_Notify->DisplayMessage(DisplayTime, Message,ap);
|
||||
_Notify->DisplayMessage(DisplayTime, Message,ap);
|
||||
}
|
||||
|
||||
void DisplayMessage2 ( const char * Message, ... )
|
||||
{
|
||||
if (g_Notify == NULL) { return; }
|
||||
if (_Notify == NULL) { return; }
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, Message );
|
||||
g_Notify->DisplayMessage2(Message,ap);
|
||||
_Notify->DisplayMessage2(Message,ap);
|
||||
}
|
||||
|
||||
const char * GetAppName ( void )
|
||||
{
|
||||
static stdstr szAppName = g_Settings->LoadString(Setting_ApplicationName);
|
||||
static stdstr szAppName = _Settings->LoadString(Setting_ApplicationName);
|
||||
return szAppName.c_str();
|
||||
}
|
||||
|
||||
void GetAutoSaveDir( char * Directory )
|
||||
{
|
||||
strcpy(Directory,g_Settings->LoadString(Directory_NativeSave).c_str());
|
||||
strcpy(Directory,_Settings->LoadString(Directory_NativeSave).c_str());
|
||||
}
|
||||
|
||||
void GetInstantSaveDir( char * Directory )
|
||||
{
|
||||
strcpy(Directory,g_Settings->LoadString(Directory_InstantSave).c_str());
|
||||
strcpy(Directory,_Settings->LoadString(Directory_InstantSave).c_str());
|
||||
}
|
||||
|
||||
void SetFpuLocations( void )
|
||||
{
|
||||
g_Reg->FixFpuLocations();
|
||||
_Reg->FixFpuLocations();
|
||||
}
|
||||
|
||||
BOOL Limit_FPS ( void )
|
||||
{
|
||||
return g_Settings->LoadDword(GameRunning_LimitFPS);
|
||||
return _Settings->LoadDword(GameRunning_LimitFPS);
|
||||
}
|
||||
|
||||
void DacrateChanged ( enum SystemType Type )
|
||||
{
|
||||
g_Plugins->Audio()->DacrateChanged(Type);
|
||||
_Plugins->Audio()->DacrateChanged(Type);
|
||||
}
|
||||
|
||||
BOOL Close_C_CPU ( void )
|
||||
{
|
||||
if (g_Settings == NULL || !g_Settings->LoadBool(GameRunning_CPU_Running))
|
||||
if (_Settings == NULL || !_Settings->LoadBool(GameRunning_CPU_Running))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -466,7 +464,7 @@ BOOL Close_C_CPU ( void )
|
|||
|
||||
void StopEmulation ( void )
|
||||
{
|
||||
g_N64System->CloseCpu();
|
||||
_N64System->CloseCpu();
|
||||
}
|
||||
|
||||
void CleanCMemory ( void )
|
||||
|
@ -485,7 +483,7 @@ void CleanCMemory ( void )
|
|||
|
||||
void __stdcall UpdateSyncCPU ( DWORD const Cycles )
|
||||
{
|
||||
g_N64System->UpdateSyncCPU(g_SyncSystem,Cycles);
|
||||
_N64System->UpdateSyncCPU(_SyncSystem,Cycles);
|
||||
}
|
||||
|
||||
void RunRsp( void )
|
||||
|
@ -505,74 +503,75 @@ void ExecuteCycles(DWORD Cycles)
|
|||
|
||||
void SyncSystem (void)
|
||||
{
|
||||
g_N64System->SyncCPU(g_SyncSystem);
|
||||
_N64System->SyncCPU(_SyncSystem);
|
||||
}
|
||||
|
||||
void ChangeTimer ( enum TimerType Type, int Value )
|
||||
{
|
||||
if (Value == 0)
|
||||
{
|
||||
g_Reg->DeactiateTimer(Type);
|
||||
_Reg->DeactiateTimer(Type);
|
||||
} else
|
||||
{
|
||||
g_Reg->ChangeTimerFixed(Type,Value);
|
||||
_Reg->ChangeTimerFixed(Type,Value);
|
||||
}
|
||||
}
|
||||
|
||||
void ChangeTimerRelative ( enum TimerType Type, int Value )
|
||||
{
|
||||
g_Reg->ChangeTimerRelative(Type,Value);
|
||||
_Reg->ChangeTimerRelative(Type,Value);
|
||||
}
|
||||
|
||||
void ApplyGSButtonCheats ( void )
|
||||
{
|
||||
CC_Core::ApplyGSButtonCheats(g_N64System);
|
||||
CC_Core::ApplyGSButtonCheats(_N64System);
|
||||
}
|
||||
|
||||
void ChangePluginFunc ( void )
|
||||
{
|
||||
g_Notify->DisplayMessage(0,MSG_PLUGIN_INIT);
|
||||
if (g_Settings->LoadBool(Plugin_GFX_Changed))
|
||||
_Notify->DisplayMessage(0,MSG_PLUGIN_INIT);
|
||||
if (_Settings->LoadBool(Plugin_GFX_Changed))
|
||||
{
|
||||
g_Plugins->Reset(PLUGIN_TYPE_GFX);
|
||||
_Plugins->Reset(PLUGIN_TYPE_GFX);
|
||||
}
|
||||
if (g_Settings->LoadBool(Plugin_AUDIO_Changed))
|
||||
if (_Settings->LoadBool(Plugin_AUDIO_Changed))
|
||||
{
|
||||
g_Plugins->Reset(PLUGIN_TYPE_AUDIO);
|
||||
_Plugins->Reset(PLUGIN_TYPE_AUDIO);
|
||||
}
|
||||
if (g_Settings->LoadBool(Plugin_CONT_Changed))
|
||||
if (_Settings->LoadBool(Plugin_CONT_Changed))
|
||||
{
|
||||
g_Plugins->Reset(PLUGIN_TYPE_CONTROLLER);
|
||||
_Plugins->Reset(PLUGIN_TYPE_CONTROLLER);
|
||||
}
|
||||
if (g_Settings->LoadBool(Plugin_RSP_Changed) ||
|
||||
g_Settings->LoadBool(Plugin_AUDIO_Changed) ||
|
||||
g_Settings->LoadBool(Plugin_GFX_Changed))
|
||||
if (_Settings->LoadBool(Plugin_RSP_Changed) ||
|
||||
_Settings->LoadBool(Plugin_AUDIO_Changed) ||
|
||||
_Settings->LoadBool(Plugin_GFX_Changed))
|
||||
{
|
||||
g_Plugins->Reset(PLUGIN_TYPE_RSP);
|
||||
_Plugins->Reset(PLUGIN_TYPE_RSP);
|
||||
}
|
||||
g_Settings->SaveBool(Plugin_RSP_Changed, false);
|
||||
g_Settings->SaveBool(Plugin_AUDIO_Changed,false);
|
||||
g_Settings->SaveBool(Plugin_GFX_Changed, false);
|
||||
g_Settings->SaveBool(Plugin_CONT_Changed, false);
|
||||
g_Notify->RefreshMenu();
|
||||
if (!g_Plugins->Initiate(g_N64System)) {
|
||||
g_Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT);
|
||||
_Settings->SaveBool(Plugin_RSP_Changed, false);
|
||||
_Settings->SaveBool(Plugin_AUDIO_Changed,false);
|
||||
_Settings->SaveBool(Plugin_GFX_Changed, false);
|
||||
_Settings->SaveBool(Plugin_CONT_Changed, false);
|
||||
_Notify->RefreshMenu();
|
||||
if (!_Plugins->Initiate())
|
||||
{
|
||||
_Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT);
|
||||
SetEndEmulation(true);
|
||||
} else {
|
||||
CC_Core::SetCurrentSystem(g_N64System);
|
||||
CC_Core::SetCurrentSystem(_N64System);
|
||||
}
|
||||
g_Recompiler->ResetRecompCode();
|
||||
_Recompiler->ResetRecompCode();
|
||||
}
|
||||
|
||||
void ChangeFullScreenFunc ( void )
|
||||
{
|
||||
g_Notify->ChangeFullScreen();
|
||||
_Notify->ChangeFullScreen();
|
||||
}
|
||||
|
||||
BOOL Machine_LoadState ( void )
|
||||
{
|
||||
bool Result = CC_Core::LoadState(g_N64System);
|
||||
CC_Core::SetCurrentSystem(g_N64System);
|
||||
bool Result = CC_Core::LoadState(_N64System);
|
||||
CC_Core::SetCurrentSystem(_N64System);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
@ -598,60 +597,47 @@ DWORD StopTimer ( void )
|
|||
|
||||
BOOL Machine_SaveState ( void )
|
||||
{
|
||||
return CC_Core::SaveState(g_N64System);
|
||||
return CC_Core::SaveState(_N64System);
|
||||
}
|
||||
|
||||
void BreakPoint(LPCSTR FileName, int LineNumber )
|
||||
{
|
||||
if (g_Notify)
|
||||
if (_Notify)
|
||||
{
|
||||
g_Notify->BreakPoint(FileName,LineNumber);
|
||||
_Notify->BreakPoint(FileName,LineNumber);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateCurrentHalfLine (void)
|
||||
{
|
||||
if (*g_Timer < 0) {
|
||||
*g_HalfLine = 0;
|
||||
return;
|
||||
}
|
||||
//DisplayError("Timer: %X",Timers.Timer);
|
||||
//HalfLine = (Timer / 1500) + VI_INTR_REG;
|
||||
*g_HalfLine = (DWORD)(*g_Timer / g_ViRefreshRate);
|
||||
*g_HalfLine &= ~1;
|
||||
// *g_HalfLine += ViFieldNumber;
|
||||
//Timers.Timer -= g_ViRefreshRate;
|
||||
}
|
||||
|
||||
void CC_Core::ApplyGSButtonCheats (CN64System * System)
|
||||
{
|
||||
if (System == NULL || System->_Cheats == NULL)
|
||||
if (System == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (System->_Cheats->CheatsSlectionChanged())
|
||||
if (System->m_Cheats.CheatsSlectionChanged())
|
||||
{
|
||||
System->_Cheats->LoadCheats(false);
|
||||
System->m_Cheats.LoadCheats(false);
|
||||
}
|
||||
System->_Cheats->ApplyGSButton(System->_MMU);
|
||||
System->m_Cheats.ApplyGSButton(_MMU);
|
||||
}
|
||||
|
||||
void CC_Core::ApplyCheats (CN64System * System)
|
||||
{
|
||||
if (System == NULL || System->_Cheats == NULL)
|
||||
if (System == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (System->_Cheats->CheatsSlectionChanged())
|
||||
if (System->m_Cheats.CheatsSlectionChanged())
|
||||
{
|
||||
System->_Cheats->LoadCheats(false);
|
||||
System->m_Cheats.LoadCheats(false);
|
||||
}
|
||||
System->_Cheats->ApplyCheats(System->_MMU);
|
||||
System->m_Cheats.ApplyCheats(_MMU);
|
||||
}
|
||||
|
||||
void ApplyCheats (void)
|
||||
{
|
||||
CC_Core::ApplyCheats(g_N64System);
|
||||
CC_Core::ApplyCheats(_N64System);
|
||||
}
|
||||
|
||||
void ResetX86Logs ( void )
|
||||
|
@ -665,12 +651,12 @@ void ResetX86Logs ( void )
|
|||
|
||||
BOOL EndEmulation ( void )
|
||||
{
|
||||
return g_N64System->EndEmulation;
|
||||
return _N64System->m_EndEmulation;
|
||||
}
|
||||
|
||||
void SetEndEmulation ( BOOL End )
|
||||
{
|
||||
g_N64System->EndEmulation = End != 0;
|
||||
_N64System->m_EndEmulation = End != 0;
|
||||
}
|
||||
|
||||
void CloseSaveChips ( void )
|
||||
|
@ -681,25 +667,9 @@ void CloseSaveChips ( void )
|
|||
CloseFlashRam();
|
||||
}
|
||||
|
||||
BOOL TranslateVaddr( DWORD VAddr, DWORD * PAddr )
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (PAddr == NULL)
|
||||
{
|
||||
BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
#endif
|
||||
return g_TLB->TranslateVaddr(VAddr,*PAddr);
|
||||
}
|
||||
|
||||
BOOL AddressDefined ( DWORD VAddr )
|
||||
{
|
||||
return g_TLB->TLB_AddressDefined(VAddr);
|
||||
}
|
||||
|
||||
void TLB_ReadEntry ( void )
|
||||
{
|
||||
g_TLB->TLB_ReadEntry();
|
||||
_TLB->ReadEntry();
|
||||
}
|
||||
|
||||
void TLB_WriteEntry( int index, BOOL Random )
|
||||
|
@ -708,12 +678,12 @@ void TLB_WriteEntry( int index, BOOL Random )
|
|||
{
|
||||
BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
g_TLB->TLB_WriteEntry(index,Random != 0);
|
||||
_TLB->WriteEntry(index,Random != 0);
|
||||
}
|
||||
|
||||
void TLB_Probe()
|
||||
{
|
||||
g_TLB->TLB_Probe();
|
||||
_TLB->Probe();
|
||||
}
|
||||
|
||||
void SyncToPC (void) {
|
||||
|
@ -723,18 +693,18 @@ void SyncToPC (void) {
|
|||
|
||||
BOOL ClearRecompCodeProtectMem ( DWORD Address, int length )
|
||||
{
|
||||
if (g_Recompiler)
|
||||
if (_Recompiler)
|
||||
{
|
||||
return g_Recompiler->ClearRecompCode_Phys(Address,length,CRecompiler::Remove_ProtectedMem);
|
||||
return _Recompiler->ClearRecompCode_Phys(Address,length,CRecompiler::Remove_ProtectedMem);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL ClearRecompCodeInitialCode ( void )
|
||||
{
|
||||
if (g_Recompiler)
|
||||
if (_Recompiler)
|
||||
{
|
||||
return g_Recompiler->ClearRecompCode_Virt(0x80000000,0x200,CRecompiler::Remove_InitialCode);
|
||||
return _Recompiler->ClearRecompCode_Virt(0x80000000,0x200,CRecompiler::Remove_InitialCode);
|
||||
}
|
||||
return false;
|
||||
}
|
|
@ -4,10 +4,11 @@
|
|||
#include "..\\..\\Multilanguage.h"
|
||||
#include "..\\..\\Plugin.h"
|
||||
|
||||
#ifdef toremove
|
||||
extern CN64System * g_N64System;
|
||||
extern CN64System * g_SyncSystem;
|
||||
extern CRecompiler * g_Recompiler;
|
||||
extern CMipsMemory * g_MMU; //Memory of the n64
|
||||
extern CMipsMemoryVM * g_MMU; //Memory of the n64
|
||||
extern CTLB * g_TLB; //TLB Unit
|
||||
extern CRegisters * g_Reg; //Current Register Set attacted to the _MMU
|
||||
extern CNotification * g_Notify;
|
||||
|
@ -15,6 +16,7 @@ extern CSettings * g_Settings;
|
|||
extern CPlugins * g_Plugins;
|
||||
extern CN64Rom * g_Rom; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
extern CAudio * g_Audio;
|
||||
#endif
|
||||
|
||||
class CC_Core
|
||||
{
|
||||
|
@ -70,7 +72,6 @@ BOOL Machine_LoadState ( void );
|
|||
BOOL Machine_SaveState ( void );
|
||||
void BreakPoint ( LPCSTR FileName, int LineNumber );
|
||||
void CleanCMemory ( void );
|
||||
void UpdateCurrentHalfLine ( void );
|
||||
void ApplyCheats ( void );
|
||||
void RunRsp ( void );
|
||||
void RefreshScreen ( void );
|
||||
|
@ -82,9 +83,7 @@ void CloseSaveChips ( void );
|
|||
|
||||
|
||||
//TLB Functions
|
||||
BOOL AddressDefined ( DWORD VAddr );
|
||||
BOOL TranslateVaddr ( DWORD VAddr, DWORD * PAddr);
|
||||
void TLB_Probe ( void );
|
||||
void TLB_ReadEntry ( void );
|
||||
void TLB_WriteEntry ( int index, BOOL Random );
|
||||
|
||||
|
@ -100,6 +99,7 @@ DWORD StopTimer ( void );
|
|||
|
||||
|
||||
//registers
|
||||
#ifdef toremove
|
||||
extern MULTI_ACCESS_QWORD * g_GPR, * g_FPR, * g_HI, * g_LO;
|
||||
extern DWORD * g_PROGRAM_COUNTER, * g_CP0, * g_RegMI, * g_LLBit,
|
||||
* g_LLAddr, * g_FPCR, * g_RegSI, * g_RegRI, * g_RegPI, * g_RegAI,
|
||||
|
@ -108,6 +108,7 @@ extern double ** g_FPRDoubleLocation;
|
|||
extern float ** g_FPRFloatLocation;
|
||||
extern enum TimerType * g_CurrentTimerType;
|
||||
extern int * g_Timer;
|
||||
#endif
|
||||
|
||||
//Register Name
|
||||
extern const char ** g_Cop0_Name;
|
||||
|
@ -130,8 +131,8 @@ extern CONTROL * g_Controllers;
|
|||
extern enum SystemType g_SystemType;
|
||||
|
||||
//Memory
|
||||
extern DWORD * g_TLB_ReadMap, * g_TLB_WriteMap, g_RdramSize, g_SystemRdramSize, *g_HalfLine, * g_MemoryStack;
|
||||
extern BYTE * g_N64MEM, *g_RDRAM, *g_DMEM, *g_IMEM, *g_ROM, *g_PIF_Ram;
|
||||
extern DWORD * g_TLB_ReadMap, * g_TLB_WriteMap, g_RdramSize, g_SystemRdramSize;
|
||||
extern BYTE *g_RDRAM, *g_DMEM, *g_IMEM;
|
||||
|
||||
//Misc
|
||||
enum { NoOfFrames = 7 };
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#define Profiling g_Profiling
|
||||
|
||||
// Registers
|
||||
#define GPR g_GPR
|
||||
/*#define GPR g_GPR
|
||||
#define CP0 g_CP0
|
||||
#define FPR g_FPR
|
||||
#define FPCR g_FPCR
|
||||
|
@ -23,7 +23,7 @@
|
|||
#define HI (*g_HI)
|
||||
#define LO (*g_LO)
|
||||
#define FPRDoubleLocation g_FPRDoubleLocation
|
||||
#define FPRFloatLocation g_FPRFloatLocation
|
||||
#define FPRFloatLocation g_FPRFloatLocation*/
|
||||
|
||||
//Register Names
|
||||
#define Cop0_Name g_Cop0_Name
|
||||
|
@ -50,17 +50,14 @@
|
|||
#define LookUpMode g_LookUpMode
|
||||
|
||||
//Plugins
|
||||
#define AudioIntrReg (*g_AudioIntrReg)
|
||||
//#define AudioIntrReg (*g_AudioIntrReg)
|
||||
#define Controllers g_Controllers
|
||||
|
||||
//Misc
|
||||
#define AppName GetAppName()
|
||||
#define N64MEM g_N64MEM
|
||||
#define RDRAM g_RDRAM
|
||||
#define DMEM g_DMEM
|
||||
#define IMEM g_IMEM
|
||||
#define ROM g_ROM
|
||||
#define PIF_Ram g_PIF_Ram
|
||||
#define TLB_WriteMap g_TLB_WriteMap
|
||||
#define TLB_ReadMap g_TLB_ReadMap
|
||||
#define RdramSize g_RdramSize
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -23,6 +23,10 @@
|
|||
* should be forwarded to them so if they want them.
|
||||
*
|
||||
*/
|
||||
#ifdef toremove
|
||||
extern void ** JumpTable;
|
||||
extern BYTE *RecompCode, *RecompPos;
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
#define ROM_IN_MAPSPACE
|
||||
|
@ -72,3 +76,4 @@ void Compile_SW_Register ( CBlockSection * Section, int x86Reg, DWORD Ad
|
|||
void ResetMemoryStack ( CBlockSection * Section );
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -1,6 +1,7 @@
|
|||
#include "main.h"
|
||||
#include "CPU.h"
|
||||
#include "debugger.h"
|
||||
#include "Interpreter Ops 32.h"
|
||||
|
||||
//int NextInstruction, ManualPaused;
|
||||
//int DlistCount, AlistCount;
|
||||
|
@ -8,19 +9,21 @@
|
|||
//DWORD MemoryStack;
|
||||
DWORD JumpToLocation;
|
||||
|
||||
extern R4300iOp_FUNC * R4300i_Opcode;
|
||||
|
||||
void InitializeCPUCore ( void )
|
||||
{
|
||||
LARGE_INTEGER PerformanceFrequency;
|
||||
|
||||
BuildInterpreter();
|
||||
R4300i_Opcode = R4300iOp::BuildInterpreter();
|
||||
//R4300i_Opcode = R4300iOp32::BuildInterpreter();
|
||||
CurrentFrame = 0;
|
||||
|
||||
QueryPerformanceFrequency(&PerformanceFrequency);
|
||||
Frequency = PerformanceFrequency.QuadPart;
|
||||
|
||||
{
|
||||
BYTE Country = *(ROM + 0x3D);
|
||||
switch (Country)
|
||||
switch (_Rom->GetCountry())
|
||||
{
|
||||
case Germany: case french: case Italian:
|
||||
case Europe: case Spanish: case Australia:
|
||||
|
@ -58,7 +61,7 @@ void InitializeCPUCore ( void )
|
|||
int DelaySlotEffectsJump (DWORD JumpPC) {
|
||||
OPCODE Command;
|
||||
|
||||
if (!r4300i_LW_VAddr(JumpPC, &Command.Hex)) { return TRUE; }
|
||||
if (!_MMU->LW_VAddr(JumpPC, Command.Hex)) { return TRUE; }
|
||||
|
||||
switch (Command.op) {
|
||||
case R4300i_SPECIAL:
|
||||
|
@ -98,7 +101,7 @@ int DelaySlotEffectsJump (DWORD JumpPC) {
|
|||
int EffectDelaySlot;
|
||||
OPCODE NewCommand;
|
||||
|
||||
if (!r4300i_LW_VAddr(JumpPC + 4, &NewCommand.Hex)) { return TRUE; }
|
||||
if (!_MMU->LW_VAddr(JumpPC + 4, NewCommand.Hex)) { return TRUE; }
|
||||
|
||||
EffectDelaySlot = FALSE;
|
||||
if (NewCommand.op == R4300i_CP1) {
|
||||
|
@ -138,7 +141,7 @@ void DoSomething ( void ) {
|
|||
ShowCFB();
|
||||
FAKE_CAUSE_REGISTER |= CAUSE_IP4;
|
||||
CheckInterrupts();
|
||||
g_Plugins->Gfx()->SoftReset();
|
||||
_Plugins->Gfx()->SoftReset();
|
||||
}
|
||||
|
||||
if (CPU_Action.GenerateInterrupt)
|
||||
|
@ -216,11 +219,11 @@ void TimerDone (void) {
|
|||
}
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
if (LogOptions.GenerateLog && LogOptions.LogExceptions && !LogOptions.NoInterrupts) {
|
||||
LogMessage("%08X: Timer Done (Type: %d CurrentTimer: %d)", PROGRAM_COUNTER, *g_CurrentTimerType, *g_Timer );
|
||||
LogMessage("%08X: Timer Done (Type: %d CurrentTimer: %d)", *_PROGRAM_COUNTER, *_CurrentTimerType, *_Timer );
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (*g_CurrentTimerType) {
|
||||
switch (*_CurrentTimerType) {
|
||||
case CompareTimer:
|
||||
FAKE_CAUSE_REGISTER |= CAUSE_IP7;
|
||||
CheckInterrupts();
|
||||
|
@ -228,7 +231,7 @@ void TimerDone (void) {
|
|||
break;
|
||||
case SoftResetTimer:
|
||||
ChangeTimer(SoftResetTimer,0);
|
||||
g_N64System->SoftReset();
|
||||
_N64System->SoftReset();
|
||||
break;
|
||||
case SiTimer:
|
||||
ChangeTimer(SiTimer,0);
|
||||
|
@ -255,7 +258,7 @@ void TimerDone (void) {
|
|||
ChangeTimer(AiTimer,0);
|
||||
MI_INTR_REG |= MI_INTR_AI;
|
||||
CheckInterrupts();
|
||||
g_Audio->AiCallBack();
|
||||
_Audio->AiCallBack();
|
||||
break;
|
||||
default:
|
||||
BreakPoint(__FILE__,__LINE__);
|
||||
|
@ -283,15 +286,15 @@ void InPermLoop (void) {
|
|||
if (( STATUS_REGISTER & 0xFF00) == 0) { goto InterruptsDisabled; }
|
||||
|
||||
/* check sound playing */
|
||||
g_N64System->SyncToAudio();
|
||||
_N64System->SyncToAudio();
|
||||
|
||||
/* check RSP running */
|
||||
/* check RDP running */
|
||||
|
||||
if (*g_Timer > 0) {
|
||||
COUNT_REGISTER += *g_Timer + 1;
|
||||
if (*_Timer > 0) {
|
||||
COUNT_REGISTER += *_Timer + 1;
|
||||
//if (CPU_Type == CPU_SyncCores) { SyncRegisters.CP0[9] += Timers.Timer + 1; }
|
||||
*g_Timer = -1;
|
||||
*_Timer = -1;
|
||||
}
|
||||
return;
|
||||
|
||||
|
@ -308,7 +311,7 @@ InterruptsDisabled:
|
|||
int DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2) {
|
||||
OPCODE Command;
|
||||
|
||||
if (!r4300i_LW_VAddr(PC + 4, &Command.Hex)) {
|
||||
if (!_MMU->LW_VAddr(PC + 4, Command.Hex)) {
|
||||
//DisplayError("Failed to load word 2");
|
||||
//ExitThread(0);
|
||||
return TRUE;
|
||||
|
|
|
@ -31,11 +31,11 @@
|
|||
|
||||
void OnFirstDMA (void) {
|
||||
switch (CicChip) {
|
||||
case 1: *(DWORD *)&N64MEM[0x318] = RdramSize; break;
|
||||
case 2: *(DWORD *)&N64MEM[0x318] = RdramSize; break;
|
||||
case 3: *(DWORD *)&N64MEM[0x318] = RdramSize; break;
|
||||
case 5: *(DWORD *)&N64MEM[0x3F0] = RdramSize; break;
|
||||
case 6: *(DWORD *)&N64MEM[0x318] = RdramSize; break;
|
||||
case 1: *(DWORD *)&RDRAM[0x318] = RdramSize; break;
|
||||
case 2: *(DWORD *)&RDRAM[0x318] = RdramSize; break;
|
||||
case 3: *(DWORD *)&RDRAM[0x318] = RdramSize; break;
|
||||
case 5: *(DWORD *)&RDRAM[0x3F0] = RdramSize; break;
|
||||
case 6: *(DWORD *)&RDRAM[0x318] = RdramSize; break;
|
||||
default: DisplayError("Unhandled CicChip(%d) in first DMA",CicChip);
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ void PI_DMA_READ (void) {
|
|||
if (SaveUsing == SaveChip_Auto) { SaveUsing = SaveChip_Sram; }
|
||||
if (SaveUsing == SaveChip_Sram) {
|
||||
DmaToSram(
|
||||
N64MEM+PI_DRAM_ADDR_REG,
|
||||
RDRAM+PI_DRAM_ADDR_REG,
|
||||
PI_CART_ADDR_REG - 0x08000000,
|
||||
PI_RD_LEN_REG + 1
|
||||
);
|
||||
|
@ -68,7 +68,7 @@ void PI_DMA_READ (void) {
|
|||
}
|
||||
if (SaveUsing == SaveChip_FlashRam) {
|
||||
DmaToFlashram(
|
||||
N64MEM+PI_DRAM_ADDR_REG,
|
||||
RDRAM+PI_DRAM_ADDR_REG,
|
||||
PI_CART_ADDR_REG - 0x08000000,
|
||||
PI_WR_LEN_REG + 1
|
||||
);
|
||||
|
@ -97,7 +97,6 @@ void PI_DMA_READ (void) {
|
|||
}
|
||||
|
||||
void PI_DMA_WRITE (void) {
|
||||
DWORD i;
|
||||
|
||||
PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
||||
if ( PI_DRAM_ADDR_REG + PI_WR_LEN_REG + 1 > RdramSize)
|
||||
|
@ -113,7 +112,7 @@ void PI_DMA_WRITE (void) {
|
|||
if (SaveUsing == SaveChip_Auto) { SaveUsing = SaveChip_Sram; }
|
||||
if (SaveUsing == SaveChip_Sram) {
|
||||
DmaFromSram(
|
||||
N64MEM+PI_DRAM_ADDR_REG,
|
||||
RDRAM+PI_DRAM_ADDR_REG,
|
||||
PI_CART_ADDR_REG - 0x08000000,
|
||||
PI_WR_LEN_REG + 1
|
||||
);
|
||||
|
@ -124,7 +123,7 @@ void PI_DMA_WRITE (void) {
|
|||
}
|
||||
if (SaveUsing == SaveChip_FlashRam) {
|
||||
DmaFromFlashram(
|
||||
N64MEM+PI_DRAM_ADDR_REG,
|
||||
RDRAM+PI_DRAM_ADDR_REG,
|
||||
PI_CART_ADDR_REG - 0x08000000,
|
||||
PI_WR_LEN_REG + 1
|
||||
);
|
||||
|
@ -136,25 +135,29 @@ void PI_DMA_WRITE (void) {
|
|||
}
|
||||
|
||||
if ( PI_CART_ADDR_REG >= 0x10000000 && PI_CART_ADDR_REG <= 0x1FBFFFFF) {
|
||||
DWORD i;
|
||||
#ifdef tofix
|
||||
#ifdef ROM_IN_MAPSPACE
|
||||
if (WrittenToRom) {
|
||||
DWORD OldProtect;
|
||||
VirtualProtect(ROM,RomFileSize,PAGE_READONLY, &OldProtect);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
BYTE * ROM = _Rom->GetRomAddress();
|
||||
PI_CART_ADDR_REG -= 0x10000000;
|
||||
if (PI_CART_ADDR_REG + PI_WR_LEN_REG + 1 < RomFileSize) {
|
||||
for (i = 0; i < PI_WR_LEN_REG + 1; i ++) {
|
||||
*(N64MEM+((PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((PI_CART_ADDR_REG + i) ^ 3));
|
||||
*(RDRAM+((PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((PI_CART_ADDR_REG + i) ^ 3));
|
||||
}
|
||||
} else {
|
||||
DWORD Len;
|
||||
Len = RomFileSize - PI_CART_ADDR_REG;
|
||||
for (i = 0; i < Len; i ++) {
|
||||
*(N64MEM+((PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((PI_CART_ADDR_REG + i) ^ 3));
|
||||
*(RDRAM+((PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((PI_CART_ADDR_REG + i) ^ 3));
|
||||
}
|
||||
for (i = Len; i < PI_WR_LEN_REG + 1 - Len; i ++) {
|
||||
*(N64MEM+((PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
|
||||
*(RDRAM+((PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
|
||||
}
|
||||
}
|
||||
PI_CART_ADDR_REG += 0x10000000;
|
||||
|
@ -163,9 +166,9 @@ void PI_DMA_WRITE (void) {
|
|||
CPU_Action.DMAUsed = TRUE;
|
||||
OnFirstDMA();
|
||||
}
|
||||
if (g_Recompiler && g_Recompiler->bSMM_PIDMA())
|
||||
if (_Recompiler && _Recompiler->bSMM_PIDMA())
|
||||
{
|
||||
g_Recompiler->ClearRecompCode_Phys(PI_DRAM_ADDR_REG, PI_WR_LEN_REG,CRecompiler::Remove_DMA);
|
||||
_Recompiler->ClearRecompCode_Phys(PI_DRAM_ADDR_REG, PI_WR_LEN_REG,CRecompiler::Remove_DMA);
|
||||
}
|
||||
PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||
MI_INTR_REG |= MI_INTR_PI;
|
||||
|
@ -183,7 +186,8 @@ void PI_DMA_WRITE (void) {
|
|||
}
|
||||
|
||||
void SI_DMA_READ (void) {
|
||||
BYTE * PifRamPos = &PIF_Ram[0];
|
||||
BYTE * PIF_Ram = _MMU->PifRam();
|
||||
BYTE * PifRamPos = _MMU->PifRam();
|
||||
|
||||
if ((int)SI_DRAM_ADDR_REG > (int)RdramSize) {
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
|
@ -200,13 +204,13 @@ void SI_DMA_READ (void) {
|
|||
RdramPos = (int)SI_DRAM_ADDR_REG;
|
||||
for (count = 0; count < 0x40; count++, RdramPos++) {
|
||||
if (RdramPos < 0) { continue; }
|
||||
N64MEM[RdramPos ^3] = PIF_Ram[count];
|
||||
RDRAM[RdramPos ^3] = PIF_Ram[count];
|
||||
}
|
||||
} else {
|
||||
_asm {
|
||||
mov edi, dword ptr [RegSI]
|
||||
mov edi, dword ptr [_RegSI]
|
||||
mov edi, dword ptr [edi]
|
||||
add edi, N64MEM
|
||||
add edi, RDRAM
|
||||
mov ecx, PifRamPos
|
||||
mov edx, 0
|
||||
memcpyloop:
|
||||
|
@ -271,7 +275,8 @@ void SI_DMA_READ (void) {
|
|||
}
|
||||
|
||||
void SI_DMA_WRITE (void) {
|
||||
BYTE * PifRamPos = &PIF_Ram[0];
|
||||
BYTE * PIF_Ram = _MMU->PifRam();
|
||||
BYTE * PifRamPos = PIF_Ram;
|
||||
|
||||
if ((int)SI_DRAM_ADDR_REG > (int)RdramSize) {
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
|
@ -287,13 +292,13 @@ void SI_DMA_WRITE (void) {
|
|||
RdramPos = (int)SI_DRAM_ADDR_REG;
|
||||
for (count = 0; count < 0x40; count++, RdramPos++) {
|
||||
if (RdramPos < 0) { PIF_Ram[count] = 0; continue; }
|
||||
PIF_Ram[count] = N64MEM[RdramPos ^3];
|
||||
PIF_Ram[count] = RDRAM[RdramPos ^3];
|
||||
}
|
||||
} else {
|
||||
_asm {
|
||||
mov ecx, dword ptr [RegSI]
|
||||
mov ecx, dword ptr [_RegSI]
|
||||
mov ecx, dword ptr [ecx]
|
||||
add ecx, N64MEM
|
||||
add ecx, RDRAM
|
||||
mov edi, PifRamPos
|
||||
mov edx, 0
|
||||
memcpyloop:
|
||||
|
@ -383,7 +388,7 @@ void SP_DMA_READ (void) {
|
|||
if ((SP_DRAM_ADDR_REG & 3) != 0) { BreakPoint(__FILE__,__LINE__); }
|
||||
if (((SP_RD_LEN_REG + 1) & 3) != 0) { BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
memcpy( DMEM + (SP_MEM_ADDR_REG & 0x1FFF), N64MEM + SP_DRAM_ADDR_REG,
|
||||
memcpy( DMEM + (SP_MEM_ADDR_REG & 0x1FFF), RDRAM + SP_DRAM_ADDR_REG,
|
||||
SP_RD_LEN_REG + 1 );
|
||||
|
||||
SP_DMA_BUSY_REG = 0;
|
||||
|
@ -409,7 +414,7 @@ void SP_DMA_WRITE (void) {
|
|||
if ((SP_DRAM_ADDR_REG & 3) != 0) { BreakPoint(__FILE__,__LINE__); }
|
||||
if (((SP_WR_LEN_REG + 1) & 3) != 0) { BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
memcpy( N64MEM + SP_DRAM_ADDR_REG, DMEM + (SP_MEM_ADDR_REG & 0x1FFF),
|
||||
memcpy( RDRAM + SP_DRAM_ADDR_REG, DMEM + (SP_MEM_ADDR_REG & 0x1FFF),
|
||||
SP_WR_LEN_REG + 1);
|
||||
|
||||
SP_DMA_BUSY_REG = 0;
|
||||
|
|
|
@ -38,7 +38,7 @@ void __cdecl CheckInterrupts ( void ) {
|
|||
|
||||
if (!g_FixedAudio && CPU_Type != CPU_SyncCores) {
|
||||
MI_INTR_REG &= ~MI_INTR_AI;
|
||||
MI_INTR_REG |= (AudioIntrReg & MI_INTR_AI);
|
||||
MI_INTR_REG |= (_Reg->AudioIntrReg & MI_INTR_AI);
|
||||
}
|
||||
if ((MI_INTR_MASK_REG & MI_INTR_REG) != 0) {
|
||||
FAKE_CAUSE_REGISTER |= CAUSE_IP2;
|
||||
|
@ -76,12 +76,12 @@ void DoAddressError ( BOOL DelaySlot, DWORD BadVaddr, BOOL FromRead) {
|
|||
BAD_VADDR_REGISTER = BadVaddr;
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
}
|
||||
|
||||
void DoBreakException ( BOOL DelaySlot) {
|
||||
|
@ -97,12 +97,12 @@ void DoBreakException ( BOOL DelaySlot) {
|
|||
CAUSE_REGISTER = EXC_BREAK;
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
}
|
||||
|
||||
void _fastcall DoCopUnusableException ( BOOL DelaySlot, int Coprocessor ) {
|
||||
|
@ -119,12 +119,12 @@ void _fastcall DoCopUnusableException ( BOOL DelaySlot, int Coprocessor ) {
|
|||
if (Coprocessor == 1) { CAUSE_REGISTER |= 0x10000000; }
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
}
|
||||
|
||||
BOOL DoIntrException ( BOOL DelaySlot ) {
|
||||
|
@ -133,19 +133,19 @@ BOOL DoIntrException ( BOOL DelaySlot ) {
|
|||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 ) { return FALSE; }
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
if (LogOptions.GenerateLog && LogOptions.LogExceptions && !LogOptions.NoInterrupts) {
|
||||
LogMessage("%08X: Interupt Generated", PROGRAM_COUNTER );
|
||||
LogMessage("%08X: Interupt Generated", (*_PROGRAM_COUNTER) );
|
||||
}
|
||||
#endif
|
||||
CAUSE_REGISTER = FAKE_CAUSE_REGISTER;
|
||||
CAUSE_REGISTER |= EXC_INT;
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -158,21 +158,25 @@ void _fastcall DoTLBMiss ( BOOL DelaySlot, DWORD BadVaddr ) {
|
|||
if ((STATUS_REGISTER & STATUS_EXL) == 0) {
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
if (AddressDefined(BadVaddr)) {
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
if (_TLB->AddressDefined(BadVaddr))
|
||||
{
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
} else {
|
||||
PROGRAM_COUNTER = 0x80000000;
|
||||
(*_PROGRAM_COUNTER) = 0x80000000;
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
} else {
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
DisplayError("TLBMiss - EXL Set\nBadVaddr = %X\nAddress Defined: %s",BadVaddr,AddressDefined(BadVaddr)?"TRUE":"FALSE");
|
||||
DisplayError("TLBMiss - EXL Set\nBadVaddr = %X\nAddress Defined: %s",BadVaddr,_TLB->TLB_AddressDefined(BadVaddr)?"TRUE":"FALSE");
|
||||
#endif
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
#endif
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,10 +193,10 @@ void _fastcall DoSysCallException ( BOOL DelaySlot) {
|
|||
CAUSE_REGISTER = EXC_SYSCALL;
|
||||
if (DelaySlot) {
|
||||
CAUSE_REGISTER |= CAUSE_BD;
|
||||
EPC_REGISTER = PROGRAM_COUNTER - 4;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER) - 4;
|
||||
} else {
|
||||
EPC_REGISTER = PROGRAM_COUNTER;
|
||||
EPC_REGISTER = (*_PROGRAM_COUNTER);
|
||||
}
|
||||
STATUS_REGISTER |= STATUS_EXL;
|
||||
PROGRAM_COUNTER = 0x80000180;
|
||||
(*_PROGRAM_COUNTER) = 0x80000180;
|
||||
}
|
|
@ -106,7 +106,7 @@ void DmaFromFlashram(BYTE * dest, int StartOffset, int len) {
|
|||
break;
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
default:
|
||||
DisplayError("DmaFromFlashram Start: %X, Offset: %X len: %X",dest - N64MEM,StartOffset,len);
|
||||
DisplayError("DmaFromFlashram Start: %X, Offset: %X len: %X",dest - RDRAM,StartOffset,len);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -118,7 +118,7 @@ void DmaToFlashram(BYTE * Source, int StartOffset, int len) {
|
|||
break;
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
default:
|
||||
DisplayError("DmaToFlashram Start: %X, Offset: %X len: %X",Source - N64MEM,StartOffset,len);
|
||||
DisplayError("DmaToFlashram Start: %X, Offset: %X len: %X",Source - RDRAM,StartOffset,len);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,660 +32,20 @@
|
|||
#include "debugger.h"
|
||||
#include "plugin.h"
|
||||
|
||||
void * R4300i_Opcode[64];
|
||||
void * R4300i_Special[64];
|
||||
void * R4300i_Regimm[32];
|
||||
void * R4300i_CoP0[32];
|
||||
void * R4300i_CoP0_Function[64];
|
||||
void * R4300i_CoP1[32];
|
||||
void * R4300i_CoP1_BC[32];
|
||||
void * R4300i_CoP1_S[64];
|
||||
void * R4300i_CoP1_D[64];
|
||||
void * R4300i_CoP1_W[64];
|
||||
void * R4300i_CoP1_L[64];
|
||||
|
||||
BOOL TestTimer = FALSE;
|
||||
|
||||
void _fastcall R4300i_opcode_SPECIAL (void) {
|
||||
((void (_fastcall *)()) R4300i_Special[ Opcode.funct ])();
|
||||
}
|
||||
R4300iOp_FUNC * R4300i_Opcode;
|
||||
|
||||
void _fastcall R4300i_opcode_REGIMM (void) {
|
||||
((void (_fastcall *)()) R4300i_Regimm[ Opcode.rt ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP0 (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP0[ Opcode.rs ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP0_CO (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP0_Function[ Opcode.funct ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1 (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP1[ Opcode.fmt ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1_BC (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP1_BC[ Opcode.ft ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1_S (void) {
|
||||
_controlfp(RoundingModel,_MCW_RC);
|
||||
((void (_fastcall *)()) R4300i_CoP1_S[ Opcode.funct ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1_D (void) {
|
||||
_controlfp(RoundingModel,_MCW_RC);
|
||||
((void (_fastcall *)()) R4300i_CoP1_D[ Opcode.funct ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1_W (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP1_W[ Opcode.funct ])();
|
||||
}
|
||||
|
||||
void _fastcall R4300i_opcode_COP1_L (void) {
|
||||
((void (_fastcall *)()) R4300i_CoP1_L[ Opcode.funct ])();
|
||||
}
|
||||
|
||||
void BuildInterpreter (void ) {
|
||||
R4300i_Opcode[ 0] = R4300i_opcode_SPECIAL;
|
||||
R4300i_Opcode[ 1] = R4300i_opcode_REGIMM;
|
||||
R4300i_Opcode[ 2] = r4300i_J;
|
||||
R4300i_Opcode[ 3] = r4300i_JAL;
|
||||
R4300i_Opcode[ 4] = r4300i_BEQ;
|
||||
R4300i_Opcode[ 5] = r4300i_BNE;
|
||||
R4300i_Opcode[ 6] = r4300i_BLEZ;
|
||||
R4300i_Opcode[ 7] = r4300i_BGTZ;
|
||||
R4300i_Opcode[ 8] = r4300i_ADDI;
|
||||
R4300i_Opcode[ 9] = r4300i_ADDIU;
|
||||
R4300i_Opcode[10] = r4300i_SLTI;
|
||||
R4300i_Opcode[11] = r4300i_SLTIU;
|
||||
R4300i_Opcode[12] = r4300i_ANDI;
|
||||
R4300i_Opcode[13] = r4300i_ORI;
|
||||
R4300i_Opcode[14] = r4300i_XORI;
|
||||
R4300i_Opcode[15] = r4300i_LUI;
|
||||
R4300i_Opcode[16] = R4300i_opcode_COP0;
|
||||
R4300i_Opcode[17] = R4300i_opcode_COP1;
|
||||
R4300i_Opcode[18] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[19] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[20] = r4300i_BEQL;
|
||||
R4300i_Opcode[21] = r4300i_BNEL;
|
||||
R4300i_Opcode[22] = r4300i_BLEZL;
|
||||
R4300i_Opcode[23] = r4300i_BGTZL;
|
||||
R4300i_Opcode[24] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[25] = r4300i_DADDIU;
|
||||
R4300i_Opcode[26] = r4300i_LDL;
|
||||
R4300i_Opcode[27] = r4300i_LDR;
|
||||
R4300i_Opcode[28] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[29] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[30] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[31] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[32] = r4300i_LB;
|
||||
R4300i_Opcode[33] = r4300i_LH;
|
||||
R4300i_Opcode[34] = r4300i_LWL;
|
||||
R4300i_Opcode[35] = r4300i_LW;
|
||||
R4300i_Opcode[36] = r4300i_LBU;
|
||||
R4300i_Opcode[37] = r4300i_LHU;
|
||||
R4300i_Opcode[38] = r4300i_LWR;
|
||||
R4300i_Opcode[39] = r4300i_LWU;
|
||||
R4300i_Opcode[40] = r4300i_SB;
|
||||
R4300i_Opcode[41] = r4300i_SH;
|
||||
R4300i_Opcode[42] = r4300i_SWL;
|
||||
R4300i_Opcode[43] = r4300i_SW;
|
||||
R4300i_Opcode[44] = r4300i_SDL;
|
||||
R4300i_Opcode[45] = r4300i_SDR;
|
||||
R4300i_Opcode[46] = r4300i_SWR;
|
||||
R4300i_Opcode[47] = r4300i_CACHE;
|
||||
R4300i_Opcode[48] = r4300i_LL;
|
||||
R4300i_Opcode[49] = r4300i_LWC1;
|
||||
R4300i_Opcode[50] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[51] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[52] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[53] = r4300i_LDC1;
|
||||
R4300i_Opcode[54] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[55] = r4300i_LD;
|
||||
R4300i_Opcode[56] = r4300i_SC;
|
||||
R4300i_Opcode[57] = r4300i_SWC1;
|
||||
R4300i_Opcode[58] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[59] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[60] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[61] = r4300i_SDC1;
|
||||
R4300i_Opcode[62] = R4300i_UnknownOpcode;
|
||||
R4300i_Opcode[63] = r4300i_SD;
|
||||
|
||||
R4300i_Special[ 0] = r4300i_SPECIAL_SLL;
|
||||
R4300i_Special[ 1] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[ 2] = r4300i_SPECIAL_SRL;
|
||||
R4300i_Special[ 3] = r4300i_SPECIAL_SRA;
|
||||
R4300i_Special[ 4] = r4300i_SPECIAL_SLLV;
|
||||
R4300i_Special[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[ 6] = r4300i_SPECIAL_SRLV;
|
||||
R4300i_Special[ 7] = r4300i_SPECIAL_SRAV;
|
||||
R4300i_Special[ 8] = r4300i_SPECIAL_JR;
|
||||
R4300i_Special[ 9] = r4300i_SPECIAL_JALR;
|
||||
R4300i_Special[10] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[11] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[12] = r4300i_SPECIAL_SYSCALL;
|
||||
R4300i_Special[13] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[14] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[15] = r4300i_SPECIAL_SYNC;
|
||||
R4300i_Special[16] = r4300i_SPECIAL_MFHI;
|
||||
R4300i_Special[17] = r4300i_SPECIAL_MTHI;
|
||||
R4300i_Special[18] = r4300i_SPECIAL_MFLO;
|
||||
R4300i_Special[19] = r4300i_SPECIAL_MTLO;
|
||||
R4300i_Special[20] = r4300i_SPECIAL_DSLLV;
|
||||
R4300i_Special[21] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[22] = r4300i_SPECIAL_DSRLV;
|
||||
R4300i_Special[23] = r4300i_SPECIAL_DSRAV;
|
||||
R4300i_Special[24] = r4300i_SPECIAL_MULT;
|
||||
R4300i_Special[25] = r4300i_SPECIAL_MULTU;
|
||||
R4300i_Special[26] = r4300i_SPECIAL_DIV;
|
||||
R4300i_Special[27] = r4300i_SPECIAL_DIVU;
|
||||
R4300i_Special[28] = r4300i_SPECIAL_DMULT;
|
||||
R4300i_Special[29] = r4300i_SPECIAL_DMULTU;
|
||||
R4300i_Special[30] = r4300i_SPECIAL_DDIV;
|
||||
R4300i_Special[31] = r4300i_SPECIAL_DDIVU;
|
||||
R4300i_Special[32] = r4300i_SPECIAL_ADD;
|
||||
R4300i_Special[33] = r4300i_SPECIAL_ADDU;
|
||||
R4300i_Special[34] = r4300i_SPECIAL_SUB;
|
||||
R4300i_Special[35] = r4300i_SPECIAL_SUBU;
|
||||
R4300i_Special[36] = r4300i_SPECIAL_AND;
|
||||
R4300i_Special[37] = r4300i_SPECIAL_OR;
|
||||
R4300i_Special[38] = r4300i_SPECIAL_XOR;
|
||||
R4300i_Special[39] = r4300i_SPECIAL_NOR;
|
||||
R4300i_Special[40] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[41] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[42] = r4300i_SPECIAL_SLT;
|
||||
R4300i_Special[43] = r4300i_SPECIAL_SLTU;
|
||||
R4300i_Special[44] = r4300i_SPECIAL_DADD;
|
||||
R4300i_Special[45] = r4300i_SPECIAL_DADDU;
|
||||
R4300i_Special[46] = r4300i_SPECIAL_DSUB;
|
||||
R4300i_Special[47] = r4300i_SPECIAL_DSUBU;
|
||||
R4300i_Special[48] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[49] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[50] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[51] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[52] = r4300i_SPECIAL_TEQ;
|
||||
R4300i_Special[53] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[54] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[55] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[56] = r4300i_SPECIAL_DSLL;
|
||||
R4300i_Special[57] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[58] = r4300i_SPECIAL_DSRL;
|
||||
R4300i_Special[59] = r4300i_SPECIAL_DSRA;
|
||||
R4300i_Special[60] = r4300i_SPECIAL_DSLL32;
|
||||
R4300i_Special[61] = R4300i_UnknownOpcode;
|
||||
R4300i_Special[62] = r4300i_SPECIAL_DSRL32;
|
||||
R4300i_Special[63] = r4300i_SPECIAL_DSRA32;
|
||||
|
||||
R4300i_Regimm[ 0] = r4300i_REGIMM_BLTZ;
|
||||
R4300i_Regimm[ 1] = r4300i_REGIMM_BGEZ;
|
||||
R4300i_Regimm[ 2] = r4300i_REGIMM_BLTZL;
|
||||
R4300i_Regimm[ 3] = r4300i_REGIMM_BGEZL;
|
||||
R4300i_Regimm[ 4] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[ 6] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[10] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[11] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[12] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[13] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[14] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[15] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[16] = r4300i_REGIMM_BLTZAL;
|
||||
R4300i_Regimm[17] = r4300i_REGIMM_BGEZAL;
|
||||
R4300i_Regimm[18] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[19] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[20] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[21] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[22] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[23] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[24] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[25] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[26] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[27] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[28] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[29] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[30] = R4300i_UnknownOpcode;
|
||||
R4300i_Regimm[31] = R4300i_UnknownOpcode;
|
||||
|
||||
R4300i_CoP0[ 0] = r4300i_COP0_MF;
|
||||
R4300i_CoP0[ 1] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 2] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 3] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 4] = r4300i_COP0_MT;
|
||||
R4300i_CoP0[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 6] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0[16] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[17] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[18] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[19] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[20] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[21] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[22] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[23] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[24] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[25] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[26] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[27] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[28] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[29] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[30] = R4300i_opcode_COP0_CO;
|
||||
R4300i_CoP0[31] = R4300i_opcode_COP0_CO;
|
||||
|
||||
R4300i_CoP0_Function[ 0] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[ 1] = r4300i_COP0_CO_TLBR;
|
||||
R4300i_CoP0_Function[ 2] = r4300i_COP0_CO_TLBWI;
|
||||
R4300i_CoP0_Function[ 3] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[ 4] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[ 6] = r4300i_COP0_CO_TLBWR;
|
||||
R4300i_CoP0_Function[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[ 8] = r4300i_COP0_CO_TLBP;
|
||||
R4300i_CoP0_Function[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[24] = r4300i_COP0_CO_ERET;
|
||||
R4300i_CoP0_Function[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[31] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[32] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[33] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[34] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[35] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[36] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[37] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[38] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[39] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[40] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[41] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[42] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[43] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[44] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[45] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[46] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[47] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[48] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[49] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[50] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[51] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[52] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[53] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[54] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[55] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[56] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[57] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[58] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[59] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[60] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[61] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[62] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP0_Function[63] = R4300i_UnknownOpcode;
|
||||
|
||||
R4300i_CoP1[ 0] = r4300i_COP1_MF;
|
||||
R4300i_CoP1[ 1] = r4300i_COP1_DMF;
|
||||
R4300i_CoP1[ 2] = r4300i_COP1_CF;
|
||||
R4300i_CoP1[ 3] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[ 4] = r4300i_COP1_MT;
|
||||
R4300i_CoP1[ 5] = r4300i_COP1_DMT;
|
||||
R4300i_CoP1[ 6] = r4300i_COP1_CT;
|
||||
R4300i_CoP1[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[ 8] = R4300i_opcode_COP1_BC;
|
||||
R4300i_CoP1[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[16] = R4300i_opcode_COP1_S;
|
||||
R4300i_CoP1[17] = R4300i_opcode_COP1_D;
|
||||
R4300i_CoP1[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[20] = R4300i_opcode_COP1_W;
|
||||
R4300i_CoP1[21] = R4300i_opcode_COP1_L;
|
||||
R4300i_CoP1[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1[31] = R4300i_UnknownOpcode;
|
||||
|
||||
R4300i_CoP1_BC[ 0] = r4300i_COP1_BCF;
|
||||
R4300i_CoP1_BC[ 1] = r4300i_COP1_BCT;
|
||||
R4300i_CoP1_BC[ 2] = r4300i_COP1_BCFL;
|
||||
R4300i_CoP1_BC[ 3] = r4300i_COP1_BCTL;
|
||||
R4300i_CoP1_BC[ 4] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[ 6] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_BC[31] = R4300i_UnknownOpcode;
|
||||
|
||||
R4300i_CoP1_S[ 0] = r4300i_COP1_S_ADD;
|
||||
R4300i_CoP1_S[ 1] = r4300i_COP1_S_SUB;
|
||||
R4300i_CoP1_S[ 2] = r4300i_COP1_S_MUL;
|
||||
R4300i_CoP1_S[ 3] = r4300i_COP1_S_DIV;
|
||||
R4300i_CoP1_S[ 4] = r4300i_COP1_S_SQRT;
|
||||
R4300i_CoP1_S[ 5] = r4300i_COP1_S_ABS;
|
||||
R4300i_CoP1_S[ 6] = r4300i_COP1_S_MOV;
|
||||
R4300i_CoP1_S[ 7] = r4300i_COP1_S_NEG;
|
||||
R4300i_CoP1_S[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[ 9] = r4300i_COP1_S_TRUNC_L;
|
||||
R4300i_CoP1_S[10] = r4300i_COP1_S_CEIL_L; //added by Witten
|
||||
R4300i_CoP1_S[11] = r4300i_COP1_S_FLOOR_L; //added by Witten
|
||||
R4300i_CoP1_S[12] = r4300i_COP1_S_ROUND_W;
|
||||
R4300i_CoP1_S[13] = r4300i_COP1_S_TRUNC_W;
|
||||
R4300i_CoP1_S[14] = r4300i_COP1_S_CEIL_W; //added by Witten
|
||||
R4300i_CoP1_S[15] = r4300i_COP1_S_FLOOR_W;
|
||||
R4300i_CoP1_S[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[31] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[32] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[33] = r4300i_COP1_S_CVT_D;
|
||||
R4300i_CoP1_S[34] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[35] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[36] = r4300i_COP1_S_CVT_W;
|
||||
R4300i_CoP1_S[37] = r4300i_COP1_S_CVT_L;
|
||||
R4300i_CoP1_S[38] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[39] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[40] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[41] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[42] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[43] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[44] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[45] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[46] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[47] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_S[48] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[49] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[50] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[51] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[52] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[53] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[54] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[55] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[56] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[57] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[58] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[59] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[60] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[61] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[62] = r4300i_COP1_S_CMP;
|
||||
R4300i_CoP1_S[63] = r4300i_COP1_S_CMP;
|
||||
|
||||
R4300i_CoP1_D[ 0] = r4300i_COP1_D_ADD;
|
||||
R4300i_CoP1_D[ 1] = r4300i_COP1_D_SUB;
|
||||
R4300i_CoP1_D[ 2] = r4300i_COP1_D_MUL;
|
||||
R4300i_CoP1_D[ 3] = r4300i_COP1_D_DIV;
|
||||
R4300i_CoP1_D[ 4] = r4300i_COP1_D_SQRT;
|
||||
R4300i_CoP1_D[ 5] = r4300i_COP1_D_ABS;
|
||||
R4300i_CoP1_D[ 6] = r4300i_COP1_D_MOV;
|
||||
R4300i_CoP1_D[ 7] = r4300i_COP1_D_NEG;
|
||||
R4300i_CoP1_D[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[ 9] = r4300i_COP1_D_TRUNC_L; //added by Witten
|
||||
R4300i_CoP1_D[10] = r4300i_COP1_D_CEIL_L; //added by Witten
|
||||
R4300i_CoP1_D[11] = r4300i_COP1_D_FLOOR_L; //added by Witten
|
||||
R4300i_CoP1_D[12] = r4300i_COP1_D_ROUND_W;
|
||||
R4300i_CoP1_D[13] = r4300i_COP1_D_TRUNC_W;
|
||||
R4300i_CoP1_D[14] = r4300i_COP1_D_CEIL_W; //added by Witten
|
||||
R4300i_CoP1_D[15] = r4300i_COP1_D_FLOOR_W; //added by Witten
|
||||
R4300i_CoP1_D[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[31] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[32] = r4300i_COP1_D_CVT_S;
|
||||
R4300i_CoP1_D[33] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[34] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[35] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[36] = r4300i_COP1_D_CVT_W;
|
||||
R4300i_CoP1_D[37] = r4300i_COP1_D_CVT_L;
|
||||
R4300i_CoP1_D[38] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[39] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[40] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[41] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[42] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[43] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[44] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[45] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[46] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[47] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_D[48] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[49] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[50] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[51] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[52] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[53] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[54] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[55] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[56] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[57] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[58] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[59] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[60] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[61] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[62] = r4300i_COP1_D_CMP;
|
||||
R4300i_CoP1_D[63] = r4300i_COP1_D_CMP;
|
||||
|
||||
R4300i_CoP1_W[ 0] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 1] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 2] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 3] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 4] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 6] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[31] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[32] = r4300i_COP1_W_CVT_S;
|
||||
R4300i_CoP1_W[33] = r4300i_COP1_W_CVT_D;
|
||||
R4300i_CoP1_W[34] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[35] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[36] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[37] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[38] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[39] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[40] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[41] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[42] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[43] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[44] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[45] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[46] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[47] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[48] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[49] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[50] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[51] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[52] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[53] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[54] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[55] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[56] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[57] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[58] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[59] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[60] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[61] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[62] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_W[63] = R4300i_UnknownOpcode;
|
||||
|
||||
R4300i_CoP1_L[ 0] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 1] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 2] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 3] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 4] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 5] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 6] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 7] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 8] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[ 9] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[10] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[11] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[12] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[13] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[14] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[15] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[16] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[17] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[18] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[19] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[20] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[21] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[22] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[23] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[24] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[25] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[26] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[27] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[28] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[29] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[30] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[31] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[32] = r4300i_COP1_L_CVT_S;
|
||||
R4300i_CoP1_L[33] = r4300i_COP1_L_CVT_D;
|
||||
R4300i_CoP1_L[34] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[35] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[36] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[37] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[38] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[39] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[40] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[41] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[42] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[43] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[44] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[45] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[46] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[47] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[48] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[49] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[50] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[51] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[52] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[53] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[54] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[55] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[56] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[57] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[58] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[59] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[60] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[61] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[62] = R4300i_UnknownOpcode;
|
||||
R4300i_CoP1_L[63] = R4300i_UnknownOpcode;
|
||||
}
|
||||
|
||||
BOOL ExecuteInterpreterOpCode (void) {
|
||||
if (!r4300i_LW_VAddr(PROGRAM_COUNTER, &Opcode.Hex)) {
|
||||
DoTLBMiss(NextInstruction == JUMP,PROGRAM_COUNTER);
|
||||
BOOL ExecuteInterpreterOpCode (void)
|
||||
{
|
||||
if (!_MMU->LW_VAddr((*_PROGRAM_COUNTER), Opcode.Hex)) {
|
||||
DoTLBMiss(NextInstruction == JUMP,(*_PROGRAM_COUNTER));
|
||||
NextInstruction = NORMAL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
COUNT_REGISTER += CountPerOp;
|
||||
*g_Timer -= CountPerOp;
|
||||
*_Timer -= CountPerOp;
|
||||
|
||||
RANDOM_REGISTER -= 1;
|
||||
if ((int)RANDOM_REGISTER < (int)WIRED_REGISTER) {
|
||||
|
@ -694,35 +54,35 @@ BOOL ExecuteInterpreterOpCode (void) {
|
|||
|
||||
((void (_fastcall *)()) R4300i_Opcode[ Opcode.op ])();
|
||||
|
||||
if (GPR[0].DW != 0) {
|
||||
if (_GPR[0].DW != 0) {
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
DisplayError("GPR[0].DW has been written to");
|
||||
DisplayError("_GPR[0].DW has been written to");
|
||||
#endif
|
||||
GPR[0].DW = 0;
|
||||
_GPR[0].DW = 0;
|
||||
}
|
||||
#ifdef Interpreter_StackTest
|
||||
if (StackValue != GPR[29].UW[0]) {
|
||||
if (StackValue != _GPR[29].UW[0]) {
|
||||
DisplayError("Stack has Been changed");
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (NextInstruction) {
|
||||
case NORMAL:
|
||||
PROGRAM_COUNTER += 4;
|
||||
(*_PROGRAM_COUNTER) += 4;
|
||||
break;
|
||||
case DELAY_SLOT:
|
||||
NextInstruction = JUMP;
|
||||
PROGRAM_COUNTER += 4;
|
||||
(*_PROGRAM_COUNTER) += 4;
|
||||
break;
|
||||
case JUMP:
|
||||
{
|
||||
BOOL CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
|
||||
PROGRAM_COUNTER = JumpToLocation;
|
||||
BOOL CheckTimer = (JumpToLocation < (*_PROGRAM_COUNTER) || TestTimer);
|
||||
(*_PROGRAM_COUNTER) = JumpToLocation;
|
||||
NextInstruction = NORMAL;
|
||||
if (CheckTimer)
|
||||
{
|
||||
TestTimer = FALSE;
|
||||
if (*g_Timer < 0)
|
||||
if (*_Timer < 0)
|
||||
{
|
||||
TimerDone();
|
||||
}
|
||||
|
@ -732,7 +92,7 @@ BOOL ExecuteInterpreterOpCode (void) {
|
|||
if (CPU_Type != CPU_SyncCores) {
|
||||
if (Profiling) {
|
||||
if (IndvidualBlock) {
|
||||
StartTimer(PROGRAM_COUNTER);
|
||||
StartTimer((*_PROGRAM_COUNTER));
|
||||
} else {
|
||||
StartTimer(Timer_R4300);
|
||||
}
|
||||
|
@ -759,12 +119,12 @@ void ExecuteInterpreterOps (DWORD Cycles)
|
|||
while(!EndEmulation()) {
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
if (NoOfBpoints != 0) {
|
||||
if (CheckForR4300iBPoint(PROGRAM_COUNTER)) {
|
||||
if (CheckForR4300iBPoint((*_PROGRAM_COUNTER))) {
|
||||
UpdateCurrentR4300iRegisterPanel();
|
||||
Refresh_Memory();
|
||||
if (InR4300iCommandsWindow) {
|
||||
Enter_R4300i_Commands_Window();
|
||||
SetR4300iCommandViewto( PROGRAM_COUNTER );
|
||||
SetR4300iCommandViewto( (*_PROGRAM_COUNTER) );
|
||||
if (CPU_Action.Stepping) {
|
||||
DisplayError ( "Encounted a R4300i Breakpoint" );
|
||||
} else {
|
||||
|
@ -785,7 +145,7 @@ void ExecuteInterpreterOps (DWORD Cycles)
|
|||
//Value2 = Value;
|
||||
if (CPU_Action.Stepping) {
|
||||
do {
|
||||
SetR4300iCommandViewto (PROGRAM_COUNTER);
|
||||
SetR4300iCommandViewto ((*_PROGRAM_COUNTER));
|
||||
UpdateCurrentR4300iRegisterPanel();
|
||||
Refresh_Memory();
|
||||
WaitForSingleObject( CPU_Action.hStepping, INFINITE );
|
||||
|
@ -806,7 +166,7 @@ void ExecuteInterpreterOps (DWORD Cycles)
|
|||
ExecuteInterpreterOpCode();
|
||||
}
|
||||
}
|
||||
} __except( r4300i_CPU_MemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) {
|
||||
} __except( _MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) {
|
||||
DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||
ExitThread(0);
|
||||
}
|
||||
|
|
|
@ -27,14 +27,11 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
void BuildInterpreter ( void );
|
||||
BOOL ExecuteInterpreterOpCode ( void );
|
||||
void StartInterpreterCPU ( void );
|
||||
void TestInterpreterJump ( DWORD PC, DWORD TargetPC, int Reg1, int Reg2 );
|
||||
void ExecuteInterpreterOps ( DWORD Cycles );
|
||||
|
||||
extern void * R4300i_Opcode[64];
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,184 @@
|
|||
typedef void (_fastcall * R4300iOp_FUNC )();
|
||||
|
||||
class R4300iOp32
|
||||
{
|
||||
public:
|
||||
/************************* OpCode functions *************************/
|
||||
static void _fastcall J ( void );
|
||||
static void _fastcall JAL ( void );
|
||||
static void _fastcall BNE ( void );
|
||||
static void _fastcall BEQ ( void );
|
||||
static void _fastcall BLEZ ( void );
|
||||
static void _fastcall BGTZ ( void );
|
||||
static void _fastcall ADDI ( void );
|
||||
static void _fastcall ADDIU ( void );
|
||||
static void _fastcall SLTI ( void );
|
||||
static void _fastcall SLTIU ( void );
|
||||
static void _fastcall ANDI ( void );
|
||||
static void _fastcall ORI ( void );
|
||||
static void _fastcall XORI ( void );
|
||||
static void _fastcall LUI ( void );
|
||||
static void _fastcall BEQL ( void );
|
||||
static void _fastcall BNEL ( void );
|
||||
static void _fastcall BLEZL ( void );
|
||||
static void _fastcall BGTZL ( void );
|
||||
static void _fastcall LB ( void );
|
||||
static void _fastcall LH ( void );
|
||||
static void _fastcall LWL ( void );
|
||||
static void _fastcall LW ( void );
|
||||
static void _fastcall LBU ( void );
|
||||
static void _fastcall LHU ( void );
|
||||
static void _fastcall LWR ( void );
|
||||
static void _fastcall LWU ( void );
|
||||
static void _fastcall SB ( void );
|
||||
static void _fastcall SH ( void );
|
||||
static void _fastcall SWL ( void );
|
||||
static void _fastcall SW ( void );
|
||||
static void _fastcall SWR ( void );
|
||||
static void _fastcall CACHE ( void );
|
||||
static void _fastcall LL ( void );
|
||||
static void _fastcall LWC1 ( void );
|
||||
static void _fastcall SC ( void );
|
||||
static void _fastcall SWC1 ( void );
|
||||
|
||||
/********************** R4300i OpCodes: Special **********************/
|
||||
static void _fastcall SPECIAL_SLL ( void );
|
||||
static void _fastcall SPECIAL_SRL ( void );
|
||||
static void _fastcall SPECIAL_SRA ( void );
|
||||
static void _fastcall SPECIAL_SLLV ( void );
|
||||
static void _fastcall SPECIAL_SRLV ( void );
|
||||
static void _fastcall SPECIAL_SRAV ( void );
|
||||
static void _fastcall SPECIAL_JR ( void );
|
||||
static void _fastcall SPECIAL_JALR ( void );
|
||||
static void _fastcall SPECIAL_SYSCALL ( void );
|
||||
static void _fastcall SPECIAL_BREAK ( void );
|
||||
static void _fastcall SPECIAL_SYNC ( void );
|
||||
static void _fastcall SPECIAL_MFHI ( void );
|
||||
static void _fastcall SPECIAL_MTHI ( void );
|
||||
static void _fastcall SPECIAL_MFLO ( void );
|
||||
static void _fastcall SPECIAL_MTLO ( void );
|
||||
static void _fastcall SPECIAL_ADD ( void );
|
||||
static void _fastcall SPECIAL_ADDU ( void );
|
||||
static void _fastcall SPECIAL_SUB ( void );
|
||||
static void _fastcall SPECIAL_SUBU ( void );
|
||||
static void _fastcall SPECIAL_AND ( void );
|
||||
static void _fastcall SPECIAL_OR ( void );
|
||||
static void _fastcall SPECIAL_XOR ( void );
|
||||
static void _fastcall SPECIAL_NOR ( void );
|
||||
static void _fastcall SPECIAL_SLT ( void );
|
||||
static void _fastcall SPECIAL_SLTU ( void );
|
||||
static void _fastcall SPECIAL_TEQ ( void );
|
||||
|
||||
/********************** R4300i OpCodes: RegImm **********************/
|
||||
static void _fastcall REGIMM_BLTZ ( void );
|
||||
static void _fastcall REGIMM_BGEZ ( void );
|
||||
static void _fastcall REGIMM_BLTZL ( void );
|
||||
static void _fastcall REGIMM_BGEZL ( void );
|
||||
static void _fastcall REGIMM_BLTZAL ( void );
|
||||
static void _fastcall REGIMM_BGEZAL ( void );
|
||||
|
||||
/************************** COP0 functions **************************/
|
||||
static void _fastcall COP0_MF ( void );
|
||||
static void _fastcall COP0_MT ( void );
|
||||
|
||||
/************************** COP0 CO functions ***********************/
|
||||
static void _fastcall COP0_CO_TLBR ( void );
|
||||
static void _fastcall COP0_CO_TLBWI ( void );
|
||||
static void _fastcall COP0_CO_TLBWR ( void );
|
||||
static void _fastcall COP0_CO_TLBP ( void );
|
||||
static void _fastcall COP0_CO_ERET ( void );
|
||||
|
||||
/************************** COP1 functions **************************/
|
||||
static void _fastcall COP1_MF ( void );
|
||||
static void _fastcall COP1_DMF ( void );
|
||||
static void _fastcall COP1_CF ( void );
|
||||
static void _fastcall COP1_MT ( void );
|
||||
static void _fastcall COP1_DMT ( void );
|
||||
static void _fastcall COP1_CT ( void );
|
||||
|
||||
/************************* COP1: BC1 functions ***********************/
|
||||
static void _fastcall COP1_BCF ( void );
|
||||
static void _fastcall COP1_BCT ( void );
|
||||
static void _fastcall COP1_BCFL ( void );
|
||||
static void _fastcall COP1_BCTL ( void );
|
||||
|
||||
/************************** COP1: S functions ************************/
|
||||
static void _fastcall COP1_S_ADD ( void );
|
||||
static void _fastcall COP1_S_SUB ( void );
|
||||
static void _fastcall COP1_S_MUL ( void );
|
||||
static void _fastcall COP1_S_DIV ( void );
|
||||
static void _fastcall COP1_S_SQRT ( void );
|
||||
static void _fastcall COP1_S_ABS ( void );
|
||||
static void _fastcall COP1_S_MOV ( void );
|
||||
static void _fastcall COP1_S_NEG ( void );
|
||||
static void _fastcall COP1_S_TRUNC_L ( void );
|
||||
static void _fastcall COP1_S_CEIL_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_FLOOR_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_ROUND_W ( void );
|
||||
static void _fastcall COP1_S_TRUNC_W ( void );
|
||||
static void _fastcall COP1_S_CEIL_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_FLOOR_W ( void );
|
||||
static void _fastcall COP1_S_CVT_D ( void );
|
||||
static void _fastcall COP1_S_CVT_W ( void );
|
||||
static void _fastcall COP1_S_CVT_L ( void );
|
||||
static void _fastcall COP1_S_CMP ( void );
|
||||
|
||||
/************************** COP1: D functions ************************/
|
||||
static void _fastcall COP1_D_ADD ( void );
|
||||
static void _fastcall COP1_D_SUB ( void );
|
||||
static void _fastcall COP1_D_MUL ( void );
|
||||
static void _fastcall COP1_D_DIV ( void );
|
||||
static void _fastcall COP1_D_SQRT ( void );
|
||||
static void _fastcall COP1_D_ABS ( void );
|
||||
static void _fastcall COP1_D_MOV ( void );
|
||||
static void _fastcall COP1_D_NEG ( void );
|
||||
static void _fastcall COP1_D_TRUNC_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_CEIL_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_FLOOR_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_ROUND_W ( void );
|
||||
static void _fastcall COP1_D_TRUNC_W ( void );
|
||||
static void _fastcall COP1_D_CEIL_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_FLOOR_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_CVT_S ( void );
|
||||
static void _fastcall COP1_D_CVT_W ( void );
|
||||
static void _fastcall COP1_D_CVT_L ( void );
|
||||
static void _fastcall COP1_D_CMP ( void );
|
||||
|
||||
/************************** COP1: W functions ************************/
|
||||
static void _fastcall COP1_W_CVT_S ( void );
|
||||
static void _fastcall COP1_W_CVT_D ( void );
|
||||
|
||||
/************************** COP1: L functions ************************/
|
||||
static void _fastcall COP1_L_CVT_S ( void );
|
||||
static void _fastcall COP1_L_CVT_D ( void );
|
||||
|
||||
/************************** Other functions **************************/
|
||||
static void _fastcall UnknownOpcode ( void );
|
||||
|
||||
|
||||
static R4300iOp_FUNC * BuildInterpreter (void );
|
||||
|
||||
private:
|
||||
static void _fastcall SPECIAL (void);
|
||||
static void _fastcall REGIMM (void);
|
||||
static void _fastcall COP0 (void);
|
||||
static void _fastcall COP0_CO (void);
|
||||
static void _fastcall COP1 (void);
|
||||
static void _fastcall COP1_BC (void);
|
||||
static void _fastcall COP1_S (void);
|
||||
static void _fastcall COP1_D (void);
|
||||
static void _fastcall COP1_W (void);
|
||||
static void _fastcall COP1_L (void);
|
||||
|
||||
static R4300iOp_FUNC Jump_Opcode[64];
|
||||
static R4300iOp_FUNC Jump_Special[64];
|
||||
static R4300iOp_FUNC Jump_Regimm[32];
|
||||
static R4300iOp_FUNC Jump_CoP0[32];
|
||||
static R4300iOp_FUNC Jump_CoP0_Function[64];
|
||||
static R4300iOp_FUNC Jump_CoP1[32];
|
||||
static R4300iOp_FUNC Jump_CoP1_BC[32];
|
||||
static R4300iOp_FUNC Jump_CoP1_S[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_D[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_W[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_L[64];
|
||||
};
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -24,192 +24,225 @@
|
|||
*
|
||||
*/
|
||||
|
||||
typedef void (_fastcall * R4300iOp_FUNC )();
|
||||
|
||||
class R4300iOp
|
||||
{
|
||||
public:
|
||||
/************************* OpCode functions *************************/
|
||||
static void _fastcall J ( void );
|
||||
static void _fastcall JAL ( void );
|
||||
static void _fastcall BNE ( void );
|
||||
static void _fastcall BEQ ( void );
|
||||
static void _fastcall BLEZ ( void );
|
||||
static void _fastcall BGTZ ( void );
|
||||
static void _fastcall ADDI ( void );
|
||||
static void _fastcall ADDIU ( void );
|
||||
static void _fastcall SLTI ( void );
|
||||
static void _fastcall SLTIU ( void );
|
||||
static void _fastcall ANDI ( void );
|
||||
static void _fastcall ORI ( void );
|
||||
static void _fastcall XORI ( void );
|
||||
static void _fastcall LUI ( void );
|
||||
static void _fastcall BEQL ( void );
|
||||
static void _fastcall BNEL ( void );
|
||||
static void _fastcall BLEZL ( void );
|
||||
static void _fastcall BGTZL ( void );
|
||||
static void _fastcall DADDIU ( void );
|
||||
static void _fastcall LDL ( void );
|
||||
static void _fastcall LDR ( void );
|
||||
static void _fastcall LB ( void );
|
||||
static void _fastcall LH ( void );
|
||||
static void _fastcall LWL ( void );
|
||||
static void _fastcall LW ( void );
|
||||
static void _fastcall LBU ( void );
|
||||
static void _fastcall LHU ( void );
|
||||
static void _fastcall LWR ( void );
|
||||
static void _fastcall LWU ( void );
|
||||
static void _fastcall SB ( void );
|
||||
static void _fastcall SH ( void );
|
||||
static void _fastcall SWL ( void );
|
||||
static void _fastcall SW ( void );
|
||||
static void _fastcall SDL ( void );
|
||||
static void _fastcall SDR ( void );
|
||||
static void _fastcall SWR ( void );
|
||||
static void _fastcall CACHE ( void );
|
||||
static void _fastcall LL ( void );
|
||||
static void _fastcall LWC1 ( void );
|
||||
static void _fastcall LDC1 ( void );
|
||||
static void _fastcall LD ( void );
|
||||
static void _fastcall SC ( void );
|
||||
static void _fastcall SWC1 ( void );
|
||||
static void _fastcall SDC1 ( void );
|
||||
static void _fastcall SD ( void );
|
||||
|
||||
/********************** R4300i OpCodes: Special **********************/
|
||||
static void _fastcall SPECIAL_SLL ( void );
|
||||
static void _fastcall SPECIAL_SRL ( void );
|
||||
static void _fastcall SPECIAL_SRA ( void );
|
||||
static void _fastcall SPECIAL_SLLV ( void );
|
||||
static void _fastcall SPECIAL_SRLV ( void );
|
||||
static void _fastcall SPECIAL_SRAV ( void );
|
||||
static void _fastcall SPECIAL_JR ( void );
|
||||
static void _fastcall SPECIAL_JALR ( void );
|
||||
static void _fastcall SPECIAL_SYSCALL ( void );
|
||||
static void _fastcall SPECIAL_BREAK ( void );
|
||||
static void _fastcall SPECIAL_SYNC ( void );
|
||||
static void _fastcall SPECIAL_MFHI ( void );
|
||||
static void _fastcall SPECIAL_MTHI ( void );
|
||||
static void _fastcall SPECIAL_MFLO ( void );
|
||||
static void _fastcall SPECIAL_MTLO ( void );
|
||||
static void _fastcall SPECIAL_DSLLV ( void );
|
||||
static void _fastcall SPECIAL_DSRLV ( void );
|
||||
static void _fastcall SPECIAL_DSRAV ( void );
|
||||
static void _fastcall SPECIAL_MULT ( void );
|
||||
static void _fastcall SPECIAL_MULTU ( void );
|
||||
static void _fastcall SPECIAL_DIV ( void );
|
||||
static void _fastcall SPECIAL_DIVU ( void );
|
||||
static void _fastcall SPECIAL_DMULT ( void );
|
||||
static void _fastcall SPECIAL_DMULTU ( void );
|
||||
static void _fastcall SPECIAL_DDIV ( void );
|
||||
static void _fastcall SPECIAL_DDIVU ( void );
|
||||
static void _fastcall SPECIAL_ADD ( void );
|
||||
static void _fastcall SPECIAL_ADDU ( void );
|
||||
static void _fastcall SPECIAL_SUB ( void );
|
||||
static void _fastcall SPECIAL_SUBU ( void );
|
||||
static void _fastcall SPECIAL_AND ( void );
|
||||
static void _fastcall SPECIAL_OR ( void );
|
||||
static void _fastcall SPECIAL_XOR ( void );
|
||||
static void _fastcall SPECIAL_NOR ( void );
|
||||
static void _fastcall SPECIAL_SLT ( void );
|
||||
static void _fastcall SPECIAL_SLTU ( void );
|
||||
static void _fastcall SPECIAL_DADD ( void );
|
||||
static void _fastcall SPECIAL_DADDU ( void );
|
||||
static void _fastcall SPECIAL_DSUB ( void );
|
||||
static void _fastcall SPECIAL_DSUBU ( void );
|
||||
static void _fastcall SPECIAL_TEQ ( void );
|
||||
static void _fastcall SPECIAL_DSLL ( void );
|
||||
static void _fastcall SPECIAL_DSRL ( void );
|
||||
static void _fastcall SPECIAL_DSRA ( void );
|
||||
static void _fastcall SPECIAL_DSLL32 ( void );
|
||||
static void _fastcall SPECIAL_DSRL32 ( void );
|
||||
static void _fastcall SPECIAL_DSRA32 ( void );
|
||||
|
||||
/********************** R4300i OpCodes: RegImm **********************/
|
||||
static void _fastcall REGIMM_BLTZ ( void );
|
||||
static void _fastcall REGIMM_BGEZ ( void );
|
||||
static void _fastcall REGIMM_BLTZL ( void );
|
||||
static void _fastcall REGIMM_BGEZL ( void );
|
||||
static void _fastcall REGIMM_BLTZAL ( void );
|
||||
static void _fastcall REGIMM_BGEZAL ( void );
|
||||
|
||||
/************************** COP0 functions **************************/
|
||||
static void _fastcall COP0_MF ( void );
|
||||
static void _fastcall COP0_MT ( void );
|
||||
|
||||
/************************** COP0 CO functions ***********************/
|
||||
static void _fastcall COP0_CO_TLBR ( void );
|
||||
static void _fastcall COP0_CO_TLBWI ( void );
|
||||
static void _fastcall COP0_CO_TLBWR ( void );
|
||||
static void _fastcall COP0_CO_TLBP ( void );
|
||||
static void _fastcall COP0_CO_ERET ( void );
|
||||
|
||||
/************************** COP1 functions **************************/
|
||||
static void _fastcall COP1_MF ( void );
|
||||
static void _fastcall COP1_DMF ( void );
|
||||
static void _fastcall COP1_CF ( void );
|
||||
static void _fastcall COP1_MT ( void );
|
||||
static void _fastcall COP1_DMT ( void );
|
||||
static void _fastcall COP1_CT ( void );
|
||||
|
||||
/************************* COP1: BC1 functions ***********************/
|
||||
static void _fastcall COP1_BCF ( void );
|
||||
static void _fastcall COP1_BCT ( void );
|
||||
static void _fastcall COP1_BCFL ( void );
|
||||
static void _fastcall COP1_BCTL ( void );
|
||||
|
||||
/************************** COP1: S functions ************************/
|
||||
static void _fastcall COP1_S_ADD ( void );
|
||||
static void _fastcall COP1_S_SUB ( void );
|
||||
static void _fastcall COP1_S_MUL ( void );
|
||||
static void _fastcall COP1_S_DIV ( void );
|
||||
static void _fastcall COP1_S_SQRT ( void );
|
||||
static void _fastcall COP1_S_ABS ( void );
|
||||
static void _fastcall COP1_S_MOV ( void );
|
||||
static void _fastcall COP1_S_NEG ( void );
|
||||
static void _fastcall COP1_S_TRUNC_L ( void );
|
||||
static void _fastcall COP1_S_CEIL_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_FLOOR_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_ROUND_W ( void );
|
||||
static void _fastcall COP1_S_TRUNC_W ( void );
|
||||
static void _fastcall COP1_S_CEIL_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_S_FLOOR_W ( void );
|
||||
static void _fastcall COP1_S_CVT_D ( void );
|
||||
static void _fastcall COP1_S_CVT_W ( void );
|
||||
static void _fastcall COP1_S_CVT_L ( void );
|
||||
static void _fastcall COP1_S_CMP ( void );
|
||||
|
||||
/************************** COP1: D functions ************************/
|
||||
static void _fastcall COP1_D_ADD ( void );
|
||||
static void _fastcall COP1_D_SUB ( void );
|
||||
static void _fastcall COP1_D_MUL ( void );
|
||||
static void _fastcall COP1_D_DIV ( void );
|
||||
static void _fastcall COP1_D_SQRT ( void );
|
||||
static void _fastcall COP1_D_ABS ( void );
|
||||
static void _fastcall COP1_D_MOV ( void );
|
||||
static void _fastcall COP1_D_NEG ( void );
|
||||
static void _fastcall COP1_D_TRUNC_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_CEIL_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_FLOOR_L ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_ROUND_W ( void );
|
||||
static void _fastcall COP1_D_TRUNC_W ( void );
|
||||
static void _fastcall COP1_D_CEIL_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_FLOOR_W ( void ); //added by Witten
|
||||
static void _fastcall COP1_D_CVT_S ( void );
|
||||
static void _fastcall COP1_D_CVT_W ( void );
|
||||
static void _fastcall COP1_D_CVT_L ( void );
|
||||
static void _fastcall COP1_D_CMP ( void );
|
||||
|
||||
/************************** COP1: W functions ************************/
|
||||
static void _fastcall COP1_W_CVT_S ( void );
|
||||
static void _fastcall COP1_W_CVT_D ( void );
|
||||
|
||||
/************************** COP1: L functions ************************/
|
||||
static void _fastcall COP1_L_CVT_S ( void );
|
||||
static void _fastcall COP1_L_CVT_D ( void );
|
||||
|
||||
/************************** Other functions **************************/
|
||||
static void _fastcall UnknownOpcode ( void );
|
||||
|
||||
|
||||
static R4300iOp_FUNC * BuildInterpreter (void );
|
||||
|
||||
private:
|
||||
static void _fastcall SPECIAL (void);
|
||||
static void _fastcall REGIMM (void);
|
||||
static void _fastcall COP0 (void);
|
||||
static void _fastcall COP0_CO (void);
|
||||
static void _fastcall COP1 (void);
|
||||
static void _fastcall COP1_BC (void);
|
||||
static void _fastcall COP1_S (void);
|
||||
static void _fastcall COP1_D (void);
|
||||
static void _fastcall COP1_W (void);
|
||||
static void _fastcall COP1_L (void);
|
||||
|
||||
static R4300iOp_FUNC Jump_Opcode[64];
|
||||
static R4300iOp_FUNC Jump_Special[64];
|
||||
static R4300iOp_FUNC Jump_Regimm[32];
|
||||
static R4300iOp_FUNC Jump_CoP0[32];
|
||||
static R4300iOp_FUNC Jump_CoP0_Function[64];
|
||||
static R4300iOp_FUNC Jump_CoP1[32];
|
||||
static R4300iOp_FUNC Jump_CoP1_BC[32];
|
||||
static R4300iOp_FUNC Jump_CoP1_S[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_D[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_W[64];
|
||||
static R4300iOp_FUNC Jump_CoP1_L[64];
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/************************* OpCode functions *************************/
|
||||
void _fastcall r4300i_J ( void );
|
||||
void _fastcall r4300i_JAL ( void );
|
||||
void _fastcall r4300i_BNE ( void );
|
||||
void _fastcall r4300i_BEQ ( void );
|
||||
void _fastcall r4300i_BLEZ ( void );
|
||||
void _fastcall r4300i_BGTZ ( void );
|
||||
void _fastcall r4300i_ADDI ( void );
|
||||
void _fastcall r4300i_ADDIU ( void );
|
||||
void _fastcall r4300i_SLTI ( void );
|
||||
void _fastcall r4300i_SLTIU ( void );
|
||||
void _fastcall r4300i_ANDI ( void );
|
||||
void _fastcall r4300i_ORI ( void );
|
||||
void _fastcall r4300i_XORI ( void );
|
||||
void _fastcall r4300i_LUI ( void );
|
||||
void _fastcall r4300i_BEQL ( void );
|
||||
void _fastcall r4300i_BNEL ( void );
|
||||
void _fastcall r4300i_BLEZL ( void );
|
||||
void _fastcall r4300i_BGTZL ( void );
|
||||
void _fastcall r4300i_DADDIU ( void );
|
||||
void _fastcall r4300i_LDL ( void );
|
||||
void _fastcall r4300i_LDR ( void );
|
||||
void _fastcall r4300i_LB ( void );
|
||||
void _fastcall r4300i_LH ( void );
|
||||
void _fastcall r4300i_LWL ( void );
|
||||
void _fastcall r4300i_LW ( void );
|
||||
void _fastcall r4300i_LBU ( void );
|
||||
void _fastcall r4300i_LHU ( void );
|
||||
void _fastcall r4300i_LWR ( void );
|
||||
void _fastcall r4300i_LWU ( void );
|
||||
void _fastcall r4300i_SB ( void );
|
||||
void _fastcall r4300i_SH ( void );
|
||||
void _fastcall r4300i_SWL ( void );
|
||||
void _fastcall r4300i_SW ( void );
|
||||
void _fastcall r4300i_SDL ( void );
|
||||
void _fastcall r4300i_SDR ( void );
|
||||
void _fastcall r4300i_SWR ( void );
|
||||
void _fastcall r4300i_CACHE ( void );
|
||||
void _fastcall r4300i_LL ( void );
|
||||
void _fastcall r4300i_LWC1 ( void );
|
||||
void _fastcall r4300i_LDC1 ( void );
|
||||
void _fastcall r4300i_LD ( void );
|
||||
void _fastcall r4300i_SC ( void );
|
||||
void _fastcall r4300i_SWC1 ( void );
|
||||
void _fastcall r4300i_SDC1 ( void );
|
||||
void _fastcall r4300i_SD ( void );
|
||||
|
||||
/********************** R4300i OpCodes: Special **********************/
|
||||
void _fastcall r4300i_SPECIAL_SLL ( void );
|
||||
void _fastcall r4300i_SPECIAL_SRL ( void );
|
||||
void _fastcall r4300i_SPECIAL_SRA ( void );
|
||||
void _fastcall r4300i_SPECIAL_SLLV ( void );
|
||||
void _fastcall r4300i_SPECIAL_SRLV ( void );
|
||||
void _fastcall r4300i_SPECIAL_SRAV ( void );
|
||||
void _fastcall r4300i_SPECIAL_JR ( void );
|
||||
void _fastcall r4300i_SPECIAL_JALR ( void );
|
||||
void _fastcall r4300i_SPECIAL_SYSCALL ( void );
|
||||
void _fastcall r4300i_SPECIAL_BREAK ( void );
|
||||
void _fastcall r4300i_SPECIAL_SYNC ( void );
|
||||
void _fastcall r4300i_SPECIAL_MFHI ( void );
|
||||
void _fastcall r4300i_SPECIAL_MTHI ( void );
|
||||
void _fastcall r4300i_SPECIAL_MFLO ( void );
|
||||
void _fastcall r4300i_SPECIAL_MTLO ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSLLV ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRLV ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRAV ( void );
|
||||
void _fastcall r4300i_SPECIAL_MULT ( void );
|
||||
void _fastcall r4300i_SPECIAL_MULTU ( void );
|
||||
void _fastcall r4300i_SPECIAL_DIV ( void );
|
||||
void _fastcall r4300i_SPECIAL_DIVU ( void );
|
||||
void _fastcall r4300i_SPECIAL_DMULT ( void );
|
||||
void _fastcall r4300i_SPECIAL_DMULTU ( void );
|
||||
void _fastcall r4300i_SPECIAL_DDIV ( void );
|
||||
void _fastcall r4300i_SPECIAL_DDIVU ( void );
|
||||
void _fastcall r4300i_SPECIAL_ADD ( void );
|
||||
void _fastcall r4300i_SPECIAL_ADDU ( void );
|
||||
void _fastcall r4300i_SPECIAL_SUB ( void );
|
||||
void _fastcall r4300i_SPECIAL_SUBU ( void );
|
||||
void _fastcall r4300i_SPECIAL_AND ( void );
|
||||
void _fastcall r4300i_SPECIAL_OR ( void );
|
||||
void _fastcall r4300i_SPECIAL_XOR ( void );
|
||||
void _fastcall r4300i_SPECIAL_NOR ( void );
|
||||
void _fastcall r4300i_SPECIAL_SLT ( void );
|
||||
void _fastcall r4300i_SPECIAL_SLTU ( void );
|
||||
void _fastcall r4300i_SPECIAL_DADD ( void );
|
||||
void _fastcall r4300i_SPECIAL_DADDU ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSUB ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSUBU ( void );
|
||||
void _fastcall r4300i_SPECIAL_TEQ ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSLL ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRL ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRA ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSLL32 ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRL32 ( void );
|
||||
void _fastcall r4300i_SPECIAL_DSRA32 ( void );
|
||||
|
||||
/********************** R4300i OpCodes: RegImm **********************/
|
||||
void _fastcall r4300i_REGIMM_BLTZ ( void );
|
||||
void _fastcall r4300i_REGIMM_BGEZ ( void );
|
||||
void _fastcall r4300i_REGIMM_BLTZL ( void );
|
||||
void _fastcall r4300i_REGIMM_BGEZL ( void );
|
||||
void _fastcall r4300i_REGIMM_BLTZAL ( void );
|
||||
void _fastcall r4300i_REGIMM_BGEZAL ( void );
|
||||
|
||||
/************************** COP0 functions **************************/
|
||||
void _fastcall r4300i_COP0_MF ( void );
|
||||
void _fastcall r4300i_COP0_MT ( void );
|
||||
|
||||
/************************** COP0 CO functions ***********************/
|
||||
void _fastcall r4300i_COP0_CO_TLBR ( void );
|
||||
void _fastcall r4300i_COP0_CO_TLBWI ( void );
|
||||
void _fastcall r4300i_COP0_CO_TLBWR ( void );
|
||||
void _fastcall r4300i_COP0_CO_TLBP ( void );
|
||||
void _fastcall r4300i_COP0_CO_ERET ( void );
|
||||
|
||||
/************************** COP1 functions **************************/
|
||||
void _fastcall r4300i_COP1_MF ( void );
|
||||
void _fastcall r4300i_COP1_DMF ( void );
|
||||
void _fastcall r4300i_COP1_CF ( void );
|
||||
void _fastcall r4300i_COP1_MT ( void );
|
||||
void _fastcall r4300i_COP1_DMT ( void );
|
||||
void _fastcall r4300i_COP1_CT ( void );
|
||||
|
||||
/************************* COP1: BC1 functions ***********************/
|
||||
void _fastcall r4300i_COP1_BCF ( void );
|
||||
void _fastcall r4300i_COP1_BCT ( void );
|
||||
void _fastcall r4300i_COP1_BCFL ( void );
|
||||
void _fastcall r4300i_COP1_BCTL ( void );
|
||||
|
||||
/************************** COP1: S functions ************************/
|
||||
void _fastcall r4300i_COP1_S_ADD ( void );
|
||||
void _fastcall r4300i_COP1_S_SUB ( void );
|
||||
void _fastcall r4300i_COP1_S_MUL ( void );
|
||||
void _fastcall r4300i_COP1_S_DIV ( void );
|
||||
void _fastcall r4300i_COP1_S_SQRT ( void );
|
||||
void _fastcall r4300i_COP1_S_ABS ( void );
|
||||
void _fastcall r4300i_COP1_S_MOV ( void );
|
||||
void _fastcall r4300i_COP1_S_NEG ( void );
|
||||
void _fastcall r4300i_COP1_S_TRUNC_L ( void );
|
||||
void _fastcall r4300i_COP1_S_CEIL_L ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_S_FLOOR_L ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_S_ROUND_W ( void );
|
||||
void _fastcall r4300i_COP1_S_TRUNC_W ( void );
|
||||
void _fastcall r4300i_COP1_S_CEIL_W ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_S_FLOOR_W ( void );
|
||||
void _fastcall r4300i_COP1_S_CVT_D ( void );
|
||||
void _fastcall r4300i_COP1_S_CVT_W ( void );
|
||||
void _fastcall r4300i_COP1_S_CVT_L ( void );
|
||||
void _fastcall r4300i_COP1_S_CMP ( void );
|
||||
|
||||
/************************** COP1: D functions ************************/
|
||||
void _fastcall r4300i_COP1_D_ADD ( void );
|
||||
void _fastcall r4300i_COP1_D_SUB ( void );
|
||||
void _fastcall r4300i_COP1_D_MUL ( void );
|
||||
void _fastcall r4300i_COP1_D_DIV ( void );
|
||||
void _fastcall r4300i_COP1_D_SQRT ( void );
|
||||
void _fastcall r4300i_COP1_D_ABS ( void );
|
||||
void _fastcall r4300i_COP1_D_MOV ( void );
|
||||
void _fastcall r4300i_COP1_D_NEG ( void );
|
||||
void _fastcall r4300i_COP1_D_TRUNC_L ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_D_CEIL_L ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_D_FLOOR_L ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_D_ROUND_W ( void );
|
||||
void _fastcall r4300i_COP1_D_TRUNC_W ( void );
|
||||
void _fastcall r4300i_COP1_D_CEIL_W ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_D_FLOOR_W ( void ); //added by Witten
|
||||
void _fastcall r4300i_COP1_D_CVT_S ( void );
|
||||
void _fastcall r4300i_COP1_D_CVT_W ( void );
|
||||
void _fastcall r4300i_COP1_D_CVT_L ( void );
|
||||
void _fastcall r4300i_COP1_D_CMP ( void );
|
||||
|
||||
/************************** COP1: W functions ************************/
|
||||
void _fastcall r4300i_COP1_W_CVT_S ( void );
|
||||
void _fastcall r4300i_COP1_W_CVT_D ( void );
|
||||
|
||||
/************************** COP1: L functions ************************/
|
||||
void _fastcall r4300i_COP1_L_CVT_S ( void );
|
||||
void _fastcall r4300i_COP1_L_CVT_D ( void );
|
||||
|
||||
/************************** Other functions **************************/
|
||||
void _fastcall R4300i_UnknownOpcode ( void );
|
||||
|
||||
extern DWORD SWL_MASK[4], SWR_MASK[4], LWL_MASK[4], LWR_MASK[4];
|
||||
extern int SWL_SHIFT[4], SWR_SHIFT[4], LWL_SHIFT[4], LWR_SHIFT[4];
|
||||
extern int RoundingModel;
|
||||
|
|
|
@ -219,7 +219,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
if ( VAddr >= 0xA0000000 && VAddr < (0xA0000000 + RdramSize)) { return; }
|
||||
if ( VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024) {
|
||||
if (!LogOptions.LogRDRamRegisters) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA3F00000: LogMessage("%08X: read from RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG (%08X)",PC, Value); return;
|
||||
|
@ -238,7 +238,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
if ( VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC ) { return; }
|
||||
if ( VAddr >= 0xA4040000 && VAddr <= 0xA404001C ) {
|
||||
if (!LogOptions.LogSPRegisters) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4040000: LogMessage("%08X: read from SP_MEM_ADDR_REG (%08X)",PC, Value); break;
|
||||
|
@ -254,13 +254,13 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if ( VAddr == 0xA4080000) {
|
||||
if (!LogOptions.LogSPRegisters) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
LogMessage("%08X: read from SP_PC (%08X)",PC, Value);
|
||||
return;
|
||||
}
|
||||
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C) {
|
||||
if (!LogOptions.LogDPCRegisters) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4100000: LogMessage("%08X: read from DPC_START_REG (%08X)",PC, Value); return;
|
||||
|
@ -275,7 +275,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C) {
|
||||
if (!LogOptions.LogMIPSInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4300000: LogMessage("%08X: read from MI_INIT_MODE_REG/MI_MODE_REG (%08X)",PC, Value); return;
|
||||
|
@ -286,7 +286,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034) {
|
||||
if (!LogOptions.LogVideoInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4400000: LogMessage("%08X: read from VI_STATUS_REG/VI_CONTROL_REG (%08X)",PC, Value); return;
|
||||
|
@ -307,7 +307,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014) {
|
||||
if (!LogOptions.LogAudioInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4500000: LogMessage("%08X: read from AI_DRAM_ADDR_REG (%08X)",PC, Value); return;
|
||||
|
@ -320,7 +320,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030) {
|
||||
if (!LogOptions.LogPerInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4600000: LogMessage("%08X: read from PI_DRAM_ADDR_REG (%08X)",PC, Value); return;
|
||||
|
@ -340,7 +340,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C) {
|
||||
if (!LogOptions.LogRDRAMInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
|
||||
switch (VAddr) {
|
||||
case 0xA4700000: LogMessage("%08X: read from RI_MODE_REG (%08X)",PC, Value); return;
|
||||
|
@ -355,32 +355,32 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
}
|
||||
if ( VAddr == 0xA4800000) {
|
||||
if (!LogOptions.LogSerialInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
LogMessage("%08X: read from SI_DRAM_ADDR_REG (%08X)",PC, Value);
|
||||
return;
|
||||
}
|
||||
if ( VAddr == 0xA4800004) {
|
||||
if (!LogOptions.LogSerialInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_RD64B_REG (%08X)",PC, Value);
|
||||
return;
|
||||
}
|
||||
if ( VAddr == 0xA4800010) {
|
||||
if (!LogOptions.LogSerialInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
LogMessage("%08X: read from SI_PIF_ADDR_WR64B_REG (%08X)",PC, Value);
|
||||
return;
|
||||
}
|
||||
if ( VAddr == 0xA4800018) {
|
||||
if (!LogOptions.LogSerialInterface) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_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 (!LogOptions.LogPRDirectMemLoads) { return; }
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_MMU->LW_VAddr(VAddr,Value);
|
||||
LogMessage("%08X: read word from Pif Ram at 0x%X (%08X)",PC,VAddr - 0xBFC007C0, Value);
|
||||
return;
|
||||
}
|
||||
|
@ -388,7 +388,7 @@ void Log_LW (DWORD PC, DWORD VAddr) {
|
|||
if ( VAddr >= 0xB0000000 && VAddr < 0xB0000040) {
|
||||
if (!LogOptions.LogRomHeader) { return; }
|
||||
|
||||
r4300i_LW_VAddr(VAddr,&Value);
|
||||
_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;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
void ProcessControllerCommand ( int Control, BYTE * Command);
|
||||
void ReadControllerCommand (int Control, BYTE * Command);
|
||||
|
||||
BYTE PifRom[0x7C0]/*, *PIF_Ram*/;
|
||||
BYTE PifRom[0x7C0];
|
||||
|
||||
int GetCicChipID (char * RomData) {
|
||||
_int64 CRC = 0;
|
||||
|
@ -56,6 +56,8 @@ int GetCicChipID (char * RomData) {
|
|||
}
|
||||
|
||||
void LogControllerPakData (char * Description) {
|
||||
BYTE * PIF_Ram = _MMU->PifRam();
|
||||
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
int count, count2;
|
||||
char HexData[100], AsciiData[100], Addon[20];
|
||||
|
@ -159,6 +161,7 @@ void LoadPIF2 () {
|
|||
}
|
||||
|
||||
void PifRamRead (void) {
|
||||
BYTE * PIF_Ram = _MMU->PifRam();
|
||||
int Channel, CurPos;
|
||||
|
||||
Channel = 0;
|
||||
|
@ -241,6 +244,7 @@ void PifRamRead (void) {
|
|||
}
|
||||
|
||||
void PifRamWrite (void) {
|
||||
BYTE * PIF_Ram = _MMU->PifRam();
|
||||
int Channel, CurPos;
|
||||
|
||||
Channel = 0;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern BYTE PifRom[0x7C0], *PIF_Ram;
|
||||
extern BYTE PifRom[0x7C0];
|
||||
|
||||
int GetCicChipID ( char * RomData );
|
||||
int LoadPifRom ( int country );
|
||||
|
|
|
@ -39,8 +39,8 @@ N64_BLOCKS N64_Blocks;
|
|||
DWORD TLBLoadAddress, TLBStoreAddress;
|
||||
|
||||
void FixRandomReg (void) {
|
||||
while ((int)CP0[1] < (int)CP0[6]) {
|
||||
CP0[1] += 32 - CP0[6];
|
||||
while ((int)_CP0[1] < (int)_CP0[6]) {
|
||||
_CP0[1] += 32 - _CP0[6];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,12 +30,13 @@
|
|||
#include "x86.h"
|
||||
#include "debugger.h"
|
||||
#include "Recompiler Ops.h"
|
||||
#include "../System Globals.h"
|
||||
|
||||
WORD FPU_RoundingMode = 0x0000;//_RC_NEAR
|
||||
char Name[50];
|
||||
|
||||
void ChangeDefaultRoundingModel (void) {
|
||||
switch((FPCR[31] & 3)) {
|
||||
switch((_FPCR[31] & 3)) {
|
||||
case 0: FPU_RoundingMode = 0x0000; break; //_RC_NEAR
|
||||
case 1: FPU_RoundingMode = 0x0C00; break; //_RC_CHOP
|
||||
case 2: FPU_RoundingMode = 0x0800; break; //_RC_UP
|
||||
|
@ -46,7 +47,7 @@ void ChangeDefaultRoundingModel (void) {
|
|||
void CompileCop1Test (CBlockSection * Section) {
|
||||
if (Section->FpuBeenUsed()) { return; }
|
||||
TestVariable(STATUS_CU1,&STATUS_REGISTER,"STATUS_REGISTER");
|
||||
g_N64System->GetRecompiler()->CompileExit(Section,Section->CompilePC,Section->CompilePC,Section->RegWorking,CExitInfo::COP1_Unuseable,FALSE,JeLabel32);
|
||||
_N64System->GetRecompiler()->CompileExit(Section,Section->CompilePC,Section->CompilePC,Section->RegWorking,CExitInfo::COP1_Unuseable,FALSE,JeLabel32);
|
||||
Section->FpuBeenUsed() = TRUE;
|
||||
}
|
||||
|
||||
|
@ -72,11 +73,11 @@ void Compile_R4300i_LWC1 (CBlockSection * Section) {
|
|||
DWORD Address = Section->MipsRegLo(Opcode.base) + (short)Opcode.offset;
|
||||
|
||||
TempReg1 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
Compile_LW(Section, TempReg1,Address);
|
||||
_MMU->Compile_LW(Section, TempReg1,Address);
|
||||
|
||||
TempReg2 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86regToX86Pointer(TempReg1,TempReg2);
|
||||
return;
|
||||
}
|
||||
|
@ -123,8 +124,8 @@ void Compile_R4300i_LWC1 (CBlockSection * Section) {
|
|||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
MoveN64MemToX86reg(TempReg3,TempReg1);
|
||||
}
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86regToX86Pointer(TempReg3,TempReg2);
|
||||
}
|
||||
|
||||
|
@ -139,17 +140,17 @@ void Compile_R4300i_LDC1 (CBlockSection * Section) {
|
|||
if (Section->IsConst(Opcode.base)) {
|
||||
DWORD Address = Section->MipsRegLo(Opcode.base) + (short)Opcode.offset;
|
||||
TempReg1 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
Compile_LW(Section, TempReg1,Address);
|
||||
_MMU->Compile_LW(Section, TempReg1,Address);
|
||||
|
||||
TempReg2 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
AddConstToX86Reg(TempReg2,4);
|
||||
MoveX86regToX86Pointer(TempReg1,TempReg2);
|
||||
|
||||
Compile_LW(Section,TempReg1,Address + 4);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
_MMU->Compile_LW(Section,TempReg1,Address + 4);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86regToX86Pointer(TempReg1,TempReg2);
|
||||
return;
|
||||
}
|
||||
|
@ -191,28 +192,28 @@ void Compile_R4300i_LDC1 (CBlockSection * Section) {
|
|||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg3);
|
||||
Push(TempReg2);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
AddConstToX86Reg(TempReg2,4);
|
||||
MoveX86regToX86Pointer(TempReg3,TempReg2);
|
||||
Pop(TempReg2);
|
||||
MoveX86regPointerToX86regDisp8(TempReg1, TempReg2,TempReg3,4);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86regToX86Pointer(TempReg3,TempReg2);
|
||||
} else {
|
||||
AndConstToX86Reg(TempReg1,0x1FFFFFFF);
|
||||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
MoveN64MemToX86reg(TempReg3,TempReg1);
|
||||
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
AddConstToX86Reg(TempReg2,4);
|
||||
MoveX86regToX86Pointer(TempReg3,TempReg2);
|
||||
|
||||
MoveN64MemDispToX86reg(TempReg3,TempReg1,4);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86regToX86Pointer(TempReg3,TempReg2);
|
||||
}
|
||||
}
|
||||
|
@ -230,10 +231,10 @@ void Compile_R4300i_SWC1 (CBlockSection * Section){
|
|||
UnMap_FPR(Section,Opcode.ft,TRUE);
|
||||
TempReg1 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Opcode.ft],Name,TempReg1);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Opcode.ft],Name,TempReg1);
|
||||
MoveX86PointerToX86reg(TempReg1,TempReg1);
|
||||
Compile_SW_Register(Section,TempReg1, Address);
|
||||
_MMU->Compile_SW_Register(Section,TempReg1, Address);
|
||||
return;
|
||||
}
|
||||
if (Section->IsMapped(Opcode.base)) {
|
||||
|
@ -266,15 +267,15 @@ void Compile_R4300i_SWC1 (CBlockSection * Section){
|
|||
|
||||
UnMap_FPR(Section,Opcode.ft,TRUE);
|
||||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Opcode.ft],Name,TempReg3);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Opcode.ft],Name,TempReg3);
|
||||
MoveX86PointerToX86reg(TempReg3,TempReg3);
|
||||
MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2);
|
||||
} else {
|
||||
TempReg2 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
UnMap_FPR(Section,Opcode.ft,TRUE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Opcode.ft],Name,TempReg2);
|
||||
MoveX86PointerToX86reg(TempReg2,TempReg2);
|
||||
AndConstToX86Reg(TempReg1,0x1FFFFFFF);
|
||||
MoveX86regToN64Mem(TempReg2, TempReg1);
|
||||
|
@ -292,16 +293,16 @@ void Compile_R4300i_SDC1 (CBlockSection * Section){
|
|||
DWORD Address = Section->MipsRegLo(Opcode.base) + (short)Opcode.offset;
|
||||
|
||||
TempReg1 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg1);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg1);
|
||||
AddConstToX86Reg(TempReg1,4);
|
||||
MoveX86PointerToX86reg(TempReg1,TempReg1);
|
||||
Compile_SW_Register(Section,TempReg1, Address);
|
||||
_MMU->Compile_SW_Register(Section,TempReg1, Address);
|
||||
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Opcode.ft],Name,TempReg1);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Opcode.ft],Name,TempReg1);
|
||||
MoveX86PointerToX86reg(TempReg1,TempReg1);
|
||||
Compile_SW_Register(Section,TempReg1, Address + 4);
|
||||
_MMU->Compile_SW_Register(Section,TempReg1, Address + 4);
|
||||
return;
|
||||
}
|
||||
if (Section->IsMapped(Opcode.base)) {
|
||||
|
@ -333,27 +334,27 @@ void Compile_R4300i_SDC1 (CBlockSection * Section){
|
|||
//0041C524 75 01 jne 0041C527
|
||||
|
||||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
AddConstToX86Reg(TempReg3,4);
|
||||
MoveX86PointerToX86reg(TempReg3,TempReg3);
|
||||
MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2);
|
||||
AddConstToX86Reg(TempReg1,4);
|
||||
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
MoveX86PointerToX86reg(TempReg3,TempReg3);
|
||||
MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2);
|
||||
} else {
|
||||
AndConstToX86Reg(TempReg1,0x1FFFFFFF);
|
||||
TempReg3 = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
AddConstToX86Reg(TempReg3,4);
|
||||
MoveX86PointerToX86reg(TempReg3,TempReg3);
|
||||
MoveX86regToN64Mem(TempReg3, TempReg1);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg3);
|
||||
MoveX86PointerToX86reg(TempReg3,TempReg3);
|
||||
MoveX86regToN64MemDisp(TempReg3, TempReg1,4);
|
||||
}
|
||||
|
@ -370,8 +371,8 @@ void Compile_R4300i_COP1_MF (CBlockSection * Section) {
|
|||
UnMap_FPR(Section,Opcode.fs,TRUE);
|
||||
Map_GPR_32bit(Section,Opcode.rt, TRUE, -1);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Opcode.fs],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Opcode.fs],Name,TempReg);
|
||||
MoveX86PointerToX86reg(Section->MipsRegLo(Opcode.rt),TempReg);
|
||||
}
|
||||
|
||||
|
@ -384,12 +385,12 @@ void Compile_R4300i_COP1_DMF (CBlockSection * Section) {
|
|||
UnMap_FPR(Section,Opcode.fs,TRUE);
|
||||
Map_GPR_64bit(Section,Opcode.rt, -1);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
AddConstToX86Reg(TempReg,4);
|
||||
MoveX86PointerToX86reg(Section->MipsRegHi(Opcode.rt),TempReg);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
MoveX86PointerToX86reg(Section->MipsRegLo(Opcode.rt),TempReg);
|
||||
}
|
||||
|
||||
|
@ -400,7 +401,7 @@ void Compile_R4300i_COP1_CF(CBlockSection * Section) {
|
|||
|
||||
if (Opcode.fs != 31 && Opcode.fs != 0) { Compile_R4300i_UnknownOpcode (Section); return; }
|
||||
Map_GPR_32bit(Section,Opcode.rt,TRUE,-1);
|
||||
MoveVariableToX86reg(&FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs],Section->MipsRegLo(Opcode.rt));
|
||||
MoveVariableToX86reg(&_FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs],Section->MipsRegLo(Opcode.rt));
|
||||
}
|
||||
|
||||
void Compile_R4300i_COP1_MT( CBlockSection * Section) {
|
||||
|
@ -416,8 +417,8 @@ void Compile_R4300i_COP1_MT( CBlockSection * Section) {
|
|||
}
|
||||
UnMap_FPR(Section,Opcode.fs,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Opcode.fs],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Opcode.fs],Name,TempReg);
|
||||
|
||||
if (Section->IsConst(Opcode.rt)) {
|
||||
MoveConstToX86Pointer(Section->MipsRegLo(Opcode.rt),TempReg);
|
||||
|
@ -441,8 +442,8 @@ void Compile_R4300i_COP1_DMT( CBlockSection * Section) {
|
|||
}
|
||||
UnMap_FPR(Section,Opcode.fs,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.fs);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.fs],Name,TempReg);
|
||||
|
||||
if (Section->IsConst(Opcode.rt)) {
|
||||
MoveConstToX86Pointer(Section->MipsRegLo(Opcode.rt),TempReg);
|
||||
|
@ -476,11 +477,11 @@ void Compile_R4300i_COP1_CT(CBlockSection * Section) {
|
|||
if (Opcode.fs != 31) { Compile_R4300i_UnknownOpcode (Section); return; }
|
||||
|
||||
if (Section->IsConst(Opcode.rt)) {
|
||||
MoveConstToVariable(Section->MipsRegLo(Opcode.rt),&FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
MoveConstToVariable(Section->MipsRegLo(Opcode.rt),&_FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
} else if (Section->IsMapped(Opcode.rt)) {
|
||||
MoveX86regToVariable(Section->MipsRegLo(Opcode.rt),&FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
MoveX86regToVariable(Section->MipsRegLo(Opcode.rt),&_FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
} else {
|
||||
MoveX86regToVariable(Map_TempReg(Section,x86_Any,Opcode.rt,FALSE),&FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
MoveX86regToVariable(Map_TempReg(Section,x86_Any,Opcode.rt,FALSE),&_FPCR[Opcode.fs],FPR_Ctrl_Name[Opcode.fs]);
|
||||
}
|
||||
Pushad();
|
||||
Call_Direct(ChangeDefaultRoundingModel, "ChangeDefaultRoundingModel");
|
||||
|
@ -506,8 +507,8 @@ void Compile_R4300i_COP1_S_ADD (CBlockSection * Section) {
|
|||
|
||||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Reg2],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Float);
|
||||
fpuAddDwordRegPointer(TempReg);
|
||||
}
|
||||
|
@ -529,8 +530,8 @@ void Compile_R4300i_COP1_S_SUB (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fs,CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Opcode.ft],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Opcode.ft],Name,TempReg);
|
||||
fpuSubDwordRegPointer(TempReg);
|
||||
} else {
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Reg1, CRegInfo::FPU_Float);
|
||||
|
@ -541,8 +542,8 @@ void Compile_R4300i_COP1_S_SUB (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Reg2],Name,TempReg);
|
||||
fpuSubDwordRegPointer(TempReg);
|
||||
}
|
||||
}
|
||||
|
@ -567,8 +568,8 @@ void Compile_R4300i_COP1_S_MUL (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Reg2],Name,TempReg);
|
||||
fpuMulDwordRegPointer(TempReg);
|
||||
}
|
||||
UnMap_FPR(Section,Opcode.fd,TRUE);
|
||||
|
@ -589,8 +590,8 @@ void Compile_R4300i_COP1_S_DIV (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fs,CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Opcode.ft],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Opcode.ft],Name,TempReg);
|
||||
fpuDivDwordRegPointer(TempReg);
|
||||
} else {
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Reg1, CRegInfo::FPU_Float);
|
||||
|
@ -601,8 +602,8 @@ void Compile_R4300i_COP1_S_DIV (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Reg2],Name,TempReg);
|
||||
fpuDivDwordRegPointer(TempReg);
|
||||
}
|
||||
}
|
||||
|
@ -768,8 +769,8 @@ void Compile_R4300i_COP1_S_CMP (CBlockSection * Section) {
|
|||
Load_FPR_ToTop(Section,Reg1,Reg1, CRegInfo::FPU_Float);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRFloatLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRFloatLocation[Reg2],Name,TempReg);
|
||||
fpuComDwordRegPointer(TempReg,FALSE);
|
||||
}
|
||||
AndConstToVariable(~FPCSR_C, &FSTATUS_REGISTER, "FSTATUS_REGISTER");
|
||||
|
@ -796,7 +797,7 @@ void Compile_R4300i_COP1_S_CMP (CBlockSection * Section) {
|
|||
Setz(x86reg);
|
||||
}
|
||||
ShiftLeftSignImmed(x86reg, 23);
|
||||
OrX86RegToVariable(&FPCR[31], "FPCR[31]", x86reg);
|
||||
OrX86RegToVariable(&_FPCR[31], "_FPCR[31]", x86reg);
|
||||
}
|
||||
|
||||
/************************** COP1: D functions ************************/
|
||||
|
@ -816,8 +817,8 @@ void Compile_R4300i_COP1_D_ADD (CBlockSection * Section) {
|
|||
|
||||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Double);
|
||||
fpuAddQwordRegPointer(TempReg);
|
||||
}
|
||||
|
@ -835,8 +836,8 @@ void Compile_R4300i_COP1_D_SUB (CBlockSection * Section) {
|
|||
if (Opcode.fd == Opcode.ft) {
|
||||
UnMap_FPR(Section,Opcode.fd,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fs,CRegInfo::FPU_Double);
|
||||
fpuSubQwordRegPointer(TempReg);
|
||||
} else {
|
||||
|
@ -847,8 +848,8 @@ void Compile_R4300i_COP1_D_SUB (CBlockSection * Section) {
|
|||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Double);
|
||||
fpuSubQwordRegPointer(TempReg);
|
||||
}
|
||||
|
@ -872,8 +873,8 @@ void Compile_R4300i_COP1_D_MUL (CBlockSection * Section) {
|
|||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Double);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
fpuMulQwordRegPointer(TempReg);
|
||||
}
|
||||
}
|
||||
|
@ -890,8 +891,8 @@ void Compile_R4300i_COP1_D_DIV (CBlockSection * Section) {
|
|||
if (Opcode.fd == Opcode.ft) {
|
||||
UnMap_FPR(Section,Opcode.fd,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Opcode.ft],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Opcode.ft);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Opcode.ft],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fs,CRegInfo::FPU_Double);
|
||||
fpuDivQwordRegPointer(TempReg);
|
||||
} else {
|
||||
|
@ -901,8 +902,8 @@ void Compile_R4300i_COP1_D_DIV (CBlockSection * Section) {
|
|||
} else {
|
||||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Opcode.fd,Opcode.fd, CRegInfo::FPU_Double);
|
||||
fpuDivQwordRegPointer(TempReg);
|
||||
}
|
||||
|
@ -1084,8 +1085,8 @@ void Compile_R4300i_COP1_D_CMP (CBlockSection * Section) {
|
|||
|
||||
UnMap_FPR(Section,Reg2,TRUE);
|
||||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Reg2);
|
||||
MoveVariableToX86reg((BYTE *)&_FPRDoubleLocation[Reg2],Name,TempReg);
|
||||
Load_FPR_ToTop(Section,Reg1,Reg1, CRegInfo::FPU_Double);
|
||||
fpuComQwordRegPointer(TempReg,FALSE);
|
||||
}
|
||||
|
@ -1112,7 +1113,7 @@ void Compile_R4300i_COP1_D_CMP (CBlockSection * Section) {
|
|||
Setz(x86reg);
|
||||
}
|
||||
ShiftLeftSignImmed(x86reg, 23);
|
||||
OrX86RegToVariable(&FPCR[31], "FPCR[31]", x86reg);
|
||||
OrX86RegToVariable(&_FPCR[31], "_FPCR[31]", x86reg);
|
||||
}
|
||||
|
||||
/************************** COP1: W functions ************************/
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -286,7 +286,7 @@ void InitalizeR4300iRegisters (int UsePif, int Country, int CIC_Chip) {
|
|||
memset(RegPI,0,sizeof(Registers.PI));
|
||||
memset(RegRI,0,sizeof(Registers.RI));
|
||||
memset(RegSI,0,sizeof(Registers.SI));
|
||||
memset(GPR,0,sizeof(Registers.GPR));
|
||||
memset(_GPR,0,sizeof(Registers._GPR));
|
||||
memset(FPR,0,sizeof(Registers.FPR));
|
||||
|
||||
if (CIC_Chip < 0) {
|
||||
|
@ -347,23 +347,23 @@ void InitalizeR4300iRegisters (int UsePif, int Country, int CIC_Chip) {
|
|||
memcpy( (N64MEM+0x4000040), (ROM + 0x040), 0xFBC);
|
||||
PROGRAM_COUNTER = 0xA4000040;
|
||||
|
||||
GPR[0].DW=0x0000000000000000;
|
||||
GPR[6].DW=0xFFFFFFFFA4001F0C;
|
||||
GPR[7].DW=0xFFFFFFFFA4001F08;
|
||||
GPR[8].DW=0x00000000000000C0;
|
||||
GPR[9].DW=0x0000000000000000;
|
||||
GPR[10].DW=0x0000000000000040;
|
||||
GPR[11].DW=0xFFFFFFFFA4000040;
|
||||
GPR[16].DW=0x0000000000000000;
|
||||
GPR[17].DW=0x0000000000000000;
|
||||
GPR[18].DW=0x0000000000000000;
|
||||
GPR[19].DW=0x0000000000000000;
|
||||
GPR[21].DW=0x0000000000000000;
|
||||
GPR[26].DW=0x0000000000000000;
|
||||
GPR[27].DW=0x0000000000000000;
|
||||
GPR[28].DW=0x0000000000000000;
|
||||
GPR[29].DW=0xFFFFFFFFA4001FF0;
|
||||
GPR[30].DW=0x0000000000000000;
|
||||
_GPR[0].DW=0x0000000000000000;
|
||||
_GPR[6].DW=0xFFFFFFFFA4001F0C;
|
||||
_GPR[7].DW=0xFFFFFFFFA4001F08;
|
||||
_GPR[8].DW=0x00000000000000C0;
|
||||
_GPR[9].DW=0x0000000000000000;
|
||||
_GPR[10].DW=0x0000000000000040;
|
||||
_GPR[11].DW=0xFFFFFFFFA4000040;
|
||||
_GPR[16].DW=0x0000000000000000;
|
||||
_GPR[17].DW=0x0000000000000000;
|
||||
_GPR[18].DW=0x0000000000000000;
|
||||
_GPR[19].DW=0x0000000000000000;
|
||||
_GPR[21].DW=0x0000000000000000;
|
||||
_GPR[26].DW=0x0000000000000000;
|
||||
_GPR[27].DW=0x0000000000000000;
|
||||
_GPR[28].DW=0x0000000000000000;
|
||||
_GPR[29].DW=0xFFFFFFFFA4001FF0;
|
||||
_GPR[30].DW=0x0000000000000000;
|
||||
|
||||
switch (Country) {
|
||||
case 0x44: //Germany
|
||||
|
@ -376,31 +376,31 @@ void InitalizeR4300iRegisters (int UsePif, int Country, int CIC_Chip) {
|
|||
case 0x59: // X (PAL)
|
||||
switch (CIC_Chip) {
|
||||
case 2:
|
||||
GPR[5].DW=0xFFFFFFFFC0F1D859;
|
||||
GPR[14].DW=0x000000002DE108EA;
|
||||
GPR[24].DW=0x0000000000000000;
|
||||
_GPR[5].DW=0xFFFFFFFFC0F1D859;
|
||||
_GPR[14].DW=0x000000002DE108EA;
|
||||
_GPR[24].DW=0x0000000000000000;
|
||||
break;
|
||||
case 3:
|
||||
GPR[5].DW=0xFFFFFFFFD4646273;
|
||||
GPR[14].DW=0x000000001AF99984;
|
||||
GPR[24].DW=0x0000000000000000;
|
||||
_GPR[5].DW=0xFFFFFFFFD4646273;
|
||||
_GPR[14].DW=0x000000001AF99984;
|
||||
_GPR[24].DW=0x0000000000000000;
|
||||
break;
|
||||
case 5:
|
||||
*(DWORD *)&IMEM[0x04] = 0xBDA807FC;
|
||||
GPR[5].DW=0xFFFFFFFFDECAAAD1;
|
||||
GPR[14].DW=0x000000000CF85C13;
|
||||
GPR[24].DW=0x0000000000000002;
|
||||
_GPR[5].DW=0xFFFFFFFFDECAAAD1;
|
||||
_GPR[14].DW=0x000000000CF85C13;
|
||||
_GPR[24].DW=0x0000000000000002;
|
||||
break;
|
||||
case 6:
|
||||
GPR[5].DW=0xFFFFFFFFB04DC903;
|
||||
GPR[14].DW=0x000000001AF99984;
|
||||
GPR[24].DW=0x0000000000000002;
|
||||
_GPR[5].DW=0xFFFFFFFFB04DC903;
|
||||
_GPR[14].DW=0x000000001AF99984;
|
||||
_GPR[24].DW=0x0000000000000002;
|
||||
break;
|
||||
}
|
||||
|
||||
GPR[20].DW=0x0000000000000000;
|
||||
GPR[23].DW=0x0000000000000006;
|
||||
GPR[31].DW=0xFFFFFFFFA4001554;
|
||||
_GPR[20].DW=0x0000000000000000;
|
||||
_GPR[23].DW=0x0000000000000006;
|
||||
_GPR[31].DW=0xFFFFFFFFA4001554;
|
||||
break;
|
||||
case 0x37: // 7 (Beta)
|
||||
case 0x41: // ????
|
||||
|
@ -409,53 +409,53 @@ void InitalizeR4300iRegisters (int UsePif, int Country, int CIC_Chip) {
|
|||
default:
|
||||
switch (CIC_Chip) {
|
||||
case 2:
|
||||
GPR[5].DW=0xFFFFFFFFC95973D5;
|
||||
GPR[14].DW=0x000000002449A366;
|
||||
_GPR[5].DW=0xFFFFFFFFC95973D5;
|
||||
_GPR[14].DW=0x000000002449A366;
|
||||
break;
|
||||
case 3:
|
||||
GPR[5].DW=0xFFFFFFFF95315A28;
|
||||
GPR[14].DW=0x000000005BACA1DF;
|
||||
_GPR[5].DW=0xFFFFFFFF95315A28;
|
||||
_GPR[14].DW=0x000000005BACA1DF;
|
||||
break;
|
||||
case 5:
|
||||
*(DWORD *)&IMEM[0x04] = 0x8DA807FC;
|
||||
GPR[5].DW=0x000000005493FB9A;
|
||||
GPR[14].DW=0xFFFFFFFFC2C20384;
|
||||
_GPR[5].DW=0x000000005493FB9A;
|
||||
_GPR[14].DW=0xFFFFFFFFC2C20384;
|
||||
case 6:
|
||||
GPR[5].DW=0xFFFFFFFFE067221F;
|
||||
GPR[14].DW=0x000000005CD2B70F;
|
||||
_GPR[5].DW=0xFFFFFFFFE067221F;
|
||||
_GPR[14].DW=0x000000005CD2B70F;
|
||||
break;
|
||||
}
|
||||
GPR[20].DW=0x0000000000000001;
|
||||
GPR[23].DW=0x0000000000000000;
|
||||
GPR[24].DW=0x0000000000000003;
|
||||
GPR[31].DW=0xFFFFFFFFA4001550;
|
||||
_GPR[20].DW=0x0000000000000001;
|
||||
_GPR[23].DW=0x0000000000000000;
|
||||
_GPR[24].DW=0x0000000000000003;
|
||||
_GPR[31].DW=0xFFFFFFFFA4001550;
|
||||
}
|
||||
|
||||
switch (CIC_Chip) {
|
||||
case 1:
|
||||
GPR[22].DW=0x000000000000003F;
|
||||
_GPR[22].DW=0x000000000000003F;
|
||||
break;
|
||||
case 2:
|
||||
GPR[1].DW=0x0000000000000001;
|
||||
GPR[2].DW=0x000000000EBDA536;
|
||||
GPR[3].DW=0x000000000EBDA536;
|
||||
GPR[4].DW=0x000000000000A536;
|
||||
GPR[12].DW=0xFFFFFFFFED10D0B3;
|
||||
GPR[13].DW=0x000000001402A4CC;
|
||||
GPR[15].DW=0x000000003103E121;
|
||||
GPR[22].DW=0x000000000000003F;
|
||||
GPR[25].DW=0xFFFFFFFF9DEBB54F;
|
||||
_GPR[1].DW=0x0000000000000001;
|
||||
_GPR[2].DW=0x000000000EBDA536;
|
||||
_GPR[3].DW=0x000000000EBDA536;
|
||||
_GPR[4].DW=0x000000000000A536;
|
||||
_GPR[12].DW=0xFFFFFFFFED10D0B3;
|
||||
_GPR[13].DW=0x000000001402A4CC;
|
||||
_GPR[15].DW=0x000000003103E121;
|
||||
_GPR[22].DW=0x000000000000003F;
|
||||
_GPR[25].DW=0xFFFFFFFF9DEBB54F;
|
||||
break;
|
||||
case 3:
|
||||
GPR[1].DW=0x0000000000000001;
|
||||
GPR[2].DW=0x0000000049A5EE96;
|
||||
GPR[3].DW=0x0000000049A5EE96;
|
||||
GPR[4].DW=0x000000000000EE96;
|
||||
GPR[12].DW=0xFFFFFFFFCE9DFBF7;
|
||||
GPR[13].DW=0xFFFFFFFFCE9DFBF7;
|
||||
GPR[15].DW=0x0000000018B63D28;
|
||||
GPR[22].DW=0x0000000000000078;
|
||||
GPR[25].DW=0xFFFFFFFF825B21C9;
|
||||
_GPR[1].DW=0x0000000000000001;
|
||||
_GPR[2].DW=0x0000000049A5EE96;
|
||||
_GPR[3].DW=0x0000000049A5EE96;
|
||||
_GPR[4].DW=0x000000000000EE96;
|
||||
_GPR[12].DW=0xFFFFFFFFCE9DFBF7;
|
||||
_GPR[13].DW=0xFFFFFFFFCE9DFBF7;
|
||||
_GPR[15].DW=0x0000000018B63D28;
|
||||
_GPR[22].DW=0x0000000000000078;
|
||||
_GPR[25].DW=0xFFFFFFFF825B21C9;
|
||||
break;
|
||||
case 5:
|
||||
*(DWORD *)&IMEM[0x00] = 0x3C0DBFC0;
|
||||
|
@ -465,33 +465,33 @@ void InitalizeR4300iRegisters (int UsePif, int Country, int CIC_Chip) {
|
|||
*(DWORD *)&IMEM[0x14] = 0x3C0DBFC0;
|
||||
*(DWORD *)&IMEM[0x18] = 0x8DA80024;
|
||||
*(DWORD *)&IMEM[0x1C] = 0x3C0BB000;
|
||||
GPR[1].DW=0x0000000000000000;
|
||||
GPR[2].DW=0xFFFFFFFFF58B0FBF;
|
||||
GPR[3].DW=0xFFFFFFFFF58B0FBF;
|
||||
GPR[4].DW=0x0000000000000FBF;
|
||||
GPR[12].DW=0xFFFFFFFF9651F81E;
|
||||
GPR[13].DW=0x000000002D42AAC5;
|
||||
GPR[15].DW=0x0000000056584D60;
|
||||
GPR[22].DW=0x0000000000000091;
|
||||
GPR[25].DW=0xFFFFFFFFCDCE565F;
|
||||
_GPR[1].DW=0x0000000000000000;
|
||||
_GPR[2].DW=0xFFFFFFFFF58B0FBF;
|
||||
_GPR[3].DW=0xFFFFFFFFF58B0FBF;
|
||||
_GPR[4].DW=0x0000000000000FBF;
|
||||
_GPR[12].DW=0xFFFFFFFF9651F81E;
|
||||
_GPR[13].DW=0x000000002D42AAC5;
|
||||
_GPR[15].DW=0x0000000056584D60;
|
||||
_GPR[22].DW=0x0000000000000091;
|
||||
_GPR[25].DW=0xFFFFFFFFCDCE565F;
|
||||
break;
|
||||
case 6:
|
||||
GPR[1].DW=0x0000000000000000;
|
||||
GPR[2].DW=0xFFFFFFFFA95930A4;
|
||||
GPR[3].DW=0xFFFFFFFFA95930A4;
|
||||
GPR[4].DW=0x00000000000030A4;
|
||||
GPR[12].DW=0xFFFFFFFFBCB59510;
|
||||
GPR[13].DW=0xFFFFFFFFBCB59510;
|
||||
GPR[15].DW=0x000000007A3C07F4;
|
||||
GPR[22].DW=0x0000000000000085;
|
||||
GPR[25].DW=0x00000000465E3F72;
|
||||
_GPR[1].DW=0x0000000000000000;
|
||||
_GPR[2].DW=0xFFFFFFFFA95930A4;
|
||||
_GPR[3].DW=0xFFFFFFFFA95930A4;
|
||||
_GPR[4].DW=0x00000000000030A4;
|
||||
_GPR[12].DW=0xFFFFFFFFBCB59510;
|
||||
_GPR[13].DW=0xFFFFFFFFBCB59510;
|
||||
_GPR[15].DW=0x000000007A3C07F4;
|
||||
_GPR[22].DW=0x0000000000000085;
|
||||
_GPR[25].DW=0x00000000465E3F72;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#ifdef Interpreter_StackTest
|
||||
StackValue = GPR[29].W[0];
|
||||
StackValue = _GPR[29].W[0];
|
||||
#endif
|
||||
MemoryStack = (DWORD)(N64MEM+(GPR[29].W[0] & 0x1FFFFFFF));
|
||||
MemoryStack = (DWORD)(N64MEM+(_GPR[29].W[0] & 0x1FFFFFFF));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -604,23 +604,23 @@ void Load_FPR_ToTop (CBlockSection * Section, int Reg, int RegToLoad, CRegInfo::
|
|||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
switch (Format) {
|
||||
case CRegInfo::FPU_Dword:
|
||||
sprintf(Name,"FPRFloatLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[RegToLoad],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[RegToLoad],Name,TempReg);
|
||||
fpuLoadIntegerDwordFromX86Reg(&Section->StackTopPos(),TempReg);
|
||||
break;
|
||||
case CRegInfo::FPU_Qword:
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[RegToLoad],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[RegToLoad],Name,TempReg);
|
||||
fpuLoadIntegerQwordFromX86Reg(&Section->StackTopPos(),TempReg);
|
||||
break;
|
||||
case CRegInfo::FPU_Float:
|
||||
sprintf(Name,"FPRFloatLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&FPRFloatLocation[RegToLoad],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[RegToLoad],Name,TempReg);
|
||||
fpuLoadDwordFromX86Reg(&Section->StackTopPos(),TempReg);
|
||||
break;
|
||||
case CRegInfo::FPU_Double:
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[RegToLoad],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",RegToLoad);
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[RegToLoad],Name,TempReg);
|
||||
fpuLoadQwordFromX86Reg(&Section->StackTopPos(),TempReg);
|
||||
break;
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
|
@ -676,7 +676,7 @@ void Map_GPR_32bit (CBlockSection * Section, int Reg, BOOL SignValue, int MipsRe
|
|||
|
||||
if (MipsRegToLoad > 0) {
|
||||
if (Section->IsUnknown(MipsRegToLoad)) {
|
||||
MoveVariableToX86reg(&GPR[MipsRegToLoad].UW[0],GPR_NameLo[MipsRegToLoad],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[MipsRegToLoad].UW[0],GPR_NameLo[MipsRegToLoad],x86Reg);
|
||||
} else if (Section->IsMapped(MipsRegToLoad)) {
|
||||
if (Reg != MipsRegToLoad) {
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(MipsRegToLoad),x86Reg);
|
||||
|
@ -739,8 +739,8 @@ void Map_GPR_64bit (CBlockSection * Section, int Reg, int MipsRegToLoad) {
|
|||
Section->x86MapOrder(x86lo) = 1;
|
||||
if (MipsRegToLoad > 0) {
|
||||
if (Section->IsUnknown(MipsRegToLoad)) {
|
||||
MoveVariableToX86reg(&GPR[MipsRegToLoad].UW[1],GPR_NameHi[MipsRegToLoad],x86Hi);
|
||||
MoveVariableToX86reg(&GPR[MipsRegToLoad].UW[0],GPR_NameLo[MipsRegToLoad],x86lo);
|
||||
MoveVariableToX86reg(&_GPR[MipsRegToLoad].UW[1],GPR_NameHi[MipsRegToLoad],x86Hi);
|
||||
MoveVariableToX86reg(&_GPR[MipsRegToLoad].UW[0],GPR_NameLo[MipsRegToLoad],x86lo);
|
||||
} else if (Section->IsMapped(MipsRegToLoad)) {
|
||||
if (Section->Is32Bit(MipsRegToLoad)) {
|
||||
if (Section->IsSigned(MipsRegToLoad)) {
|
||||
|
@ -816,6 +816,8 @@ int Map_MemoryStack (CBlockSection * Section, int Reg, bool MapRegister)
|
|||
return CurrentMap;
|
||||
}
|
||||
// map a register
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (Reg == x86_Any)
|
||||
{
|
||||
if (CurrentMap > 0)
|
||||
|
@ -848,6 +850,7 @@ int Map_MemoryStack (CBlockSection * Section, int Reg, bool MapRegister)
|
|||
CPU_Message(" regcache: allocate %s as Memory Stack",x86_Name(Reg));
|
||||
MoveVariableToX86reg(g_MemoryStack,"MemoryStack",Reg);
|
||||
}
|
||||
#endif
|
||||
return Reg;
|
||||
}
|
||||
|
||||
|
@ -945,7 +948,7 @@ int Map_TempReg (CBlockSection * Section, int x86Reg, int MipsReg, BOOL LoadHiWo
|
|||
if (MipsReg >= 0) {
|
||||
if (LoadHiWord) {
|
||||
if (Section->IsUnknown(MipsReg)) {
|
||||
MoveVariableToX86reg(&GPR[MipsReg].UW[1],GPR_NameHi[MipsReg],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[MipsReg].UW[1],GPR_NameHi[MipsReg],x86Reg);
|
||||
} else if (Section->IsMapped(MipsReg)) {
|
||||
if (Section->Is64Bit(MipsReg)) {
|
||||
MoveX86RegToX86Reg(Section->MipsRegHi(MipsReg),x86Reg);
|
||||
|
@ -972,7 +975,7 @@ int Map_TempReg (CBlockSection * Section, int x86Reg, int MipsReg, BOOL LoadHiWo
|
|||
}
|
||||
} else {
|
||||
if (Section->IsUnknown(MipsReg)) {
|
||||
MoveVariableToX86reg(&GPR[MipsReg].UW[0],GPR_NameLo[MipsReg],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[MipsReg].UW[0],GPR_NameLo[MipsReg],x86Reg);
|
||||
} else if (Section->IsMapped(MipsReg)) {
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(MipsReg),x86Reg);
|
||||
} else {
|
||||
|
@ -1024,15 +1027,15 @@ void SetFpuLocations (void) {
|
|||
|
||||
if ((STATUS_REGISTER & STATUS_FR) == 0) {
|
||||
for (count = 0; count < 32; count ++) {
|
||||
FPRFloatLocation[count] = (void *)(&FPR[count >> 1].W[count & 1]);
|
||||
//FPRDoubleLocation[count] = FPRFloatLocation[count];
|
||||
FPRDoubleLocation[count] = (void *)(&FPR[count >> 1].DW);
|
||||
_FPRFloatLocation[count] = (void *)(&FPR[count >> 1].W[count & 1]);
|
||||
//_FPRDoubleLocation[count] = _FPRFloatLocation[count];
|
||||
_FPRDoubleLocation[count] = (void *)(&FPR[count >> 1].DW);
|
||||
}
|
||||
} else {
|
||||
for (count = 0; count < 32; count ++) {
|
||||
FPRFloatLocation[count] = (void *)(&FPR[count].W[1]);
|
||||
//FPRDoubleLocation[count] = FPRFloatLocation[count];
|
||||
FPRDoubleLocation[count] = (void *)(&FPR[count].DW);
|
||||
_FPRFloatLocation[count] = (void *)(&FPR[count].W[1]);
|
||||
//_FPRDoubleLocation[count] = _FPRFloatLocation[count];
|
||||
_FPRDoubleLocation[count] = (void *)(&FPR[count].DW);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1042,7 +1045,7 @@ void SetupRegisters(N64_REGISTERS * n64_Registers) {
|
|||
HI.DW = n64_Registers->HI.DW;
|
||||
LO.DW = n64_Registers->LO.DW;
|
||||
CP0 = n64_Registers->CP0;
|
||||
GPR = n64_Registers->GPR;
|
||||
_GPR = n64_Registers->_GPR;
|
||||
FPR = n64_Registers->FPR;
|
||||
FPCR = n64_Registers->FPCR;
|
||||
RegRDRAM = n64_Registers->RDRAM;
|
||||
|
@ -1167,23 +1170,23 @@ void UnMap_FPR (CBlockSection * Section, int Reg, int WriteBackValue ) {
|
|||
TempReg = Map_TempReg(Section,x86_Any,-1,FALSE);
|
||||
switch (Section->FpuState(Section->StackTopPos())) {
|
||||
case CRegInfo::FPU_Dword:
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
fpuStoreIntegerDwordFromX86Reg(&Section->StackTopPos(),TempReg, TRUE);
|
||||
break;
|
||||
case CRegInfo::FPU_Qword:
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
fpuStoreIntegerQwordFromX86Reg(&Section->StackTopPos(),TempReg, TRUE);
|
||||
break;
|
||||
case CRegInfo::FPU_Float:
|
||||
sprintf(Name,"FPRFloatLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&FPRFloatLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
sprintf(Name,"_FPRFloatLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&_FPRFloatLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
fpuStoreDwordFromX86Reg(&Section->StackTopPos(),TempReg, TRUE);
|
||||
break;
|
||||
case CRegInfo::FPU_Double:
|
||||
sprintf(Name,"FPRDoubleLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&FPRDoubleLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
sprintf(Name,"_FPRDoubleLocation[%d]",Section->FpuMappedTo(Section->StackTopPos()));
|
||||
MoveVariableToX86reg(&_FPRDoubleLocation[Section->FpuMappedTo(Section->StackTopPos())],Name,TempReg);
|
||||
fpuStoreQwordFromX86Reg(&Section->StackTopPos(),TempReg, TRUE);
|
||||
break;
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
|
@ -1221,17 +1224,17 @@ void UnMap_GPR (CBlockSection * Section, DWORD Reg, int WriteBackValue) {
|
|||
return;
|
||||
}
|
||||
if (Section->Is64Bit(Reg)) {
|
||||
MoveConstToVariable(Section->MipsRegHi(Reg),&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveConstToVariable(Section->MipsRegLo(Reg),&GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
MoveConstToVariable(Section->MipsRegHi(Reg),&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveConstToVariable(Section->MipsRegLo(Reg),&_GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
Section->MipsRegState(Reg) = CRegInfo::STATE_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
if ((Section->MipsRegLo(Reg) & 0x80000000) != 0) {
|
||||
MoveConstToVariable(0xFFFFFFFF,&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveConstToVariable(0xFFFFFFFF,&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
} else {
|
||||
MoveConstToVariable(0,&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveConstToVariable(0,&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
}
|
||||
MoveConstToVariable(Section->MipsRegLo(Reg),&GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
MoveConstToVariable(Section->MipsRegLo(Reg),&_GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
Section->MipsRegState(Reg) = CRegInfo::STATE_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
|
@ -1247,15 +1250,15 @@ void UnMap_GPR (CBlockSection * Section, DWORD Reg, int WriteBackValue) {
|
|||
Section->MipsRegState(Reg) = CRegInfo::STATE_UNKNOWN;
|
||||
return;
|
||||
}
|
||||
MoveX86regToVariable(Section->MipsRegLo(Reg),&GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
MoveX86regToVariable(Section->MipsRegLo(Reg),&_GPR[Reg].UW[0],GPR_NameLo[Reg]);
|
||||
if (Section->Is64Bit(Reg)) {
|
||||
MoveX86regToVariable(Section->MipsRegHi(Reg),&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveX86regToVariable(Section->MipsRegHi(Reg),&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
} else {
|
||||
if (Section->IsSigned(Reg)) {
|
||||
ShiftRightSignImmed(Section->MipsRegLo(Reg),31);
|
||||
MoveX86regToVariable(Section->MipsRegLo(Reg),&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveX86regToVariable(Section->MipsRegLo(Reg),&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
} else {
|
||||
MoveConstToVariable(0,&GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
MoveConstToVariable(0,&_GPR[Reg].UW[1],GPR_NameHi[Reg]);
|
||||
}
|
||||
}
|
||||
Section->MipsRegState(Reg) = CRegInfo::STATE_UNKNOWN;
|
||||
|
@ -1308,12 +1311,15 @@ BOOL UnMap_X86reg (CBlockSection * Section, DWORD x86Reg) {
|
|||
}
|
||||
}
|
||||
}
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (Section->x86Mapped(x86Reg) == CRegInfo::Stack_Mapped) {
|
||||
CPU_Message(" regcache: unallocate %s from Memory Stack",x86_Name(x86Reg));
|
||||
MoveX86regToVariable(x86Reg,g_MemoryStack,"MemoryStack");
|
||||
Section->x86Mapped(x86Reg) = CRegInfo::NotMapped;
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1336,11 +1342,11 @@ void UnProtectGPR(CBlockSection * Section, DWORD Reg) {
|
|||
case CRegInfo::STATE_UNKNOWN: break;
|
||||
case STATE_CONST_32:
|
||||
if ((Section->MipsRegLo(count) & 0x80000000) != 0) {
|
||||
MoveConstToVariable(0xFFFFFFFF,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveConstToVariable(0xFFFFFFFF,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
} else {
|
||||
MoveConstToVariable(0,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveConstToVariable(0,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
}
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
Section->MipsRegState(count) = CRegInfo::STATE_UNKNOWN;
|
||||
break;
|
||||
default:
|
||||
|
@ -1376,17 +1382,17 @@ void WriteBackRegisters (CBlockSection * Section) {
|
|||
}
|
||||
|
||||
if ((Section->MipsRegLo(count) & 0x80000000) != 0) {
|
||||
MoveX86regToVariable(x86_ESI,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
} else {
|
||||
MoveX86regToVariable(x86_EDI,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
}
|
||||
|
||||
if (Section->MipsRegLo(count) == 0) {
|
||||
MoveX86regToVariable(x86_EDI,&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
} else if (Section->MipsRegLo(count) == 0xFFFFFFFF) {
|
||||
MoveX86regToVariable(x86_ESI,&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
} else
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
|
||||
Section->MipsRegState(count) = CRegInfo::STATE_UNKNOWN;
|
||||
break;
|
||||
|
@ -1401,19 +1407,19 @@ void WriteBackRegisters (CBlockSection * Section) {
|
|||
}
|
||||
|
||||
if (Section->MipsRegHi(count) == 0) {
|
||||
MoveX86regToVariable(x86_EDI,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
} else if (Section->MipsRegLo(count) == 0xFFFFFFFF) {
|
||||
MoveX86regToVariable(x86_ESI,&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
} else {
|
||||
MoveConstToVariable(Section->MipsRegHi(count),&GPR[count].UW[1],GPR_NameHi[count]);
|
||||
MoveConstToVariable(Section->MipsRegHi(count),&_GPR[count].UW[1],GPR_NameHi[count]);
|
||||
}
|
||||
|
||||
if (Section->MipsRegLo(count) == 0) {
|
||||
MoveX86regToVariable(x86_EDI,&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveX86regToVariable(x86_EDI,&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
} else if (Section->MipsRegLo(count) == 0xFFFFFFFF) {
|
||||
MoveX86regToVariable(x86_ESI,&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveX86regToVariable(x86_ESI,&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
} else {
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&GPR[count].UW[0],GPR_NameLo[count]);
|
||||
MoveConstToVariable(Section->MipsRegLo(count),&_GPR[count].UW[0],GPR_NameLo[count]);
|
||||
}
|
||||
Section->MipsRegState(count) = CRegInfo::STATE_UNKNOWN;
|
||||
break;
|
||||
|
|
|
@ -24,311 +24,156 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define INDEX_REGISTER CP0[0]
|
||||
#define RANDOM_REGISTER CP0[1]
|
||||
#define ENTRYLO0_REGISTER CP0[2]
|
||||
#define ENTRYLO1_REGISTER CP0[3]
|
||||
#define CONTEXT_REGISTER CP0[4]
|
||||
#define PAGE_MASK_REGISTER CP0[5]
|
||||
#define WIRED_REGISTER CP0[6]
|
||||
#define BAD_VADDR_REGISTER CP0[8]
|
||||
#define COUNT_REGISTER CP0[9]
|
||||
#define ENTRYHI_REGISTER CP0[10]
|
||||
#define COMPARE_REGISTER CP0[11]
|
||||
#define STATUS_REGISTER CP0[12]
|
||||
#define CAUSE_REGISTER CP0[13]
|
||||
#define EPC_REGISTER CP0[14]
|
||||
#define CONFIG_REGISTER CP0[16]
|
||||
#define TAGLO_REGISTER CP0[28]
|
||||
#define TAGHI_REGISTER CP0[29]
|
||||
#define ERROREPC_REGISTER CP0[30]
|
||||
#define FAKE_CAUSE_REGISTER CP0[32]
|
||||
|
||||
#define INDEX_REGISTER _CP0[0]
|
||||
#define RANDOM_REGISTER _CP0[1]
|
||||
#define ENTRYLO0_REGISTER _CP0[2]
|
||||
#define ENTRYLO1_REGISTER _CP0[3]
|
||||
#define CONTEXT_REGISTER _CP0[4]
|
||||
#define PAGE_MASK_REGISTER _CP0[5]
|
||||
#define WIRED_REGISTER _CP0[6]
|
||||
#define BAD_VADDR_REGISTER _CP0[8]
|
||||
#define COUNT_REGISTER _CP0[9]
|
||||
#define ENTRYHI_REGISTER _CP0[10]
|
||||
#define COMPARE_REGISTER _CP0[11]
|
||||
#define STATUS_REGISTER _CP0[12]
|
||||
#define CAUSE_REGISTER _CP0[13]
|
||||
#define EPC_REGISTER _CP0[14]
|
||||
#define CONFIG_REGISTER _CP0[16]
|
||||
#define TAGLO_REGISTER _CP0[28]
|
||||
#define TAGHI_REGISTER _CP0[29]
|
||||
#define ERROREPC_REGISTER _CP0[30]
|
||||
#define FAKE_CAUSE_REGISTER _CP0[32]
|
||||
|
||||
#define COMPARE_REGISTER_NO 11
|
||||
#define STATUS_REGISTER_NO 12
|
||||
#define CAUSE_REGISTER_NO 13
|
||||
|
||||
#define REVISION_REGISTER FPCR[0]
|
||||
#define FSTATUS_REGISTER FPCR[31]
|
||||
#define REVISION_REGISTER _FPCR[0]
|
||||
#define FSTATUS_REGISTER _FPCR[31]
|
||||
|
||||
#define GPR_S0 GPR[16]
|
||||
#define GPR_S1 GPR[17]
|
||||
#define GPR_S2 GPR[18]
|
||||
#define GPR_S3 GPR[19]
|
||||
#define GPR_S4 GPR[20]
|
||||
#define GPR_S5 GPR[21]
|
||||
#define GPR_S6 GPR[22]
|
||||
#define GPR_S7 GPR[23]
|
||||
#define GPR_SP GPR[29]
|
||||
#define GPR_RA GPR[31]
|
||||
#define GPR_S0 _GPR[16]
|
||||
#define GPR_S1 _GPR[17]
|
||||
#define GPR_S2 _GPR[18]
|
||||
#define GPR_S3 _GPR[19]
|
||||
#define GPR_S4 _GPR[20]
|
||||
#define GPR_S5 _GPR[21]
|
||||
#define GPR_S6 _GPR[22]
|
||||
#define GPR_S7 _GPR[23]
|
||||
#define GPR_SP _GPR[29]
|
||||
#define GPR_RA _GPR[31]
|
||||
|
||||
#define RDRAM_CONFIG_REG RegRDRAM[0]
|
||||
#define RDRAM_DEVICE_TYPE_REG RegRDRAM[0]
|
||||
#define RDRAM_DEVICE_ID_REG RegRDRAM[1]
|
||||
#define RDRAM_DELAY_REG RegRDRAM[2]
|
||||
#define RDRAM_MODE_REG RegRDRAM[3]
|
||||
#define RDRAM_REF_INTERVAL_REG RegRDRAM[4]
|
||||
#define RDRAM_REF_ROW_REG RegRDRAM[5]
|
||||
#define RDRAM_RAS_INTERVAL_REG RegRDRAM[6]
|
||||
#define RDRAM_MIN_INTERVAL_REG RegRDRAM[7]
|
||||
#define RDRAM_ADDR_SELECT_REG RegRDRAM[8]
|
||||
#define RDRAM_DEVICE_MANUF_REG RegRDRAM[9]
|
||||
#define RDRAM_CONFIG_REG _RegRDRAM[0]
|
||||
#define RDRAM_DEVICE_TYPE_REG _RegRDRAM[0]
|
||||
#define RDRAM_DEVICE_ID_REG _RegRDRAM[1]
|
||||
#define RDRAM_DELAY_REG _RegRDRAM[2]
|
||||
#define RDRAM_MODE_REG _RegRDRAM[3]
|
||||
#define RDRAM_REF_INTERVAL_REG _RegRDRAM[4]
|
||||
#define RDRAM_REF_ROW_REG _RegRDRAM[5]
|
||||
#define RDRAM_RAS_INTERVAL_REG _RegRDRAM[6]
|
||||
#define RDRAM_MIN_INTERVAL_REG _RegRDRAM[7]
|
||||
#define RDRAM_ADDR_SELECT_REG _RegRDRAM[8]
|
||||
#define RDRAM_DEVICE_MANUF_REG _RegRDRAM[9]
|
||||
|
||||
#define SP_MEM_ADDR_REG RegSP[0]
|
||||
#define SP_DRAM_ADDR_REG RegSP[1]
|
||||
#define SP_RD_LEN_REG RegSP[2]
|
||||
#define SP_WR_LEN_REG RegSP[3]
|
||||
#define SP_STATUS_REG RegSP[4]
|
||||
#define SP_DMA_FULL_REG RegSP[5]
|
||||
#define SP_DMA_BUSY_REG RegSP[6]
|
||||
#define SP_SEMAPHORE_REG RegSP[7]
|
||||
#define SP_PC_REG RegSP[8]
|
||||
#define SP_IBIST_REG RegSP[9]
|
||||
#define SP_MEM_ADDR_REG _RegSP[0]
|
||||
#define SP_DRAM_ADDR_REG _RegSP[1]
|
||||
#define SP_RD_LEN_REG _RegSP[2]
|
||||
#define SP_WR_LEN_REG _RegSP[3]
|
||||
#define SP_STATUS_REG _RegSP[4]
|
||||
#define SP_DMA_FULL_REG _RegSP[5]
|
||||
#define SP_DMA_BUSY_REG _RegSP[6]
|
||||
#define SP_SEMAPHORE_REG _RegSP[7]
|
||||
#define SP_PC_REG _RegSP[8]
|
||||
#define SP_IBIST_REG _RegSP[9]
|
||||
|
||||
#define DPC_START_REG RegDPC[0]
|
||||
#define DPC_END_REG RegDPC[1]
|
||||
#define DPC_CURRENT_REG RegDPC[2]
|
||||
#define DPC_STATUS_REG RegDPC[3]
|
||||
#define DPC_CLOCK_REG RegDPC[4]
|
||||
#define DPC_BUFBUSY_REG RegDPC[5]
|
||||
#define DPC_PIPEBUSY_REG RegDPC[6]
|
||||
#define DPC_TMEM_REG RegDPC[7]
|
||||
#define DPC_START_REG _RegDPC[0]
|
||||
#define DPC_END_REG _RegDPC[1]
|
||||
#define DPC_CURRENT_REG _RegDPC[2]
|
||||
#define DPC_STATUS_REG _RegDPC[3]
|
||||
#define DPC_CLOCK_REG _RegDPC[4]
|
||||
#define DPC_BUFBUSY_REG _RegDPC[5]
|
||||
#define DPC_PIPEBUSY_REG _RegDPC[6]
|
||||
#define DPC_TMEM_REG _RegDPC[7]
|
||||
|
||||
#define MI_INIT_MODE_REG RegMI[0]
|
||||
#define MI_MODE_REG RegMI[0]
|
||||
#define MI_VERSION_REG RegMI[1]
|
||||
#define MI_NOOP_REG RegMI[1]
|
||||
#define MI_INTR_REG RegMI[2]
|
||||
#define MI_INTR_MASK_REG RegMI[3]
|
||||
#define MI_INIT_MODE_REG _RegMI[0]
|
||||
#define MI_MODE_REG _RegMI[0]
|
||||
#define MI_VERSION_REG _RegMI[1]
|
||||
#define MI_NOOP_REG _RegMI[1]
|
||||
#define MI_INTR_REG _RegMI[2]
|
||||
#define MI_INTR_MASK_REG _RegMI[3]
|
||||
|
||||
#define VI_STATUS_REG RegVI[0]
|
||||
#define VI_CONTROL_REG RegVI[0]
|
||||
#define VI_ORIGIN_REG RegVI[1]
|
||||
#define VI_DRAM_ADDR_REG RegVI[1]
|
||||
#define VI_WIDTH_REG RegVI[2]
|
||||
#define VI_H_WIDTH_REG RegVI[2]
|
||||
#define VI_INTR_REG RegVI[3]
|
||||
#define VI_V_INTR_REG RegVI[3]
|
||||
#define VI_CURRENT_REG RegVI[4]
|
||||
#define VI_V_CURRENT_LINE_REG RegVI[4]
|
||||
#define VI_BURST_REG RegVI[5]
|
||||
#define VI_TIMING_REG RegVI[5]
|
||||
#define VI_V_SYNC_REG RegVI[6]
|
||||
#define VI_H_SYNC_REG RegVI[7]
|
||||
#define VI_LEAP_REG RegVI[8]
|
||||
#define VI_H_SYNC_LEAP_REG RegVI[8]
|
||||
#define VI_H_START_REG RegVI[9]
|
||||
#define VI_H_VIDEO_REG RegVI[9]
|
||||
#define VI_V_START_REG RegVI[10]
|
||||
#define VI_V_VIDEO_REG RegVI[10]
|
||||
#define VI_V_BURST_REG RegVI[11]
|
||||
#define VI_X_SCALE_REG RegVI[12]
|
||||
#define VI_Y_SCALE_REG RegVI[13]
|
||||
#define VI_STATUS_REG _RegVI[0]
|
||||
#define VI_CONTROL_REG _RegVI[0]
|
||||
#define VI_ORIGIN_REG _RegVI[1]
|
||||
#define VI_DRAM_ADDR_REG _RegVI[1]
|
||||
#define VI_WIDTH_REG _RegVI[2]
|
||||
#define VI_H_WIDTH_REG _RegVI[2]
|
||||
#define VI_INTR_REG _RegVI[3]
|
||||
#define VI_V_INTR_REG _RegVI[3]
|
||||
#define VI_CURRENT_REG _RegVI[4]
|
||||
#define VI_V_CURRENT_LINE_REG _RegVI[4]
|
||||
#define VI_BURST_REG _RegVI[5]
|
||||
#define VI_TIMING_REG _RegVI[5]
|
||||
#define VI_V_SYNC_REG _RegVI[6]
|
||||
#define VI_H_SYNC_REG _RegVI[7]
|
||||
#define VI_LEAP_REG _RegVI[8]
|
||||
#define VI_H_SYNC_LEAP_REG _RegVI[8]
|
||||
#define VI_H_START_REG _RegVI[9]
|
||||
#define VI_H_VIDEO_REG _RegVI[9]
|
||||
#define VI_V_START_REG _RegVI[10]
|
||||
#define VI_V_VIDEO_REG _RegVI[10]
|
||||
#define VI_V_BURST_REG _RegVI[11]
|
||||
#define VI_X_SCALE_REG _RegVI[12]
|
||||
#define VI_Y_SCALE_REG _RegVI[13]
|
||||
|
||||
#define AI_DRAM_ADDR_REG RegAI[0]
|
||||
#define AI_LEN_REG RegAI[1]
|
||||
#define AI_CONTROL_REG RegAI[2]
|
||||
#define AI_STATUS_REG RegAI[3]
|
||||
#define AI_DACRATE_REG RegAI[4]
|
||||
#define AI_BITRATE_REG RegAI[5]
|
||||
#define AI_DRAM_ADDR_REG _RegAI[0]
|
||||
#define AI_LEN_REG _RegAI[1]
|
||||
#define AI_CONTROL_REG _RegAI[2]
|
||||
#define AI_STATUS_REG _RegAI[3]
|
||||
#define AI_DACRATE_REG _RegAI[4]
|
||||
#define AI_BITRATE_REG _RegAI[5]
|
||||
|
||||
#define PI_DRAM_ADDR_REG RegPI[0]
|
||||
#define PI_CART_ADDR_REG RegPI[1]
|
||||
#define PI_RD_LEN_REG RegPI[2]
|
||||
#define PI_WR_LEN_REG RegPI[3]
|
||||
#define PI_STATUS_REG RegPI[4]
|
||||
#define PI_BSD_DOM1_LAT_REG RegPI[5]
|
||||
#define PI_DOMAIN1_REG RegPI[5]
|
||||
#define PI_BSD_DOM1_PWD_REG RegPI[6]
|
||||
#define PI_BSD_DOM1_PGS_REG RegPI[7]
|
||||
#define PI_BSD_DOM1_RLS_REG RegPI[8]
|
||||
#define PI_BSD_DOM2_LAT_REG RegPI[9]
|
||||
#define PI_DOMAIN2_REG RegPI[9]
|
||||
#define PI_BSD_DOM2_PWD_REG RegPI[10]
|
||||
#define PI_BSD_DOM2_PGS_REG RegPI[11]
|
||||
#define PI_BSD_DOM2_RLS_REG RegPI[12]
|
||||
#define PI_DRAM_ADDR_REG _RegPI[0]
|
||||
#define PI_CART_ADDR_REG _RegPI[1]
|
||||
#define PI_RD_LEN_REG _RegPI[2]
|
||||
#define PI_WR_LEN_REG _RegPI[3]
|
||||
#define PI_STATUS_REG _RegPI[4]
|
||||
#define PI_BSD_DOM1_LAT_REG _RegPI[5]
|
||||
#define PI_DOMAIN1_REG _RegPI[5]
|
||||
#define PI_BSD_DOM1_PWD_REG _RegPI[6]
|
||||
#define PI_BSD_DOM1_PGS_REG _RegPI[7]
|
||||
#define PI_BSD_DOM1_RLS_REG _RegPI[8]
|
||||
#define PI_BSD_DOM2_LAT_REG _RegPI[9]
|
||||
#define PI_DOMAIN2_REG _RegPI[9]
|
||||
#define PI_BSD_DOM2_PWD_REG _RegPI[10]
|
||||
#define PI_BSD_DOM2_PGS_REG _RegPI[11]
|
||||
#define PI_BSD_DOM2_RLS_REG _RegPI[12]
|
||||
|
||||
#define RI_MODE_REG RegRI[0]
|
||||
#define RI_CONFIG_REG RegRI[1]
|
||||
#define RI_CURRENT_LOAD_REG RegRI[2]
|
||||
#define RI_SELECT_REG RegRI[3]
|
||||
#define RI_COUNT_REG RegRI[4]
|
||||
#define RI_REFRESH_REG RegRI[4]
|
||||
#define RI_LATENCY_REG RegRI[5]
|
||||
#define RI_RERROR_REG RegRI[6]
|
||||
#define RI_WERROR_REG RegRI[7]
|
||||
#define RI_MODE_REG _RegRI[0]
|
||||
#define RI_CONFIG_REG _RegRI[1]
|
||||
#define RI_CURRENT_LOAD_REG _RegRI[2]
|
||||
#define RI_SELECT_REG _RegRI[3]
|
||||
#define RI_COUNT_REG _RegRI[4]
|
||||
#define RI_REFRESH_REG _RegRI[4]
|
||||
#define RI_LATENCY_REG _RegRI[5]
|
||||
#define RI_RERROR_REG _RegRI[6]
|
||||
#define RI_WERROR_REG _RegRI[7]
|
||||
|
||||
#define SI_DRAM_ADDR_REG RegSI[0]
|
||||
#define SI_PIF_ADDR_RD64B_REG RegSI[1]
|
||||
#define SI_PIF_ADDR_WR64B_REG RegSI[2]
|
||||
#define SI_STATUS_REG RegSI[3]
|
||||
#define SI_DRAM_ADDR_REG _RegSI[0]
|
||||
#define SI_PIF_ADDR_RD64B_REG _RegSI[1]
|
||||
#define SI_PIF_ADDR_WR64B_REG _RegSI[2]
|
||||
#define SI_STATUS_REG _RegSI[3]
|
||||
|
||||
#define STATUS_IE 0x00000001
|
||||
#define STATUS_EXL 0x00000002
|
||||
#define STATUS_ERL 0x00000004
|
||||
#define STATUS_IP0 0x00000100
|
||||
#define STATUS_IP1 0x00000200
|
||||
#define STATUS_IP2 0x00000400
|
||||
#define STATUS_IP3 0x00000800
|
||||
#define STATUS_IP4 0x00001000
|
||||
#define STATUS_IP5 0x00002000
|
||||
#define STATUS_IP6 0x00004000
|
||||
#define STATUS_IP7 0x00008000
|
||||
#define STATUS_BEV 0x00400000
|
||||
#define STATUS_FR 0x04000000
|
||||
#define STATUS_CU0 0x10000000
|
||||
#define STATUS_CU1 0x20000000
|
||||
enum
|
||||
{
|
||||
|
||||
#define CAUSE_EXC_CODE 0xFF
|
||||
#define CAUSE_IP0 0x100
|
||||
#define CAUSE_IP1 0x200
|
||||
#define CAUSE_IP2 0x400
|
||||
#define CAUSE_IP3 0x800
|
||||
#define CAUSE_IP4 0x1000
|
||||
#define CAUSE_IP5 0x2000
|
||||
#define CAUSE_IP6 0x4000
|
||||
#define CAUSE_IP7 0x8000
|
||||
#define CAUSE_BD 0x80000000
|
||||
MI_MODE_INIT = 0x0080, /* Bit 7: init mode */
|
||||
MI_MODE_EBUS = 0x0100, /* Bit 8: ebus test mode */
|
||||
MI_MODE_RDRAM = 0x0200, /* Bit 9: RDRAM reg mode */
|
||||
|
||||
#define SP_CLR_HALT 0x00001 /* Bit 0: clear halt */
|
||||
#define SP_SET_HALT 0x00002 /* Bit 1: set halt */
|
||||
#define SP_CLR_BROKE 0x00004 /* Bit 2: clear broke */
|
||||
#define SP_CLR_INTR 0x00008 /* Bit 3: clear intr */
|
||||
#define SP_SET_INTR 0x00010 /* Bit 4: set intr */
|
||||
#define SP_CLR_SSTEP 0x00020 /* Bit 5: clear sstep */
|
||||
#define SP_SET_SSTEP 0x00040 /* Bit 6: set sstep */
|
||||
#define SP_CLR_INTR_BREAK 0x00080 /* Bit 7: clear intr on break */
|
||||
#define SP_SET_INTR_BREAK 0x00100 /* Bit 8: set intr on break */
|
||||
#define SP_CLR_SIG0 0x00200 /* Bit 9: clear signal 0 */
|
||||
#define SP_SET_SIG0 0x00400 /* Bit 10: set signal 0 */
|
||||
#define SP_CLR_SIG1 0x00800 /* Bit 11: clear signal 1 */
|
||||
#define SP_SET_SIG1 0x01000 /* Bit 12: set signal 1 */
|
||||
#define SP_CLR_SIG2 0x02000 /* Bit 13: clear signal 2 */
|
||||
#define SP_SET_SIG2 0x04000 /* Bit 14: set signal 2 */
|
||||
#define SP_CLR_SIG3 0x08000 /* Bit 15: clear signal 3 */
|
||||
#define SP_SET_SIG3 0x10000 /* Bit 16: set signal 3 */
|
||||
#define SP_CLR_SIG4 0x20000 /* Bit 17: clear signal 4 */
|
||||
#define SP_SET_SIG4 0x40000 /* Bit 18: set signal 4 */
|
||||
#define SP_CLR_SIG5 0x80000 /* Bit 19: clear signal 5 */
|
||||
#define SP_SET_SIG5 0x100000 /* Bit 20: set signal 5 */
|
||||
#define SP_CLR_SIG6 0x200000 /* Bit 21: clear signal 6 */
|
||||
#define SP_SET_SIG6 0x400000 /* Bit 22: set signal 6 */
|
||||
#define SP_CLR_SIG7 0x800000 /* Bit 23: clear signal 7 */
|
||||
#define SP_SET_SIG7 0x1000000 /* Bit 24: set signal 7 */
|
||||
};
|
||||
|
||||
#define SP_STATUS_HALT 0x001 /* Bit 0: halt */
|
||||
#define SP_STATUS_BROKE 0x002 /* Bit 1: broke */
|
||||
#define SP_STATUS_DMA_BUSY 0x004 /* Bit 2: dma busy */
|
||||
#define SP_STATUS_DMA_FULL 0x008 /* Bit 3: dma full */
|
||||
#define SP_STATUS_IO_FULL 0x010 /* Bit 4: io full */
|
||||
#define SP_STATUS_SSTEP 0x020 /* Bit 5: single step */
|
||||
#define SP_STATUS_INTR_BREAK 0x040 /* Bit 6: interrupt on break */
|
||||
#define SP_STATUS_SIG0 0x080 /* Bit 7: signal 0 set */
|
||||
#define SP_STATUS_SIG1 0x100 /* Bit 8: signal 1 set */
|
||||
#define SP_STATUS_SIG2 0x200 /* Bit 9: signal 2 set */
|
||||
#define SP_STATUS_SIG3 0x400 /* Bit 10: signal 3 set */
|
||||
#define SP_STATUS_SIG4 0x800 /* Bit 11: signal 4 set */
|
||||
#define SP_STATUS_SIG5 0x1000 /* Bit 12: signal 5 set */
|
||||
#define SP_STATUS_SIG6 0x2000 /* Bit 13: signal 6 set */
|
||||
#define SP_STATUS_SIG7 0x4000 /* Bit 14: signal 7 set */
|
||||
|
||||
#define DPC_CLR_XBUS_DMEM_DMA 0x0001 /* Bit 0: clear xbus_dmem_dma */
|
||||
#define DPC_SET_XBUS_DMEM_DMA 0x0002 /* Bit 1: set xbus_dmem_dma */
|
||||
#define DPC_CLR_FREEZE 0x0004 /* Bit 2: clear freeze */
|
||||
#define DPC_SET_FREEZE 0x0008 /* Bit 3: set freeze */
|
||||
#define DPC_CLR_FLUSH 0x0010 /* Bit 4: clear flush */
|
||||
#define DPC_SET_FLUSH 0x0020 /* Bit 5: set flush */
|
||||
#define DPC_CLR_TMEM_CTR 0x0040 /* Bit 6: clear tmem ctr */
|
||||
#define DPC_CLR_PIPE_CTR 0x0080 /* Bit 7: clear pipe ctr */
|
||||
#define DPC_CLR_CMD_CTR 0x0100 /* Bit 8: clear cmd ctr */
|
||||
#define DPC_CLR_CLOCK_CTR 0x0200 /* Bit 9: clear clock ctr */
|
||||
|
||||
#define DPC_STATUS_XBUS_DMEM_DMA 0x001 /* Bit 0: xbus_dmem_dma */
|
||||
#define DPC_STATUS_FREEZE 0x002 /* Bit 1: freeze */
|
||||
#define DPC_STATUS_FLUSH 0x004 /* Bit 2: flush */
|
||||
#define DPC_STATUS_START_GCLK 0x008 /* Bit 3: start gclk */
|
||||
#define DPC_STATUS_TMEM_BUSY 0x010 /* Bit 4: tmem busy */
|
||||
#define DPC_STATUS_PIPE_BUSY 0x020 /* Bit 5: pipe busy */
|
||||
#define DPC_STATUS_CMD_BUSY 0x040 /* Bit 6: cmd busy */
|
||||
#define DPC_STATUS_CBUF_READY 0x080 /* Bit 7: cbuf ready */
|
||||
#define DPC_STATUS_DMA_BUSY 0x100 /* Bit 8: dma busy */
|
||||
#define DPC_STATUS_END_VALID 0x200 /* Bit 9: end valid */
|
||||
#define DPC_STATUS_START_VALID 0x400 /* Bit 10: start valid */
|
||||
|
||||
#define MI_CLR_INIT 0x0080 /* Bit 7: clear init mode */
|
||||
#define MI_SET_INIT 0x0100 /* Bit 8: set init mode */
|
||||
#define MI_CLR_EBUS 0x0200 /* Bit 9: clear ebus test */
|
||||
#define MI_SET_EBUS 0x0400 /* Bit 10: set ebus test mode */
|
||||
#define MI_CLR_DP_INTR 0x0800 /* Bit 11: clear dp interrupt */
|
||||
#define MI_CLR_RDRAM 0x1000 /* Bit 12: clear RDRAM reg */
|
||||
#define MI_SET_RDRAM 0x2000 /* Bit 13: set RDRAM reg mode */
|
||||
|
||||
#define MI_MODE_INIT 0x0080 /* Bit 7: init mode */
|
||||
#define MI_MODE_EBUS 0x0100 /* Bit 8: ebus test mode */
|
||||
#define MI_MODE_RDRAM 0x0200 /* Bit 9: RDRAM reg mode */
|
||||
|
||||
#define MI_INTR_MASK_CLR_SP 0x0001 /* Bit 0: clear SP mask */
|
||||
#define MI_INTR_MASK_SET_SP 0x0002 /* Bit 1: set SP mask */
|
||||
#define MI_INTR_MASK_CLR_SI 0x0004 /* Bit 2: clear SI mask */
|
||||
#define MI_INTR_MASK_SET_SI 0x0008 /* Bit 3: set SI mask */
|
||||
#define MI_INTR_MASK_CLR_AI 0x0010 /* Bit 4: clear AI mask */
|
||||
#define MI_INTR_MASK_SET_AI 0x0020 /* Bit 5: set AI mask */
|
||||
#define MI_INTR_MASK_CLR_VI 0x0040 /* Bit 6: clear VI mask */
|
||||
#define MI_INTR_MASK_SET_VI 0x0080 /* Bit 7: set VI mask */
|
||||
#define MI_INTR_MASK_CLR_PI 0x0100 /* Bit 8: clear PI mask */
|
||||
#define MI_INTR_MASK_SET_PI 0x0200 /* Bit 9: set PI mask */
|
||||
#define MI_INTR_MASK_CLR_DP 0x0400 /* Bit 10: clear DP mask */
|
||||
#define MI_INTR_MASK_SET_DP 0x0800 /* Bit 11: set DP mask */
|
||||
|
||||
#define MI_INTR_MASK_SP 0x01 /* Bit 0: SP intr mask */
|
||||
#define MI_INTR_MASK_SI 0x02 /* Bit 1: SI intr mask */
|
||||
#define MI_INTR_MASK_AI 0x04 /* Bit 2: AI intr mask */
|
||||
#define MI_INTR_MASK_VI 0x08 /* Bit 3: VI intr mask */
|
||||
#define MI_INTR_MASK_PI 0x10 /* Bit 4: PI intr mask */
|
||||
#define MI_INTR_MASK_DP 0x20 /* Bit 5: DP intr mask */
|
||||
|
||||
#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
|
||||
#define MI_INTR_SI 0x02 /* Bit 1: SI intr */
|
||||
#define MI_INTR_AI 0x04 /* Bit 2: AI intr */
|
||||
#define MI_INTR_VI 0x08 /* Bit 3: VI intr */
|
||||
#define MI_INTR_PI 0x10 /* Bit 4: PI intr */
|
||||
#define MI_INTR_DP 0x20 /* Bit 5: DP intr */
|
||||
|
||||
#define PI_STATUS_DMA_BUSY 0x01
|
||||
#define PI_STATUS_IO_BUSY 0x02
|
||||
#define PI_STATUS_ERROR 0x04
|
||||
|
||||
#define PI_SET_RESET 0x01
|
||||
#define PI_CLR_INTR 0x02
|
||||
|
||||
#define SI_STATUS_DMA_BUSY 0x0001
|
||||
#define SI_STATUS_RD_BUSY 0x0002
|
||||
#define SI_STATUS_DMA_ERROR 0x0008
|
||||
#define SI_STATUS_INTERRUPT 0x1000
|
||||
|
||||
#define FPCSR_FS 0x01000000 /* flush denorm to zero */
|
||||
#define FPCSR_C 0x00800000 /* condition bit */
|
||||
#define FPCSR_CE 0x00020000 /* cause: unimplemented operation */
|
||||
#define FPCSR_CV 0x00010000 /* cause: invalid operation */
|
||||
#define FPCSR_CZ 0x00008000 /* cause: division by zero */
|
||||
#define FPCSR_CO 0x00004000 /* cause: overflow */
|
||||
#define FPCSR_CU 0x00002000 /* cause: underflow */
|
||||
#define FPCSR_CI 0x00001000 /* cause: inexact operation */
|
||||
#define FPCSR_EV 0x00000800 /* enable: invalid operation */
|
||||
#define FPCSR_EZ 0x00000400 /* enable: division by zero */
|
||||
#define FPCSR_EO 0x00000200 /* enable: overflow */
|
||||
#define FPCSR_EU 0x00000100 /* enable: underflow */
|
||||
#define FPCSR_EI 0x00000080 /* enable: inexact operation */
|
||||
#define FPCSR_FV 0x00000040 /* flag: invalid operation */
|
||||
#define FPCSR_FZ 0x00000020 /* flag: division by zero */
|
||||
#define FPCSR_FO 0x00000010 /* flag: overflow */
|
||||
#define FPCSR_FU 0x00000008 /* flag: underflow */
|
||||
#define FPCSR_FI 0x00000004 /* flag: inexact operation */
|
||||
#define FPCSR_RM_MASK 0x00000003 /* rounding mode mask */
|
||||
#define FPCSR_RM_RN 0x00000000 /* round to nearest */
|
||||
#define FPCSR_RM_RZ 0x00000001 /* round to zero */
|
||||
#define FPCSR_RM_RP 0x00000002 /* round to positive infinity */
|
||||
#define FPCSR_RM_RM 0x00000003 /* round to negative infinity */
|
||||
|
||||
#define FPR_Type(Reg) (Reg) == R4300i_COP1_S ? "S" : (Reg) == R4300i_COP1_D ? "D" :\
|
||||
(Reg) == R4300i_COP1_W ? "W" : "L"
|
||||
|
|
|
@ -57,7 +57,7 @@ BOOL LoadSram (void) {
|
|||
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &lpMsgBuf,0,NULL
|
||||
);
|
||||
DisplayError(lpMsgBuf);
|
||||
DisplayError((const char *)lpMsgBuf);
|
||||
LocalFree( lpMsgBuf );
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ BOOL LoadSram (void) {
|
|||
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &lpMsgBuf,0,NULL
|
||||
);
|
||||
DisplayError(lpMsgBuf);
|
||||
DisplayError((const char *)lpMsgBuf);
|
||||
LocalFree( lpMsgBuf );
|
||||
return FALSE;
|
||||
}
|
|
@ -45,9 +45,11 @@ N64_REGISTERS SyncRegisters;
|
|||
int MemAddrUsedCount[2];
|
||||
BYTE * SyncMemory;
|
||||
|
||||
#ifdef toremove
|
||||
//TLB
|
||||
//FASTTLB SyncFastTlb[64];
|
||||
//TLB SyncTlb[32];
|
||||
#endif
|
||||
|
||||
int Sync_MemoryFilter( DWORD dwExptCode, LPEXCEPTION_POINTERS lpEP);
|
||||
|
||||
|
@ -339,7 +341,8 @@ void StopErrorLog (void) {
|
|||
}
|
||||
|
||||
void SwitchSyncRegisters (void) {
|
||||
#ifdef hhh
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
FASTTLB TempFastTlb[64];
|
||||
TLB Temptlb[32];
|
||||
BYTE * TempMemPtr;
|
||||
|
|
|
@ -490,7 +490,7 @@ void CompX86RegToX86Reg(int Destination, int Source) {
|
|||
PUTDST16(RecompPos,x86Command);
|
||||
}
|
||||
|
||||
void DecX86reg(x86Reg) {
|
||||
void DecX86reg(int x86Reg) {
|
||||
CPU_Message(" dec %s",x86_Name(x86Reg));
|
||||
switch (x86Reg) {
|
||||
case x86_EAX: PUTDST16(RecompPos,0xC8FF); break;
|
||||
|
@ -796,7 +796,7 @@ void LeaRegReg(int x86RegDest, int x86RegSrc, int multiplier) {
|
|||
PUTDST32(RecompPos,0x00000000);
|
||||
}
|
||||
|
||||
void LeaSourceAndOffset(x86DestReg, x86SourceReg, offset) {
|
||||
void LeaSourceAndOffset(int x86DestReg, int x86SourceReg, int offset) {
|
||||
WORD x86Command;
|
||||
|
||||
CPU_Message(" lea %s, [%s + %0Xh]",x86_Name(x86DestReg),x86_Name(x86SourceReg),offset);
|
||||
|
@ -873,7 +873,7 @@ void MoveConstByteToN64Mem(BYTE Const, int AddrReg) {
|
|||
default:
|
||||
DisplayError("MoveConstByteToN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
PUTDST8(RecompPos,Const);
|
||||
}
|
||||
|
||||
|
@ -899,7 +899,7 @@ void MoveConstHalfToN64Mem(WORD Const, int AddrReg) {
|
|||
default:
|
||||
DisplayError("MoveConstToN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
PUTDST16(RecompPos,Const);
|
||||
}
|
||||
|
||||
|
@ -978,7 +978,7 @@ void MoveConstToN64Mem(DWORD Const, int AddrReg) {
|
|||
default:
|
||||
DisplayError("MoveConstToN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
PUTDST32(RecompPos,Const);
|
||||
}
|
||||
|
||||
|
@ -996,7 +996,7 @@ void MoveConstToN64MemDisp (DWORD Const, int AddrReg, BYTE Disp) {
|
|||
default:
|
||||
DisplayError("MoveConstToN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM + Disp);
|
||||
PUTDST32(RecompPos,RDRAM + Disp);
|
||||
PUTDST32(RecompPos,Const);
|
||||
}
|
||||
|
||||
|
@ -1136,7 +1136,7 @@ void MoveN64MemDispToX86reg(int x86reg, int AddrReg, BYTE Disp) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM + Disp);
|
||||
PUTDST32(RecompPos,RDRAM + Disp);
|
||||
}
|
||||
|
||||
void MoveN64MemToX86reg(int x86reg, int AddrReg) {
|
||||
|
@ -1165,7 +1165,7 @@ void MoveN64MemToX86reg(int x86reg, int AddrReg) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveN64MemToX86regByte(int x86reg, int AddrReg) {
|
||||
|
@ -1195,7 +1195,7 @@ void MoveN64MemToX86regByte(int x86reg, int AddrReg) {
|
|||
break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveN64MemToX86regHalf(int x86reg, int AddrReg) {
|
||||
|
@ -1225,7 +1225,7 @@ void MoveN64MemToX86regHalf(int x86reg, int AddrReg) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveSxByteX86regPointerToX86reg(int AddrReg1, int AddrReg2, int x86reg) {
|
||||
|
@ -1347,7 +1347,7 @@ void MoveSxN64MemToX86regByte(int x86reg, int AddrReg) {
|
|||
}
|
||||
PUTDST8(RecompPos,0x0f);
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveSxN64MemToX86regHalf(int x86reg, int AddrReg) {
|
||||
|
@ -1378,7 +1378,7 @@ void MoveSxN64MemToX86regHalf(int x86reg, int AddrReg) {
|
|||
|
||||
PUTDST8(RecompPos, 0x0f);
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveSxVariableToX86regByte(void *Variable, const char * VariableName, int x86reg) {
|
||||
|
@ -1525,7 +1525,7 @@ void MoveX86regByteToN64Mem(int x86reg, int AddrReg) {
|
|||
case x86_EDX: x86Command += 0x9000; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveX86regByteToVariable(int x86reg, void * Variable, const char * VariableName) {
|
||||
|
@ -1611,7 +1611,7 @@ void MoveX86regHalfToN64Mem(int x86reg, int AddrReg) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveX86regHalfToVariable(int x86reg, void * Variable, const char * VariableName) {
|
||||
|
@ -1874,7 +1874,7 @@ void MoveX86regToN64Mem(int x86reg, int AddrReg) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveX86regToN64MemDisp(int x86reg, int AddrReg, BYTE Disp) {
|
||||
|
@ -1902,7 +1902,7 @@ void MoveX86regToN64MemDisp(int x86reg, int AddrReg, BYTE Disp) {
|
|||
case x86_EBP: x86Command += 0xA800; break;
|
||||
}
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM+Disp);
|
||||
PUTDST32(RecompPos,RDRAM+Disp);
|
||||
}
|
||||
|
||||
void MoveX86regToVariable(int x86reg, void * Variable, const char * VariableName) {
|
||||
|
@ -2119,7 +2119,7 @@ void MoveZxHalfX86regPointerToX86reg(int AddrReg1, int AddrReg2, int x86reg) {
|
|||
void MoveZxN64MemToX86regByte(int x86reg, int AddrReg) {
|
||||
WORD x86Command;
|
||||
|
||||
CPU_Message(" movzx %s, byte ptr [%s+N64MEM]",x86_Name(x86reg),x86_Name(AddrReg));
|
||||
CPU_Message(" movzx %s, byte ptr [%s+RDRAM]",x86_Name(x86reg),x86_Name(AddrReg));
|
||||
switch (AddrReg) {
|
||||
case x86_EAX: x86Command = 0x00B6; break;
|
||||
case x86_EBX: x86Command = 0x03B6; break;
|
||||
|
@ -2145,13 +2145,13 @@ void MoveZxN64MemToX86regByte(int x86reg, int AddrReg) {
|
|||
}
|
||||
PUTDST8(RecompPos,0x0f);
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveZxN64MemToX86regHalf(int x86reg, int AddrReg) {
|
||||
WORD x86Command;
|
||||
|
||||
CPU_Message(" movzx %s, word ptr [%s+N64MEM]",x86_Name(x86reg),x86_Name(AddrReg));
|
||||
CPU_Message(" movzx %s, word ptr [%s+RDRAM]",x86_Name(x86reg),x86_Name(AddrReg));
|
||||
|
||||
switch (AddrReg) {
|
||||
case x86_EAX: x86Command = 0x00B7; break;
|
||||
|
@ -2176,7 +2176,7 @@ void MoveZxN64MemToX86regHalf(int x86reg, int AddrReg) {
|
|||
|
||||
PUTDST8(RecompPos, 0x0f);
|
||||
PUTDST16(RecompPos,x86Command);
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void MoveZxVariableToX86regByte(void *Variable, const char * VariableName, int x86reg) {
|
|
@ -354,7 +354,7 @@ void fpuLoadDwordFromN64Mem(int * StackPos,int x86reg) {
|
|||
default:
|
||||
DisplayError("fpuLoadDwordFromN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void fpuLoadInt32bFromN64Mem(int * StackPos,int x86reg) {
|
||||
|
@ -371,7 +371,7 @@ void fpuLoadInt32bFromN64Mem(int * StackPos,int x86reg) {
|
|||
default:
|
||||
DisplayError("fpuLoadIntDwordFromN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void fpuLoadIntegerDword(int * StackPos,void *Variable, const char * VariableName) {
|
||||
|
@ -457,7 +457,7 @@ void fpuLoadQwordFromN64Mem(int * StackPos,int x86reg) {
|
|||
default:
|
||||
DisplayError("fpuLoadQwordFromN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void fpuLoadReg(int * StackPos,int Reg) {
|
||||
|
@ -619,7 +619,7 @@ void fpuStoreDwordToN64Mem(int * StackPos,int x86reg, BOOL Pop) {
|
|||
default:
|
||||
DisplayError("fpuStoreDwordToN64Mem\nUnknown x86 Register");
|
||||
}
|
||||
PUTDST32(RecompPos,N64MEM);
|
||||
PUTDST32(RecompPos,RDRAM);
|
||||
}
|
||||
|
||||
void fpuStoreIntegerDword(int * StackPos,void *Variable, const char * VariableName, BOOL pop) {
|
|
@ -9,8 +9,7 @@
|
|||
enum { WM_EDITCHEAT = WM_USER + 0x120 };
|
||||
enum { UM_CHANGECODEEXTENSION = WM_USER + 0x121 };
|
||||
|
||||
CCheats::CCheats (CN64Rom * const Rom, CNotification * const Notify ) :
|
||||
_Notify(Notify),
|
||||
CCheats::CCheats (CN64Rom * const Rom ) :
|
||||
_Rom(Rom),
|
||||
m_rcList(new RECT),
|
||||
m_rcAdd(new RECT),
|
||||
|
@ -192,20 +191,20 @@ void CCheats::ApplyGSButton (CMipsMemory * _MMU)
|
|||
switch (Code.Command & 0xFF000000) {
|
||||
case 0x88000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Store64(Address,Code.Value,_8Bit);
|
||||
_MMU->SB_VAddr(Address,Code.Value);
|
||||
break;
|
||||
case 0x89000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Store64(Address,Code.Value,_16Bit);
|
||||
_MMU->SH_VAddr(Address,Code.Value);
|
||||
break;
|
||||
// Xplorer64
|
||||
case 0xA8000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Store64(Address,ConvertXP64Value(Code.Value),_8Bit);
|
||||
_MMU->SB_VAddr(Address,ConvertXP64Value(Code.Value));
|
||||
break;
|
||||
case 0xA9000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Store64(Address,ConvertXP64Value(Code.Value),_16Bit);
|
||||
_MMU->SH_VAddr(Address,ConvertXP64Value(Code.Value));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -298,8 +297,9 @@ int CCheats::ApplyCheatEntry (CMipsMemory * _MMU, const CODES & CodeEntry, int C
|
|||
return 0;
|
||||
}
|
||||
const GAMESHARK_CODE & Code = CodeEntry[CurrentEntry];
|
||||
DWORD Address, dwMemory;
|
||||
WORD Memory;
|
||||
DWORD Address;
|
||||
WORD wMemory;
|
||||
BYTE bMemory;
|
||||
|
||||
switch (Code.Command & 0xFF000000) {
|
||||
// Gameshark / AR
|
||||
|
@ -320,21 +320,21 @@ int CCheats::ApplyCheatEntry (CMipsMemory * _MMU, const CODES & CodeEntry, int C
|
|||
case 0x10000000: // Xplorer64
|
||||
case 0x80000000:
|
||||
Address = 0x80000000 | (NextCodeEntry.Command & 0xFFFFFF);
|
||||
Memory = NextCodeEntry.Value;
|
||||
wMemory = NextCodeEntry.Value;
|
||||
for (count=0; count<numrepeats; count++) {
|
||||
_MMU->Store64(Address,Memory,_8Bit);
|
||||
_MMU->SB_VAddr(Address,wMemory);
|
||||
Address += offset;
|
||||
Memory += incr;
|
||||
wMemory += incr;
|
||||
}
|
||||
return 2;
|
||||
case 0x11000000: // Xplorer64
|
||||
case 0x81000000:
|
||||
Address = 0x80000000 | (NextCodeEntry.Command & 0xFFFFFF);
|
||||
Memory = NextCodeEntry.Value;
|
||||
wMemory = NextCodeEntry.Value;
|
||||
for (count=0; count<numrepeats; count++) {
|
||||
_MMU->Store64(Address,Memory,_16Bit);
|
||||
_MMU->SH_VAddr(Address,wMemory);
|
||||
Address += offset;
|
||||
Memory += incr;
|
||||
wMemory += incr;
|
||||
}
|
||||
return 2;
|
||||
default: return 1;
|
||||
|
@ -343,39 +343,39 @@ int CCheats::ApplyCheatEntry (CMipsMemory * _MMU, const CODES & CodeEntry, int C
|
|||
break;
|
||||
case 0x80000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_8Bit); }
|
||||
if (Execute) { _MMU->SB_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0x81000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_16Bit); }
|
||||
if (Execute) { _MMU->SH_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0xA0000000:
|
||||
Address = 0xA0000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_8Bit); }
|
||||
if (Execute) { _MMU->SB_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0xA1000000:
|
||||
Address = 0xA0000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_16Bit); }
|
||||
if (Execute) { _MMU->SH_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0xD0000000: // Added by Witten (witten@pj64cheats.net)
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_8Bit,false);
|
||||
if (dwMemory != Code.Value) { Execute = FALSE; }
|
||||
_MMU->LB_VAddr(Address,bMemory);
|
||||
if (bMemory != Code.Value) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xD1000000: // Added by Witten (witten@pj64cheats.net)
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_16Bit,false);
|
||||
if (dwMemory != Code.Value) { Execute = FALSE; }
|
||||
_MMU->LH_VAddr(Address,wMemory);
|
||||
if (wMemory != Code.Value) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xD2000000: // Added by Witten (witten@pj64cheats.net)
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_8Bit,false);
|
||||
if (dwMemory == Code.Value) { Execute = FALSE; }
|
||||
_MMU->LB_VAddr(Address,bMemory);
|
||||
if (bMemory == Code.Value) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xD3000000: // Added by Witten (witten@pj64cheats.net)
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_16Bit,false);
|
||||
if (dwMemory == Code.Value) { Execute = FALSE; }
|
||||
_MMU->LH_VAddr(Address,wMemory);
|
||||
if (wMemory == Code.Value) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
|
||||
// Xplorer64 (Author: Witten)
|
||||
|
@ -383,49 +383,49 @@ int CCheats::ApplyCheatEntry (CMipsMemory * _MMU, const CODES & CodeEntry, int C
|
|||
case 0x82000000:
|
||||
case 0x84000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_8Bit); }
|
||||
if (Execute) { _MMU->SB_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0x31000000:
|
||||
case 0x83000000:
|
||||
case 0x85000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_16Bit); }
|
||||
if (Execute) { _MMU->SH_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0xE8000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,(BYTE)ConvertXP64Value(Code.Value),_8Bit); }
|
||||
if (Execute) { _MMU->SB_VAddr(Address,(BYTE)ConvertXP64Value(Code.Value)); }
|
||||
break;
|
||||
case 0xE9000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,ConvertXP64Value(Code.Value),_16Bit); }
|
||||
if (Execute) { _MMU->SH_VAddr(Address,ConvertXP64Value(Code.Value)); }
|
||||
break;
|
||||
case 0xC8000000:
|
||||
Address = 0xA0000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,Code.Value,_8Bit); }
|
||||
if (Execute) { _MMU->SB_VAddr(Address,Code.Value); }
|
||||
break;
|
||||
case 0xC9000000:
|
||||
Address = 0xA0000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
if (Execute) { _MMU->Store64(Address,ConvertXP64Value(Code.Value),_16Bit); }
|
||||
if (Execute) { _MMU->SH_VAddr(Address,ConvertXP64Value(Code.Value)); }
|
||||
break;
|
||||
case 0xB8000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_8Bit,false);
|
||||
if (dwMemory != ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
_MMU->LB_VAddr(Address,bMemory);
|
||||
if (bMemory != ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xB9000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_16Bit,false);
|
||||
if (dwMemory != ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
_MMU->LH_VAddr(Address,wMemory);
|
||||
if (wMemory != ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xBA000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_8Bit,false);
|
||||
if (dwMemory == ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
_MMU->LB_VAddr(Address,bMemory);
|
||||
if (bMemory == ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0xBB000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->Load32(Address,dwMemory,_16Bit,false);
|
||||
if (dwMemory == ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
_MMU->LH_VAddr(Address,wMemory);
|
||||
if (wMemory == ConvertXP64Value(Code.Value)) { Execute = FALSE; }
|
||||
return ApplyCheatEntry(_MMU,CodeEntry,CurrentEntry + 1,Execute) + 1;
|
||||
case 0: return MaxGSEntries; break;
|
||||
}
|
||||
|
@ -744,7 +744,6 @@ int CALLBACK CCheats::CheatAddProc (WND_HANDLE hDlg,DWORD uMsg,DWORD wParam, DWO
|
|||
case IDC_ADD:
|
||||
{
|
||||
CCheats * _this = (CCheats *)GetProp((HWND)hDlg,"Class");
|
||||
CNotification * _Notify = _this->_Notify;
|
||||
|
||||
stdstr NewCheatName = GetDlgItemStr(hDlg,IDC_CODE_NAME);
|
||||
for (int count = 0; count < MaxCheats; count ++) {
|
||||
|
@ -811,7 +810,6 @@ int CALLBACK CCheats::CheatAddProc (WND_HANDLE hDlg,DWORD uMsg,DWORD wParam, DWO
|
|||
case WM_EDITCHEAT:
|
||||
{
|
||||
CCheats * _this = (CCheats *)GetProp((HWND)hDlg,"Class");
|
||||
CNotification * _Notify = _this->_Notify;
|
||||
_this->m_EditCheat = wParam;
|
||||
if (_this->m_EditCheat < 0)
|
||||
{
|
||||
|
|
|
@ -9,7 +9,6 @@ class CCheats {
|
|||
|
||||
enum { MaxCheats = 50000 };
|
||||
|
||||
CNotification * const _Notify;
|
||||
CN64Rom * const _Rom;
|
||||
|
||||
static int CALLBACK CheatAddProc ( WND_HANDLE hDlg,DWORD uMsg,DWORD wParam, DWORD lParam );
|
||||
|
@ -67,7 +66,7 @@ class CCheats {
|
|||
static stdstr GetDlgItemStr (WND_HANDLE hDlg, int nIDDlgItem);
|
||||
|
||||
public:
|
||||
CCheats (CN64Rom * const Rom, CNotification * const Notify );
|
||||
CCheats (CN64Rom * const Rom = NULL);
|
||||
~CCheats ( void );
|
||||
|
||||
bool IsCheatMessage ( MSG * msg );
|
||||
|
|
|
@ -3,7 +3,6 @@ class CDebugDialog :
|
|||
public CDialogImpl<T>
|
||||
{
|
||||
protected:
|
||||
CMipsMemory * m_MMU;
|
||||
CDebugger * m_Debugger;
|
||||
HANDLE m_CreatedEvent;
|
||||
HANDLE m_DialogThread;
|
||||
|
@ -21,8 +20,7 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
CDebugDialog (CMipsMemory * MMU, CDebugger * debugger) :
|
||||
m_MMU(MMU),
|
||||
CDebugDialog (CDebugger * debugger) :
|
||||
m_Debugger(debugger),
|
||||
m_CreatedEvent(CreateEvent(NULL,true,false,NULL)),
|
||||
m_DialogThread(NULL)
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
#include "Debugger UI.h"
|
||||
|
||||
CDumpMemory::CDumpMemory(CN64System * System, CMipsMemory * MMU, CDebugger * debugger) :
|
||||
CDebugDialog<CDumpMemory>(MMU,debugger),
|
||||
m_System(System)
|
||||
CDumpMemory::CDumpMemory(CDebugger * debugger) :
|
||||
CDebugDialog<CDumpMemory>(debugger)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -54,7 +53,7 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b
|
|||
openfilename.lpstrInitialDir = Directory;
|
||||
openfilename.nMaxFile = MAX_PATH;
|
||||
openfilename.Flags = OFN_HIDEREADONLY;
|
||||
m_System->ExternalEvent(PauseCPU_DumpMemory);
|
||||
_N64System->ExternalEvent(PauseCPU_DumpMemory);
|
||||
if (GetOpenFileName (&openfilename))
|
||||
{
|
||||
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
|
||||
|
@ -65,7 +64,7 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b
|
|||
}
|
||||
SetDlgItemText(IDC_FILENAME,FileName);
|
||||
}
|
||||
m_System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
_N64System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
}
|
||||
break;
|
||||
case IDOK:
|
||||
|
@ -85,7 +84,7 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b
|
|||
}
|
||||
if (SendDlgItemMessage(IDC_USE_ALT_PC,BM_GETSTATE, 0,0) != BST_CHECKED)
|
||||
{
|
||||
DumpPC = m_MMU->SystemRegisters()->PROGRAM_COUNTER;
|
||||
DumpPC = _Reg->PROGRAM_COUNTER;
|
||||
}
|
||||
//disable buttons
|
||||
::EnableWindow(GetDlgItem(IDC_E_START_ADDR),FALSE);
|
||||
|
@ -97,14 +96,14 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b
|
|||
::EnableWindow(GetDlgItem(IDC_FORMAT),FALSE);
|
||||
::EnableWindow(GetDlgItem(IDOK),FALSE);
|
||||
::EnableWindow(GetDlgItem(IDCANCEL),FALSE);
|
||||
m_System->ExternalEvent(PauseCPU_DumpMemory);
|
||||
_N64System->ExternalEvent(PauseCPU_DumpMemory);
|
||||
if (!DumpMemory(FileName,Format,StartPC,EndPC,DumpPC))
|
||||
{
|
||||
//enable buttons
|
||||
m_System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
_N64System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
return false;
|
||||
}
|
||||
m_System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
_N64System->ExternalEvent(ResumeCPU_DumpMemory);
|
||||
}
|
||||
EndDialog(0);
|
||||
break;
|
||||
|
@ -305,7 +304,7 @@ bool CDumpMemory::DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC,
|
|||
LogFile.SetFlush(false);
|
||||
LogFile.SetTruncateFile(false);
|
||||
char Command[200];
|
||||
for (COpcode OpCode(m_MMU,StartPC); OpCode.PC() < EndPC; OpCode.Next())
|
||||
for (COpcode OpCode(StartPC); OpCode.PC() < EndPC; OpCode.Next())
|
||||
{
|
||||
const char * szOpName = OpCode.OpcodeName();
|
||||
OpCode.OpcodeParam(Command);
|
||||
|
|
|
@ -18,12 +18,11 @@ class CDumpMemory :
|
|||
bool DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD DumpPC );
|
||||
|
||||
CEditNumber m_StartAddress, m_EndAddress, m_PC;
|
||||
CN64System * const m_System;
|
||||
|
||||
public:
|
||||
enum { IDD = IDD_Cheats_DumpMemory };
|
||||
|
||||
CDumpMemory(CN64System * System, CMipsMemory * MMU, CDebugger * debugger);
|
||||
CDumpMemory(CDebugger * debugger);
|
||||
virtual ~CDumpMemory(void);
|
||||
|
||||
};
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
#include "Debugger UI.h"
|
||||
|
||||
CDebugMemorySearch::CDebugMemorySearch(CN64System * System, CMipsMemory * MMU, CDebugger * debugger) :
|
||||
CDebugDialog<CDebugMemorySearch>(MMU,debugger),
|
||||
m_System(System)
|
||||
CDebugMemorySearch::CDebugMemorySearch(CDebugger * debugger) :
|
||||
CDebugDialog<CDebugMemorySearch>(debugger)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -13,12 +12,15 @@ CDebugMemorySearch::~CDebugMemorySearch()
|
|||
void CDebugMemorySearch::AddAlignmentOptions (CComboBox & ctrl)
|
||||
{
|
||||
int Index = ctrl.AddString("32 bits (aligned)");
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
ctrl.SetItemData(Index,_32Bit);
|
||||
Index = ctrl.AddString("16bits (aligned)");
|
||||
ctrl.SetItemData(Index,_16Bit);
|
||||
Index = ctrl.AddString("8bits");
|
||||
ctrl.SetCurSel(Index);
|
||||
ctrl.SetItemData(Index,_8Bit);
|
||||
#endif
|
||||
}
|
||||
|
||||
LRESULT CDebugMemorySearch::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
||||
|
@ -67,11 +69,11 @@ LRESULT CDebugMemorySearch::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl,
|
|||
break;
|
||||
case IDC_BTN_RDRAM:
|
||||
m_PAddrStart.SetValue(0,true,true);
|
||||
m_SearchLen.SetValue(m_MMU->RdramSize(),true,true);
|
||||
m_SearchLen.SetValue(_MMU->RdramSize(),true,true);
|
||||
break;
|
||||
case IDC_BTN_ROM:
|
||||
m_PAddrStart.SetValue(0x10000000,true,true);
|
||||
m_SearchLen.SetValue(m_MMU->RomFileSize(),true,true);
|
||||
m_SearchLen.SetValue(_Rom->GetRomSize(),true,true);
|
||||
break;
|
||||
case IDC_BTN_SPMEM:
|
||||
m_PAddrStart.SetValue(0x04000000,true,true);
|
||||
|
@ -222,6 +224,8 @@ void CDebugMemorySearch::EnableUnknownOptions( bool Enable )
|
|||
|
||||
void CDebugMemorySearch::SearchForValue( void )
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
MemorySize Size = (MemorySize)m_ValueSize.GetItemData(m_ValueSize.GetCurSel());
|
||||
DWORD Value = m_SearchValue.GetValue();
|
||||
DWORD StartAddress = m_PAddrStart.GetValue();
|
||||
|
@ -244,7 +248,7 @@ void CDebugMemorySearch::SearchForValue( void )
|
|||
m_SearchResults.DeleteAllItems();
|
||||
DWORD ItemsAdded = 0;
|
||||
|
||||
while (m_MMU->SearchForValue(Value,Size,StartAddress,Len))
|
||||
/*while (_MMU->SearchForValue(Value,Size,StartAddress,Len))
|
||||
{
|
||||
SearchResultItem Result;
|
||||
Result.PAddr = StartAddress;
|
||||
|
@ -268,7 +272,7 @@ void CDebugMemorySearch::SearchForValue( void )
|
|||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search Results");
|
||||
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_SHOW);
|
||||
::EnableWindow(GetDlgItem(IDC_VALUE_ALIGN),false);
|
||||
|
@ -280,7 +284,7 @@ void CDebugMemorySearch::SearchForValue( void )
|
|||
SearchResultItem & Result = m_SearchResult[ItemId];
|
||||
|
||||
DWORD NewValue;
|
||||
m_MMU->LoadPhysical32(Result.PAddr,NewValue,Size,false);
|
||||
/*_MMU->LoadPhysical32(Result.PAddr,NewValue,Size,false);
|
||||
|
||||
if (Value == NewValue)
|
||||
{
|
||||
|
@ -292,19 +296,20 @@ void CDebugMemorySearch::SearchForValue( void )
|
|||
Result.Value = NewValue;
|
||||
} else {
|
||||
m_SearchResults.DeleteItem(i);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS),stdstr_f("Results (%d)",m_SearchResults.GetItemCount()).c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
void CDebugMemorySearch::SearchForUnknown()
|
||||
{
|
||||
CMipsMemory::SearchMemChangeState Option = (CMipsMemory::SearchMemChangeState)m_UnknownOptions.GetItemData(m_UnknownOptions.GetCurSel());
|
||||
/*CMipsMemory::SearchMemChangeState Option = (CMipsMemory::SearchMemChangeState)m_UnknownOptions.GetItemData(m_UnknownOptions.GetCurSel());
|
||||
if (Option == CMipsMemory::SearchChangeState_Reset)
|
||||
{
|
||||
m_SearchResults.DeleteAllItems();
|
||||
m_MMU->SearchSetBaseForChanges();
|
||||
//_MMU->SearchSetBaseForChanges();
|
||||
FixUnknownOptions(false);
|
||||
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_SHOW);
|
||||
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN),true );
|
||||
|
@ -343,7 +348,7 @@ void CDebugMemorySearch::SearchForUnknown()
|
|||
m_SearchResults.DeleteAllItems();
|
||||
DWORD ItemsAdded = 0, OldValue, NewValue;
|
||||
|
||||
while (m_MMU->SearchForChanges(Option,Size,StartAddress,Len,OldValue,NewValue))
|
||||
while (_MMU->SearchForChanges(Option,Size,StartAddress,Len,OldValue,NewValue))
|
||||
{
|
||||
SearchResultItem Result;
|
||||
Result.PAddr = StartAddress;
|
||||
|
@ -382,7 +387,7 @@ void CDebugMemorySearch::SearchForUnknown()
|
|||
|
||||
bool UpdateResult = false;
|
||||
DWORD NewValue;
|
||||
m_MMU->LoadPhysical32(Result.PAddr,NewValue,Size,false);
|
||||
_MMU->LoadPhysical32(Result.PAddr,NewValue,Size,false);
|
||||
switch (Option)
|
||||
{
|
||||
case CMipsMemory::SearchChangeState_Changed:
|
||||
|
@ -427,6 +432,7 @@ void CDebugMemorySearch::SearchForUnknown()
|
|||
}
|
||||
}
|
||||
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS),stdstr_f("Results (%d)",m_SearchResults.GetItemCount()).c_str());
|
||||
*/
|
||||
}
|
||||
|
||||
void CDebugMemorySearch::SearchForText()
|
||||
|
@ -467,7 +473,7 @@ void CDebugMemorySearch::Reset ( void )
|
|||
|
||||
void CDebugMemorySearch::FixUnknownOptions ( bool Reset )
|
||||
{
|
||||
CComboBox & cb = m_UnknownOptions ;
|
||||
/* CComboBox & cb = m_UnknownOptions ;
|
||||
|
||||
if (!Reset && cb.GetCount() > 1)
|
||||
{
|
||||
|
@ -485,6 +491,6 @@ void CDebugMemorySearch::FixUnknownOptions ( bool Reset )
|
|||
cb.SetItemData(cb.AddString("Value has increased"),CMipsMemory::SearchChangeState_Greater);
|
||||
cb.SetItemData(cb.AddString("Value has descreased"),CMipsMemory::SearchChangeState_Lessthan);
|
||||
cb.SetCurSel(1);
|
||||
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search");
|
||||
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search");*/
|
||||
|
||||
}
|
|
@ -40,7 +40,7 @@ class CDebugMemorySearch :
|
|||
public:
|
||||
enum { IDD = IDD_Debugger_Search };
|
||||
|
||||
CDebugMemorySearch(CN64System * System, CMipsMemory * MMU, CDebugger * debugger);
|
||||
CDebugMemorySearch(CDebugger * debugger);
|
||||
virtual ~CDebugMemorySearch(void);
|
||||
|
||||
};
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "Debugger UI.h"
|
||||
|
||||
CDebugTlb::CDebugTlb(CMipsMemory * MMU, CDebugger * debugger) :
|
||||
CDebugDialog<CDebugTlb>(MMU,debugger)
|
||||
CDebugTlb::CDebugTlb(CDebugger * debugger) :
|
||||
CDebugDialog<CDebugTlb>(debugger)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -91,20 +91,19 @@ LRESULT CDebugTlb::OnClicked (WORD wNotifyCode, WORD wID, HWND , BOOL& bHandled)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
void CDebugTlb::RefreshTLBWindow (void) {
|
||||
HWND hList = GetDlgItem(IDC_LIST);
|
||||
char Output[100], OldText[100];
|
||||
LV_ITEM item, OldItem;
|
||||
int count;
|
||||
|
||||
TLB * tlb = m_MMU->tlb;
|
||||
FASTTLB * FastTlb = m_MMU->FastTlb;
|
||||
|
||||
void CDebugTlb::RefreshTLBWindow (void)
|
||||
{
|
||||
if (m_hWnd == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
HWND hList = GetDlgItem(IDC_LIST);
|
||||
char Output[100], OldText[100];
|
||||
LV_ITEM item, OldItem;
|
||||
int count;
|
||||
|
||||
CTLB::TLB_ENTRY * tlb = _TLB->m_tlb;
|
||||
for (count = 0; count < 32; count ++) {
|
||||
sprintf(Output,"0x%02X",count);
|
||||
item.mask = LVIF_TEXT;
|
||||
|
@ -175,8 +174,8 @@ void CDebugTlb::RefreshTLBWindow (void) {
|
|||
}
|
||||
}
|
||||
|
||||
hList = GetDlgItem(IDC_LIST2);
|
||||
|
||||
CTLB::FASTTLB * FastTlb = _TLB->m_FastTlb;
|
||||
hList = GetDlgItem(IDC_LIST2);
|
||||
for (count = 0; count < 64; count ++) {
|
||||
sprintf(Output,"0x%02X",count);
|
||||
item.mask = LVIF_TEXT;
|
||||
|
@ -237,264 +236,3 @@ void CDebugTlb::RefreshTLBWindow (void) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//{
|
||||
// if (m_hDebugWnd)
|
||||
// {
|
||||
// SetForegroundWindow((HWND)m_hDebugWnd);
|
||||
// } else {
|
||||
// DWORD ThreadID;
|
||||
// HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CreateDebugWindow,(LPVOID)this,0, &ThreadID);
|
||||
// CloseHandle(hThread);
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//void CDebugTlb::CreateDebugWindow ( CDebugTlb * _this ) {
|
||||
// DialogBoxParam( GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_Debugger_TLB), NULL,(DLGPROC) DebugWndProc, (LPARAM)_this );
|
||||
// _this->m_hDebugWnd = NULL;
|
||||
//}
|
||||
//
|
||||
//void CDebugTlb::SetupDebugWindow (void)
|
||||
//{
|
||||
// LV_COLUMN col;
|
||||
//
|
||||
// col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||
// col.fmt = LVCFMT_LEFT;
|
||||
//
|
||||
// col.pszText = "Index";
|
||||
// col.cx = 40;
|
||||
// col.iSubItem = 0;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST), 0, &col);
|
||||
//
|
||||
// col.pszText = "Page Mask";
|
||||
// col.cx = 90;
|
||||
// col.iSubItem = 1;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST), 1, &col);
|
||||
//
|
||||
// col.pszText = "Entry Hi";
|
||||
// col.cx = 90;
|
||||
// col.iSubItem = 2;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST), 2, &col);
|
||||
//
|
||||
// col.pszText = "Entry Lo0";
|
||||
// col.cx = 90;
|
||||
// col.iSubItem = 3;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST), 3, &col);
|
||||
//
|
||||
// col.pszText = "Entry Lo1";
|
||||
// col.cx = 90;
|
||||
// col.iSubItem = 4;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST), 4, &col);
|
||||
//
|
||||
// col.pszText = "Index";
|
||||
// col.cx = 40;
|
||||
// col.iSubItem = 0;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST2), 0, &col);
|
||||
//
|
||||
// col.pszText = "Valid";
|
||||
// col.cx = 40;
|
||||
// col.iSubItem = 1;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST2), 1, &col);
|
||||
//
|
||||
// col.pszText = "Dirty";
|
||||
// col.cx = 40;
|
||||
// col.iSubItem = 2;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST2), 2, &col);
|
||||
//
|
||||
// col.pszText = "Rule";
|
||||
// col.cx = 280;
|
||||
// col.iSubItem = 3;
|
||||
// ListView_InsertColumn ( GetDlgItem((HWND)m_hDebugWnd,IDC_LIST2), 3, &col);
|
||||
//
|
||||
// RefreshTLBWindow();
|
||||
// SendMessage(GetDlgItem((HWND)m_hDebugWnd,IDC_TLB_ENTRIES),BM_SETCHECK, BST_CHECKED,0);
|
||||
//
|
||||
// if (Settings().Load(TLBWindowLeft) <= 0)
|
||||
// {
|
||||
// SetWindowPos((HWND)m_hDebugWnd,NULL,Settings().Load(TLBWindowLeft),Settings().Load(TLBWindowTop),0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//void CDebugTlb::RefreshTLBWindow (void) {
|
||||
// HWND hList = GetDlgItem((HWND)m_hDebugWnd,IDC_LIST);
|
||||
// char Output[100], OldText[100];
|
||||
// LV_ITEM item, OldItem;
|
||||
// int count;
|
||||
//
|
||||
// TLB * tlb = _TLB->tlb;
|
||||
// FASTTLB * FastTlb = _TLB->FastTlb;
|
||||
//
|
||||
// if (!(HWND)m_hDebugWnd) { return; }
|
||||
// for (count = 0; count < 32; count ++) {
|
||||
// sprintf(Output,"0x%02X",count);
|
||||
// item.mask = LVIF_TEXT;
|
||||
// item.iItem = count;
|
||||
// item.pszText = Output;
|
||||
// item.iSubItem = 0;
|
||||
//
|
||||
// OldItem.mask = LVIF_TEXT;
|
||||
// OldItem.iItem = count;
|
||||
// OldItem.pszText = OldText;
|
||||
// OldItem.cchTextMax = sizeof( OldText )-1;
|
||||
// OldItem.iSubItem = 0;
|
||||
//
|
||||
// if (ListView_GetItemCount(hList) <= count) {
|
||||
// ListView_InsertItem(hList,&item);
|
||||
// } else {
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
// }
|
||||
// if (tlb[count].EntryDefined) {
|
||||
// sprintf(Output,"0x%08X",tlb[count].PageMask.Value);
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 1;
|
||||
// OldItem.iSubItem = 1;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
//
|
||||
// if (tlb[count].EntryDefined) {
|
||||
// sprintf(Output,"0x%08X",tlb[count].EntryHi.Value);
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 2;
|
||||
// OldItem.iSubItem = 2;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
//
|
||||
// if (tlb[count].EntryDefined) {
|
||||
// sprintf(Output,"0x%08X",tlb[count].EntryLo0.Value);
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 3;
|
||||
// OldItem.iSubItem = 3;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
//
|
||||
// if (tlb[count].EntryDefined) {
|
||||
// sprintf(Output,"0x%08X",tlb[count].EntryLo1.Value);
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 4;
|
||||
// OldItem.iSubItem = 4;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// hList = GetDlgItem((HWND)m_hDebugWnd,IDC_LIST2);
|
||||
//
|
||||
// for (count = 0; count < 64; count ++) {
|
||||
// sprintf(Output,"0x%02X",count);
|
||||
// item.mask = LVIF_TEXT;
|
||||
// item.iItem = count;
|
||||
// item.pszText = Output;
|
||||
// item.iSubItem = 0;
|
||||
//
|
||||
// OldItem.mask = LVIF_TEXT;
|
||||
// OldItem.iItem = count;
|
||||
// OldItem.pszText = OldText;
|
||||
// OldItem.cchTextMax = sizeof( OldText )-1;
|
||||
// OldItem.iSubItem = 0;
|
||||
//
|
||||
// if (ListView_GetItemCount(hList) <= count) {
|
||||
// item.iItem = ListView_InsertItem(hList,&item);
|
||||
// } else {
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (FastTlb[count].ValidEntry) {
|
||||
// sprintf(Output,"%s",FastTlb[count].VALID?"Yes":"No");
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 1;
|
||||
// OldItem.iSubItem = 1;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
//
|
||||
// if (FastTlb[count].ValidEntry && FastTlb[count].VALID) {
|
||||
// sprintf(Output,"%s",FastTlb[count].DIRTY?"Yes":"No");
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 2;
|
||||
// OldItem.iSubItem = 2;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
//
|
||||
// if (FastTlb[count].ValidEntry && FastTlb[count].VALID) {
|
||||
// sprintf(Output,"%08X:%08X -> %08X:%08X",FastTlb[count].VSTART,FastTlb[count].VEND,
|
||||
// FastTlb[count].PHYSSTART,FastTlb[count].PHYSEND);
|
||||
// } else {
|
||||
// strcpy(Output,"................");
|
||||
// }
|
||||
// item.iSubItem = 3;
|
||||
// OldItem.iSubItem = 3;
|
||||
// ListView_GetItem(hList,&OldItem);
|
||||
// if ( strcmp( item.pszText, OldItem.pszText ) != 0 ) {
|
||||
// ListView_SetItem(hList,&item);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//DWORD CALLBACK DebugWndProc (WND_HANDLE hDlg, DWORD uMsg, DWORD wParam, DWORD lParam)
|
||||
//{
|
||||
// switch (uMsg) {
|
||||
// case WM_INITDIALOG:
|
||||
// {
|
||||
// CDebugTlb * _this = (CDebugTlb *)lParam;
|
||||
// SetProp((HWND)hDlg,"Class",_this);
|
||||
// _this->m_hDebugWnd = hDlg;
|
||||
// _this->SetupDebugWindow();
|
||||
// }
|
||||
// break;
|
||||
// case WM_MOVE:
|
||||
// {
|
||||
// RECT WinRect;
|
||||
// GetWindowRect((HWND)hDlg, &WinRect );
|
||||
//
|
||||
// Settings().Save(TLBWindowLeft,WinRect.left);
|
||||
// Settings().Save(TLBWindowTop,WinRect.top);
|
||||
// }
|
||||
// break;
|
||||
// case WM_COMMAND:
|
||||
// switch (LOWORD(wParam)) {
|
||||
// case IDC_TLB_ENTRIES:
|
||||
// ShowWindow(GetDlgItem((HWND)hDlg,IDC_LIST),SW_SHOW);
|
||||
// ShowWindow(GetDlgItem((HWND)hDlg,IDC_LIST2),SW_HIDE);
|
||||
// break;
|
||||
// case IDC_TLB_RULES:
|
||||
// ShowWindow(GetDlgItem((HWND)hDlg,IDC_LIST),SW_HIDE);
|
||||
// ShowWindow(GetDlgItem((HWND)hDlg,IDC_LIST2),SW_SHOW);
|
||||
// break;
|
||||
// case IDCANCEL:
|
||||
// EndDialog( (HWND)hDlg, IDCANCEL );
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
// default:
|
||||
// return FALSE;
|
||||
// }
|
||||
// return TRUE;
|
||||
//}
|
|
@ -13,7 +13,7 @@ class CDebugTlb :
|
|||
public:
|
||||
enum { IDD = IDD_Debugger_TLB };
|
||||
|
||||
CDebugTlb(CMipsMemory * MMU, CDebugger * debugger);
|
||||
CDebugTlb(CDebugger * debugger);
|
||||
virtual ~CDebugTlb(void);
|
||||
|
||||
void RefreshTLBWindow ( void );
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "Debugger UI.h"
|
||||
|
||||
CDebugMemoryView::CDebugMemoryView(CMipsMemory * MMU, CDebugger * debugger) :
|
||||
CDebugDialog<CDebugMemoryView>(MMU,debugger),
|
||||
CDebugMemoryView::CDebugMemoryView(CDebugger * debugger) :
|
||||
CDebugDialog<CDebugMemoryView>(debugger),
|
||||
m_MemoryList(NULL)
|
||||
{
|
||||
if (m_MemoryList== NULL)
|
||||
|
@ -170,15 +170,15 @@ LRESULT CDebugMemoryView::OnMemoryModified ( LPNMHDR lpNMHDR )
|
|||
//sb
|
||||
if ( m_DataVAddrr )
|
||||
{
|
||||
if (!m_MMU->Store64(m_DataStartLoc+ Pos,Value,_8Bit))
|
||||
if (!_MMU->SB_VAddr(m_DataStartLoc+ Pos,Value))
|
||||
{
|
||||
WriteTraceF(TraceError,"CDebugMemoryView::OnMemoryModified - failed to store at %X",m_DataStartLoc + Pos);
|
||||
}
|
||||
} else {
|
||||
if (!m_MMU->StorePhysical64(m_DataStartLoc+ Pos,Value,_8Bit))
|
||||
/*if (!_MMU->SD_VAddr(m_DataStartLoc+ Pos,Value,_8Bit))
|
||||
{
|
||||
WriteTraceF(TraceError,"CDebugMemoryView::OnMemoryModified - failed to store at %X",m_DataStartLoc + Pos);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
Insert_MemoryLineDump(LineNumber);
|
||||
|
||||
|
@ -251,8 +251,13 @@ void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
|
|||
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_WINDOWTEXT ) );
|
||||
m_MemoryList->SetItemHighlightColours( LineNumber, col,
|
||||
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_HIGHLIGHTTEXT ) );
|
||||
sprintf(AsciiAddOn,"%c",m_CurrentData[((LineNumber << 4) + i)]);
|
||||
strcat(Ascii,AsciiAddOn);
|
||||
if (m_CurrentData[Pos] < 30)
|
||||
{
|
||||
strcat(Ascii,".");
|
||||
} else {
|
||||
sprintf(AsciiAddOn,"%c",m_CurrentData[Pos]);
|
||||
strcat(Ascii,AsciiAddOn);
|
||||
}
|
||||
} else {
|
||||
m_MemoryList->SetItemText(LineNumber,col,"**");
|
||||
m_MemoryList->SetItemFormat( LineNumber,col, ITEM_FORMAT_NONE, ITEM_FLAGS_NONE );
|
||||
|
@ -310,6 +315,11 @@ void CDebugMemoryView::OnVScroll(int request, short Pos, HWND ctrl )
|
|||
|
||||
void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
|
||||
{
|
||||
if (m_MemoryList && m_MemoryList->GetHasEditItem())
|
||||
{
|
||||
m_MemoryList->SetFocus();
|
||||
}
|
||||
|
||||
DWORD NewAddress = m_MemAddr.GetValue();
|
||||
if (NewAddress != m_DataStartLoc)
|
||||
{
|
||||
|
@ -347,15 +357,15 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
|
|||
|
||||
if ( m_DataVAddrr )
|
||||
{
|
||||
if (!m_MMU->Load32(m_DataStartLoc & ~3, word.UW,_32Bit,false))
|
||||
if (!_MMU->LW_VAddr(m_DataStartLoc & ~3, word.UW))
|
||||
{
|
||||
ValidData = false;
|
||||
}
|
||||
} else {
|
||||
if (!m_MMU->LoadPhysical32(m_DataStartLoc & ~3, word.UW, _32Bit,false))
|
||||
/*if (!_MMU->LoadPhysical32(m_DataStartLoc & ~3, word.UW, _32Bit,false))
|
||||
{
|
||||
ValidData = false;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
int Offset = (m_DataStartLoc & 3);
|
||||
|
@ -382,15 +392,15 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
|
|||
|
||||
if ( m_DataVAddrr )
|
||||
{
|
||||
if (!m_MMU->Load32(Pos, word.UW,_32Bit,false))
|
||||
if (!_MMU->LW_VAddr(Pos, word.UW))
|
||||
{
|
||||
ValidData = false;
|
||||
}
|
||||
} else {
|
||||
if (!m_MMU->LoadPhysical32(Pos, word.UW, _32Bit,false))
|
||||
/*if (!_MMU->LoadPhysical32(Pos, word.UW, _32Bit,false))
|
||||
{
|
||||
ValidData = false;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
|
|
|
@ -39,7 +39,7 @@ class CDebugMemoryView :
|
|||
public:
|
||||
enum { IDD = IDD_Debugger_Memory };
|
||||
|
||||
CDebugMemoryView(CMipsMemory * MMU, CDebugger * debugger);
|
||||
CDebugMemoryView(CDebugger * debugger);
|
||||
virtual ~CDebugMemoryView(void);
|
||||
|
||||
void ShowAddress (DWORD Address, bool VAddr);
|
||||
|
|
|
@ -45,3 +45,4 @@
|
|||
#include "Debugger - Memory Dump.h"
|
||||
#include "Debugger - TLB.h"
|
||||
|
||||
|
||||
|
|
|
@ -7,13 +7,11 @@
|
|||
|
||||
CPj64Module _Module;
|
||||
|
||||
CDebugger::CDebugger (CN64System * System, CMipsMemory *& MMU) :
|
||||
CDebugger::CDebugger () :
|
||||
m_MemoryDump(NULL),
|
||||
m_MemoryView(NULL),
|
||||
m_MemorySearch(NULL),
|
||||
m_DebugTLB(NULL),
|
||||
m_MMU(MMU),
|
||||
m_System(System)
|
||||
m_DebugTLB(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -52,13 +50,13 @@ void CDebugger::Debug_Reset ( void )
|
|||
|
||||
void CDebugger::Debug_ShowMemoryDump()
|
||||
{
|
||||
if (m_MMU == NULL)
|
||||
if (_MMU == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (m_MemoryDump == NULL)
|
||||
{
|
||||
m_MemoryDump = new CDumpMemory(m_System, m_MMU, this);
|
||||
m_MemoryDump = new CDumpMemory(this);
|
||||
}
|
||||
if (m_MemoryDump)
|
||||
{
|
||||
|
@ -68,13 +66,13 @@ void CDebugger::Debug_ShowMemoryDump()
|
|||
|
||||
void CDebugger::Debug_ShowMemoryWindow ( void )
|
||||
{
|
||||
if (m_MMU == NULL)
|
||||
if (_MMU == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (m_MemoryView == NULL)
|
||||
{
|
||||
m_MemoryView = new CDebugMemoryView(m_MMU, this);
|
||||
m_MemoryView = new CDebugMemoryView(this);
|
||||
}
|
||||
if (m_MemoryView)
|
||||
{
|
||||
|
@ -93,13 +91,13 @@ void CDebugger::Debug_ShowMemoryLocation ( DWORD Address, bool VAddr )
|
|||
|
||||
void CDebugger::Debug_ShowTLBWindow (void)
|
||||
{
|
||||
if (m_MMU == NULL)
|
||||
if (_MMU == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (m_DebugTLB == NULL)
|
||||
{
|
||||
m_DebugTLB = new CDebugTlb(m_MMU, this);
|
||||
m_DebugTLB = new CDebugTlb(this);
|
||||
}
|
||||
if (m_DebugTLB)
|
||||
{
|
||||
|
@ -119,7 +117,7 @@ void CDebugger::Debug_ShowMemorySearch()
|
|||
{
|
||||
if (m_MemorySearch == NULL)
|
||||
{
|
||||
m_MemorySearch = new CDebugMemorySearch(m_System, m_MMU, this);
|
||||
m_MemorySearch = new CDebugMemorySearch(this);
|
||||
}
|
||||
if (m_MemorySearch)
|
||||
{
|
||||
|
|
|
@ -8,11 +8,9 @@ class CDebugger
|
|||
CDebugMemoryView * m_MemoryView;
|
||||
CDebugMemorySearch * m_MemorySearch;
|
||||
CDebugTlb * m_DebugTLB;
|
||||
CMipsMemory *& m_MMU;
|
||||
CN64System * m_System;
|
||||
|
||||
protected:
|
||||
CDebugger(CN64System * System, CMipsMemory *& MMU);
|
||||
CDebugger();
|
||||
~CDebugger();
|
||||
|
||||
public:
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
#include "../stdafx.h"
|
|
@ -29,41 +29,42 @@
|
|||
|
||||
|
||||
// ****************** Testing Audio Stuff *****************
|
||||
CAudio::CAudio (CRegisters * Reg) :
|
||||
_Reg(Reg),
|
||||
VSyncTiming(789000.0f)
|
||||
CAudio::CAudio (void)
|
||||
{
|
||||
//float CAudio::VSyncTiming = 789000.0f; // 500000
|
||||
////const float VSyncTiming = 760000.0f;
|
||||
ResetAudioSettings();
|
||||
}
|
||||
|
||||
// I seem to be getting clicking when I set CF to 1 and VSyncTiming to 789000
|
||||
void CAudio::ResetAudioSettings (void)
|
||||
{
|
||||
FramesPerSecond = 60.0f;
|
||||
BytesPerSecond = 0;
|
||||
Length = 0;
|
||||
Status = 0;
|
||||
CountsPerByte = 0;
|
||||
SecondBuff = 0;
|
||||
CurrentCount = 0;
|
||||
CurrentLength = 0;
|
||||
IntScheduled = 0;
|
||||
//float CAudio::VSyncTiming = 789000.0f; // 500000
|
||||
////const float VSyncTiming = 760000.0f;
|
||||
m_FramesPerSecond = 60.0f;
|
||||
m_BytesPerSecond = 0;
|
||||
m_Length = 0;
|
||||
m_Status = 0;
|
||||
m_CountsPerByte = 0;
|
||||
m_SecondBuff = 0;
|
||||
m_CurrentCount = 0;
|
||||
m_CurrentLength = 0;
|
||||
m_IntScheduled = 0;
|
||||
m_VSyncTiming = 789000.0f;
|
||||
}
|
||||
|
||||
void CAudio::AiCallBack () {
|
||||
if (SecondBuff != 0) {
|
||||
IntScheduled = (DWORD)((double)SecondBuff * CountsPerByte);
|
||||
_Reg->ChangeTimerFixed(AiTimer, IntScheduled);
|
||||
void CAudio::AiCallBack ()
|
||||
{
|
||||
if (m_SecondBuff != 0) {
|
||||
m_IntScheduled = (DWORD)((double)m_SecondBuff * m_CountsPerByte);
|
||||
_Reg->ChangeTimerFixed(AiTimer, m_IntScheduled);
|
||||
}
|
||||
CurrentCount = _Reg->COUNT_REGISTER;
|
||||
CurrentLength = SecondBuff;
|
||||
SecondBuff = 0;
|
||||
Status &= 0x7FFFFFFF;
|
||||
m_CurrentCount = _Reg->COUNT_REGISTER;
|
||||
m_CurrentLength = m_SecondBuff;
|
||||
m_SecondBuff = 0;
|
||||
m_Status &= 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
DWORD CAudio::AiGetLength (CAudio * _this) {
|
||||
DWORD CAudio::AiGetLength (void)
|
||||
{
|
||||
double AiCounts;
|
||||
// static DWORD LengthReadHack = 0;
|
||||
// if ((COUNT_REGISTER - LengthReadHack) < 0x20) {
|
||||
|
@ -73,52 +74,56 @@ DWORD CAudio::AiGetLength (CAudio * _this) {
|
|||
// COUNT_REGISTER+=0xA; // This hack is necessary... but what is a good value??
|
||||
// }
|
||||
// LengthReadHack = COUNT_REGISTER;
|
||||
AiCounts = _this->CountsPerByte * _this->CurrentLength;
|
||||
AiCounts = AiCounts - (double)(_this->_Reg->COUNT_REGISTER - _this->CurrentCount);
|
||||
AiCounts = m_CountsPerByte * m_CurrentLength;
|
||||
AiCounts = AiCounts - (double)(_Reg->COUNT_REGISTER - m_CurrentCount);
|
||||
if (AiCounts < 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
// return 0;
|
||||
return (DWORD)(AiCounts/_this->CountsPerByte);
|
||||
return (DWORD)(AiCounts / m_CountsPerByte);
|
||||
}
|
||||
|
||||
DWORD CAudio::AiGetStatus (CAudio * _this) {
|
||||
return _this->Status;
|
||||
DWORD CAudio::AiGetStatus (void)
|
||||
{
|
||||
return m_Status;
|
||||
}
|
||||
|
||||
void CAudio::AiSetLength (CAudio * _this, DWORD data) {
|
||||
void CAudio::AiSetLength (void)
|
||||
{
|
||||
// Set Status to FULL for a few COUNT cycles
|
||||
if (_this->CurrentLength == 0) {
|
||||
_this->CurrentLength = _this->_Reg->AI_LEN_REG;
|
||||
_this->CurrentCount = _this->_Reg->COUNT_REGISTER;
|
||||
_this->IntScheduled = (DWORD)((double)_this->_Reg->AI_LEN_REG * _this->CountsPerByte);
|
||||
_this->_Reg->ChangeTimerFixed(AiTimer, _this->IntScheduled);
|
||||
if (m_CurrentLength == 0) {
|
||||
m_CurrentLength = _Reg->AI_LEN_REG;
|
||||
m_CurrentCount = _Reg->COUNT_REGISTER;
|
||||
m_IntScheduled = (DWORD)((double)_Reg->AI_LEN_REG * m_CountsPerByte);
|
||||
_Reg->ChangeTimerFixed(AiTimer, m_IntScheduled);
|
||||
} else {
|
||||
_this->SecondBuff = _this->_Reg->AI_LEN_REG;
|
||||
_this->Status |= 0x80000000;
|
||||
m_SecondBuff = _Reg->AI_LEN_REG;
|
||||
m_Status |= 0x80000000;
|
||||
}
|
||||
}
|
||||
|
||||
void CAudio::UpdateAudioTimer (DWORD CountsPerFrame) {
|
||||
double CountsPerSecond;
|
||||
CountsPerSecond = (DWORD)((double)CountsPerFrame * FramesPerSecond); // This will only work with NTSC... VSyncTiming...
|
||||
CountsPerByte = (double)CountsPerSecond / (double)BytesPerSecond;
|
||||
void CAudio::UpdateAudioTimer (DWORD CountsPerFrame)
|
||||
{
|
||||
double CountsPerSecond = (DWORD)((double)CountsPerFrame * m_FramesPerSecond); // This will only work with NTSC... VSyncTiming...
|
||||
m_CountsPerByte = CountsPerSecond / (double)m_BytesPerSecond;
|
||||
}
|
||||
|
||||
void CAudio::AiSetFrequency (DWORD Dacrate, DWORD System) {
|
||||
double CountsPerSecond;
|
||||
switch (System) {
|
||||
case SYSTEM_NTSC: BytesPerSecond = 48681812 / (Dacrate + 1); break;
|
||||
case SYSTEM_PAL: BytesPerSecond = 49656530 / (Dacrate + 1); break;
|
||||
case SYSTEM_MPAL: BytesPerSecond = 48628316 / (Dacrate + 1); break;
|
||||
case SYSTEM_NTSC: m_BytesPerSecond = 48681812 / (Dacrate + 1); break;
|
||||
case SYSTEM_PAL: m_BytesPerSecond = 49656530 / (Dacrate + 1); break;
|
||||
case SYSTEM_MPAL: m_BytesPerSecond = 48628316 / (Dacrate + 1); break;
|
||||
}
|
||||
if (System == SYSTEM_PAL) {
|
||||
FramesPerSecond = 50.0;
|
||||
m_FramesPerSecond = 50.0;
|
||||
} else {
|
||||
FramesPerSecond = 60.0;
|
||||
m_FramesPerSecond = 60.0;
|
||||
}
|
||||
BytesPerSecond = (BytesPerSecond * 4); // This makes it Bytes Per Second...
|
||||
CountsPerSecond = (double)(((double)VSyncTiming) * (double)60.0); // This will only work with NTSC... VSyncTiming...
|
||||
CountsPerByte = (double)CountsPerSecond / (double)BytesPerSecond;
|
||||
SecondBuff = Status = CurrentLength = 0;
|
||||
m_BytesPerSecond = (m_BytesPerSecond * 4); // This makes it Bytes Per Second...
|
||||
CountsPerSecond = (double)(((double)m_VSyncTiming) * (double)60.0); // This will only work with NTSC... VSyncTiming...
|
||||
m_CountsPerByte = (double)CountsPerSecond / (double)m_BytesPerSecond;
|
||||
m_SecondBuff = m_Status = m_CurrentLength = 0;
|
||||
//CountsPerByte /= CountPerOp;
|
||||
}
|
||||
|
|
|
@ -1,29 +1,25 @@
|
|||
#ifdef __cplusplus
|
||||
|
||||
class CAudio {
|
||||
CRegisters * const _Reg;
|
||||
|
||||
const float VSyncTiming;
|
||||
double FramesPerSecond;
|
||||
DWORD BytesPerSecond;
|
||||
DWORD Length;
|
||||
DWORD Status;
|
||||
double CountsPerByte;
|
||||
DWORD SecondBuff;
|
||||
DWORD CurrentCount;
|
||||
DWORD CurrentLength;
|
||||
DWORD IntScheduled;
|
||||
|
||||
class CAudio
|
||||
{
|
||||
public:
|
||||
CAudio (CRegisters * Reg);
|
||||
CAudio (void);
|
||||
|
||||
void AiCallBack ();
|
||||
static DWORD __fastcall AiGetLength (CAudio * _this);
|
||||
static DWORD __fastcall AiGetStatus (CAudio * _this);
|
||||
static void __fastcall AiSetLength (CAudio * _this, DWORD data);
|
||||
void AiSetFrequency (DWORD Dacrate, DWORD System);
|
||||
void UpdateAudioTimer (DWORD CountsPerFrame);
|
||||
void ResetAudioSettings (void);
|
||||
void AiCallBack ( void );
|
||||
DWORD AiGetLength ( void );
|
||||
DWORD AiGetStatus ( void );
|
||||
void AiSetLength ( void );
|
||||
void AiSetFrequency ( DWORD Dacrate, DWORD System );
|
||||
void UpdateAudioTimer ( DWORD CountsPerFrame );
|
||||
void ResetAudioSettings ( void);
|
||||
|
||||
private:
|
||||
float m_VSyncTiming;
|
||||
double m_FramesPerSecond;
|
||||
DWORD m_BytesPerSecond;
|
||||
DWORD m_Length;
|
||||
DWORD m_Status;
|
||||
double m_CountsPerByte;
|
||||
DWORD m_SecondBuff;
|
||||
DWORD m_CurrentCount;
|
||||
DWORD m_CurrentLength;
|
||||
DWORD m_IntScheduled;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,17 +1,10 @@
|
|||
#include <windows.h>
|
||||
|
||||
#ifdef toremove
|
||||
enum MemorySize { _8Bit, _16Bit, _32Bit, _64Bit };
|
||||
|
||||
class CRSP_Plugin;
|
||||
class CC_Core;
|
||||
|
||||
|
||||
extern "C" {
|
||||
int r4300i_SB_NonMemory ( DWORD PAddr, BYTE Value );
|
||||
int r4300i_SH_NonMemory ( DWORD PAddr, WORD Value );
|
||||
int r4300i_SW_NonMemory ( DWORD PAddr, DWORD Value );
|
||||
int r4300i_LB_NonMemory ( DWORD PAddr, DWORD * Value, int SignExtend );
|
||||
int r4300i_LH_NonMemory ( DWORD PAddr, DWORD * Value, int SignExtend );
|
||||
int r4300i_LW_NonMemory ( DWORD PAddr, DWORD * Value );
|
||||
}
|
||||
#endif
|
||||
|
||||
class CMipsMemory_CallBack {
|
||||
public:
|
||||
|
@ -20,10 +13,60 @@ public:
|
|||
virtual bool WriteToProtectedMemory (DWORD Address, int length) = 0;
|
||||
};
|
||||
|
||||
class CMipsMemory :
|
||||
class CBlockSection;
|
||||
|
||||
class CMipsMemory
|
||||
{
|
||||
public:
|
||||
virtual BYTE * Rdram ( void ) = 0;
|
||||
virtual DWORD RdramSize ( void ) = 0;
|
||||
virtual BYTE * Dmem ( void ) = 0;
|
||||
virtual BYTE * Imem ( void ) = 0;
|
||||
virtual BYTE * PifRam ( void ) = 0;
|
||||
|
||||
virtual BOOL LB_VAddr ( DWORD VAddr, BYTE & Value ) = 0;
|
||||
virtual BOOL LH_VAddr ( DWORD VAddr, WORD & Value ) = 0;
|
||||
virtual BOOL LW_VAddr ( DWORD VAddr, DWORD & Value ) = 0;
|
||||
virtual BOOL LD_VAddr ( DWORD VAddr, QWORD & Value ) = 0;
|
||||
|
||||
virtual BOOL SB_VAddr ( DWORD VAddr, BYTE Value ) = 0;
|
||||
virtual BOOL SH_VAddr ( DWORD VAddr, WORD Value ) = 0;
|
||||
virtual BOOL SW_VAddr ( DWORD VAddr, DWORD Value ) = 0;
|
||||
virtual BOOL SD_VAddr ( DWORD VAddr, QWORD Value ) = 0;
|
||||
|
||||
virtual bool ValidVaddr ( DWORD VAddr ) const = 0;
|
||||
|
||||
virtual int MemoryFilter ( DWORD dwExptCode, void * lpExceptionPointer ) = 0;
|
||||
|
||||
//Protect the Memory from being written to
|
||||
virtual void ProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
|
||||
virtual void UnProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
|
||||
|
||||
//Compilation Functions
|
||||
virtual void ResetMemoryStack ( CBlockSection * Section ) = 0;
|
||||
virtual void Compile_LB ( int Reg, DWORD Addr, BOOL SignExtend ) = 0;
|
||||
virtual void Compile_LH ( int Reg, DWORD Addr, BOOL SignExtend ) = 0;
|
||||
virtual void Compile_LW ( CBlockSection * Section, int Reg, DWORD Addr ) = 0;
|
||||
virtual void Compile_SB_Const ( BYTE Value, DWORD Addr ) = 0;
|
||||
virtual void Compile_SB_Register ( int x86Reg, DWORD Addr ) = 0;
|
||||
virtual void Compile_SH_Const ( WORD Value, DWORD Addr ) = 0;
|
||||
virtual void Compile_SH_Register ( int x86Reg, DWORD Addr ) = 0;
|
||||
virtual void Compile_SW_Const ( DWORD Value, DWORD Addr ) = 0;
|
||||
virtual void Compile_SW_Register ( CBlockSection * Section, int x86Reg, DWORD Addr ) = 0;
|
||||
|
||||
};
|
||||
|
||||
class CRSP_Plugin;
|
||||
|
||||
class CMipsMemoryVM :
|
||||
public CMipsMemory
|
||||
#ifdef toremove
|
||||
,
|
||||
|
||||
public CTLB,
|
||||
public CMemoryLabel/*,
|
||||
private CPIFRam*/
|
||||
#endif
|
||||
{
|
||||
//Make sure plugins can directly access this information
|
||||
friend CGfxPlugin;
|
||||
|
@ -33,26 +76,34 @@ class CMipsMemory :
|
|||
friend CN64System; //Need to manipulate all memory in loading/saveing save state
|
||||
friend CC_Core;
|
||||
|
||||
#ifdef toremove
|
||||
CNotification * const _Notify; //Original Notify member used to notify the user when something occurs
|
||||
CN64System * const _System;
|
||||
CN64Rom * const _Rom; //Current loaded ROM
|
||||
CN64Rom * const _Rom2; //Current loaded ROM
|
||||
CRegisters * const _Reg;
|
||||
CMipsMemory_CallBack * const CBClass;
|
||||
#endif
|
||||
CMipsMemory_CallBack * const m_CBClass;
|
||||
|
||||
#ifdef toremove
|
||||
//Save Chips accessed by memory
|
||||
/*CSram * m_Sram;
|
||||
CFlashRam * m_FlashRam;
|
||||
bool m_SavesReadOnly;
|
||||
|
||||
//Writing to the rom
|
||||
bool m_WrittenToRom;
|
||||
DWORD m_WroteToRom;
|
||||
*/
|
||||
#endif
|
||||
|
||||
//Memory Locations
|
||||
BYTE * RDRAM, * DMEM, * IMEM, * ROM, PIF_Ram[0x40];
|
||||
DWORD m_RomFileSize;
|
||||
BYTE * m_RDRAM, * m_DMEM, * m_IMEM, m_PIF_Ram[0x40];
|
||||
DWORD m_AllocatedRdramSize;
|
||||
|
||||
//Rom Information
|
||||
bool m_RomMapped;
|
||||
BYTE * m_Rom;
|
||||
DWORD m_RomSize;
|
||||
bool m_RomWrittenTo;
|
||||
DWORD m_RomWroteValue;
|
||||
|
||||
// Recompiler
|
||||
void ** JumpTable/*, ** DelaySlotTable*/;
|
||||
BYTE * m_RecompCode;
|
||||
|
@ -66,6 +117,7 @@ class CMipsMemory :
|
|||
void UpdateHalfLine ( void );
|
||||
DWORD m_HalfLine;
|
||||
DWORD m_MemoryStack;
|
||||
DWORD m_TempValue;
|
||||
|
||||
//Searching memory
|
||||
BYTE * m_MemoryState;
|
||||
|
@ -75,44 +127,59 @@ class CMipsMemory :
|
|||
void AllocateSystemMemory ( void );
|
||||
void InitalizeSystem ( bool PostPif );
|
||||
void FixRDramSize ( void );
|
||||
void FreeMemory ( void );
|
||||
|
||||
//Loading from/Storing to Non Memory
|
||||
bool LoadByte_NonMemory ( DWORD PAddr, BYTE * Value )
|
||||
{
|
||||
DWORD dwValue;
|
||||
int Result = r4300i_LB_NonMemory(PAddr,&dwValue, false);
|
||||
*Value = (BYTE)dwValue;
|
||||
return Result != 0;
|
||||
}
|
||||
|
||||
bool LoadHalf_NonMemory ( DWORD PAddr, WORD * Value )
|
||||
{
|
||||
DWORD dwValue;
|
||||
int Result = r4300i_LH_NonMemory(PAddr,&dwValue, false);
|
||||
*Value = (WORD)dwValue;
|
||||
return Result != 0;
|
||||
}
|
||||
bool LoadWord_NonMemory ( DWORD PAddr, DWORD * Value ) { return r4300i_LW_NonMemory(PAddr,Value) != 0; }
|
||||
bool StoreByte_NonMemory ( DWORD PAddr, BYTE Value ) { return r4300i_SB_NonMemory(PAddr,Value) != 0; }
|
||||
bool StoreHalf_NonMemory ( DWORD PAddr, WORD Value ) { return r4300i_SH_NonMemory(PAddr,Value) != 0; }
|
||||
bool StoreWord_NonMemory ( DWORD PAddr, DWORD Value ) { return r4300i_SW_NonMemory(PAddr,Value) != 0; }
|
||||
|
||||
//DMAing data around memory
|
||||
/*void PI_DMA_Read ( void );
|
||||
void PI_DMA_Write ( void );
|
||||
void SI_DMA_READ ( void );
|
||||
void SI_DMA_WRITE ( void );
|
||||
void SP_DMA_READ ( void );
|
||||
void SP_DMA_WRITE ( void );
|
||||
|
||||
//Fix up
|
||||
void WriteRDRAMSize ( void );*/
|
||||
public:
|
||||
CMipsMemory ( CMipsMemory_CallBack * CallBack, CN64System * System, CN64Rom * CurrentRom, CNotification * Notify, CRegisters * RegSet, bool SavesReadOnly = false );
|
||||
~CMipsMemory ( void );
|
||||
CMipsMemoryVM ( CMipsMemory_CallBack * CallBack );
|
||||
~CMipsMemoryVM ( void );
|
||||
|
||||
//Get a pointer to the system registers
|
||||
CRegisters * SystemRegisters ( void ) { return _Reg; }
|
||||
BOOL Initialize ( void );
|
||||
|
||||
BYTE * Rdram ( void );
|
||||
DWORD RdramSize ( void );
|
||||
BYTE * Dmem ( void );
|
||||
BYTE * Imem ( void );
|
||||
BYTE * PifRam ( void );
|
||||
|
||||
BOOL LB_VAddr ( DWORD VAddr, BYTE & Value );
|
||||
BOOL LH_VAddr ( DWORD VAddr, WORD & Value );
|
||||
BOOL LW_VAddr ( DWORD VAddr, DWORD & Value );
|
||||
BOOL LD_VAddr ( DWORD VAddr, QWORD & Value );
|
||||
|
||||
BOOL SB_VAddr ( DWORD VAddr, BYTE Value );
|
||||
BOOL SH_VAddr ( DWORD VAddr, WORD Value );
|
||||
BOOL SW_VAddr ( DWORD VAddr, DWORD Value );
|
||||
BOOL SD_VAddr ( DWORD VAddr, QWORD Value );
|
||||
|
||||
bool ValidVaddr ( DWORD VAddr ) const;
|
||||
|
||||
int MemoryFilter ( DWORD dwExptCode, void * lpExceptionPointer );
|
||||
|
||||
//Protect the Memory from being written to
|
||||
void ProtectMemory ( DWORD StartVaddr, DWORD EndVaddr );
|
||||
void UnProtectMemory ( DWORD StartVaddr, DWORD EndVaddr );
|
||||
|
||||
//Compilation Functions
|
||||
void ResetMemoryStack ( CBlockSection * Section );
|
||||
void Compile_LB ( int Reg, DWORD Addr, BOOL SignExtend );
|
||||
void Compile_LH ( int Reg, DWORD Addr, BOOL SignExtend );
|
||||
void Compile_LW ( CBlockSection * Section, int Reg, DWORD Addr );
|
||||
void Compile_SB_Const ( BYTE Value, DWORD Addr );
|
||||
void Compile_SB_Register ( int x86Reg, DWORD Addr );
|
||||
void Compile_SH_Const ( WORD Value, DWORD Addr );
|
||||
void Compile_SH_Register ( int x86Reg, DWORD Addr );
|
||||
void Compile_SW_Const ( DWORD Value, DWORD Addr );
|
||||
void Compile_SW_Register ( CBlockSection * Section, int x86Reg, DWORD Addr );
|
||||
|
||||
//Functions for TLB notification
|
||||
void TLB_Mapped ( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly );
|
||||
void TLB_Unmaped ( DWORD Vaddr, DWORD Len );
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Recompiler Memory
|
||||
bool AllocateRecompilerMemory ( bool AllocateJumpTable );
|
||||
|
@ -122,19 +189,14 @@ public:
|
|||
|
||||
void CheckRecompMem ( BYTE * RecompPos );
|
||||
|
||||
//Accessing Memory
|
||||
#ifdef toremove
|
||||
bool LoadPhysical32 ( DWORD PAddr, DWORD & Variable, MemorySize Size, bool SignExtend );
|
||||
bool Load32 ( DWORD VAddr, DWORD & Variable, MemorySize Size, bool SignExtend );
|
||||
bool Load64 ( DWORD VAddr, QWORD & Variable, MemorySize Size, bool SignExtend );
|
||||
bool Store64 ( DWORD VAddr, QWORD Value, MemorySize Size );
|
||||
bool StorePhysical64 ( DWORD PAddr, QWORD Value, MemorySize Size );
|
||||
|
||||
//Protect the Memory from being written to
|
||||
void ProtectMemory ( DWORD StartVaddr, DWORD EndVaddr );
|
||||
void UnProtectMemory ( DWORD StartVaddr, DWORD EndVaddr );
|
||||
|
||||
inline DWORD RomFileSize ( void ) { return m_RomFileSize; }
|
||||
inline DWORD RdramSize ( void ) { return m_AllocatedRdramSize; }
|
||||
|
||||
//Win32 exception handler
|
||||
void MemoryFilterFailed ( char * FailureType, DWORD MipsAddress, DWORD x86Address, DWORD Value);
|
||||
|
@ -158,4 +220,26 @@ public:
|
|||
DWORD &StartAddress, DWORD &Len,
|
||||
DWORD &OldValue, DWORD &NewValue );
|
||||
bool SearchForValue (DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len);
|
||||
#endif
|
||||
|
||||
// Labels
|
||||
LPCTSTR LabelName ( DWORD Address ) const;
|
||||
|
||||
private:
|
||||
int LB_NonMemory ( DWORD PAddr, DWORD * Value, BOOL SignExtend );
|
||||
int LH_NonMemory ( DWORD PAddr, DWORD * Value, int SignExtend );
|
||||
int LW_NonMemory ( DWORD PAddr, DWORD * Value );
|
||||
|
||||
int SB_NonMemory ( DWORD PAddr, BYTE Value );
|
||||
int SH_NonMemory ( DWORD PAddr, WORD Value );
|
||||
int SW_NonMemory ( DWORD PAddr, DWORD Value );
|
||||
|
||||
mutable char m_strLabelName[100];
|
||||
|
||||
//BIG look up table to quickly translate the tlb to real mem address
|
||||
DWORD * m_TLB_ReadMap;
|
||||
DWORD * m_TLB_WriteMap;
|
||||
};
|
||||
|
||||
extern void ** JumpTable;
|
||||
extern BYTE *RecompCode, *RecompPos;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,13 +1,13 @@
|
|||
#include "..\..\N64 System.h"
|
||||
|
||||
extern CLog TlbLog;
|
||||
COpcodeAnalysis::COpcodeAnalysis(CMipsMemory * MMU, OPCODE &opcode) :
|
||||
m_opcode(opcode),_MMU(MMU),_Notify(Notify())
|
||||
COpcodeAnalysis::COpcodeAnalysis(OPCODE &opcode) :
|
||||
m_opcode(opcode)
|
||||
{
|
||||
}
|
||||
|
||||
bool COpcodeAnalysis::DelaySlotEffectsCompare (DWORD Reg1, DWORD Reg2) {
|
||||
COpcode DelayOp(_MMU,m_opcode.VirtualAddress + 4);
|
||||
COpcode DelayOp(m_opcode.VirtualAddress + 4);
|
||||
|
||||
switch (DelayOp.m_opcode.op) {
|
||||
case R4300i_SPECIAL:
|
||||
|
@ -197,7 +197,7 @@ bool COpcodeAnalysis::DelaySlotEffectsJump (void) {
|
|||
case R4300i_COP1_BC_BCFL:
|
||||
case R4300i_COP1_BC_BCTL:
|
||||
{
|
||||
COpcode DelayOp(_MMU,m_opcode.VirtualAddress + 4);
|
||||
COpcode DelayOp(m_opcode.VirtualAddress + 4);
|
||||
|
||||
if (DelayOp.m_opcode.op == R4300i_CP1) {
|
||||
if (DelayOp.m_opcode.fmt == R4300i_COP1_S && (DelayOp.m_opcode.funct & 0x30) == 0x30 ) {
|
||||
|
@ -430,7 +430,7 @@ stdstr COpcodeAnalysis::FullName(bool * MultipleOps) {
|
|||
DWORD Value = m_opcode.immediate * 0x10000;
|
||||
int Register = m_opcode.rt;
|
||||
|
||||
COpcode NextOp(_MMU,m_opcode.VirtualAddress + 4);
|
||||
COpcode NextOp(m_opcode.VirtualAddress + 4);
|
||||
if ((NextOp.m_opcode.op == R4300i_ADDIU || NextOp.m_opcode.op == R4300i_ORI) &&
|
||||
NextOp.m_opcode.rt == m_opcode.rt && NextOp.m_opcode.rs == m_opcode.rt)
|
||||
{
|
||||
|
@ -458,7 +458,7 @@ stdstr COpcodeAnalysis::FullName(bool * MultipleOps) {
|
|||
OpParam = stdstr(Param);
|
||||
}
|
||||
|
||||
_Notify.BreakPoint(__FILE__,__LINE__);
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
// if (OpName.length() == 0) { OpName = OpcodeName(); }
|
||||
// if (OpParam.length() == 0) { OpParam = OpcodeParam(); }
|
||||
while (OpName.length() < 7) { OpName += " "; }
|
||||
|
@ -922,26 +922,26 @@ void COpcodeAnalysis::OpcodeParam(char * CommandName)
|
|||
break;
|
||||
case R4300i_J:
|
||||
case R4300i_JAL:
|
||||
sprintf(CommandName,"%s",_MMU->LabelName((m_opcode.VirtualAddress & 0xF0000000) + (m_opcode.target << 2)).c_str());
|
||||
sprintf(CommandName,"%s",_Labels->LabelName((m_opcode.VirtualAddress & 0xF0000000) + (m_opcode.target << 2)));
|
||||
break;
|
||||
case R4300i_BEQ:
|
||||
if (m_opcode.rs == 0 && m_opcode.rt == 0) {
|
||||
sprintf(CommandName,"%s", _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s", _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else if (m_opcode.rs == 0 || m_opcode.rt == 0) {
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs == 0 ? m_opcode.rt : m_opcode.rs ],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else {
|
||||
sprintf(CommandName,"%s, %s, %s", GPR_Name[m_opcode.rs], GPR_Name[m_opcode.rt],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
}
|
||||
break;
|
||||
case R4300i_BNE:
|
||||
if ((m_opcode.rs == 0) ^ (m_opcode.rt == 0)){
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs == 0 ? m_opcode.rt : m_opcode.rs ],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else {
|
||||
sprintf(CommandName,"%s, %s, %s", GPR_Name[m_opcode.rs], GPR_Name[m_opcode.rt],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
}
|
||||
break;
|
||||
case R4300i_REGIMM:
|
||||
|
@ -952,14 +952,14 @@ void COpcodeAnalysis::OpcodeParam(char * CommandName)
|
|||
case R4300i_REGIMM_BLTZAL:
|
||||
case R4300i_REGIMM_BLTZALL:
|
||||
case R4300i_REGIMM_BGEZALL:
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs], _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs], _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
break;
|
||||
case R4300i_REGIMM_BGEZ:
|
||||
case R4300i_REGIMM_BGEZAL:
|
||||
if (m_opcode.rs == 0) {
|
||||
sprintf(CommandName,"%s", _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s", _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else {
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs], _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs], _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
}
|
||||
break;
|
||||
case R4300i_REGIMM_TGEI:
|
||||
|
@ -974,7 +974,7 @@ void COpcodeAnalysis::OpcodeParam(char * CommandName)
|
|||
break;
|
||||
case R4300i_BLEZ:
|
||||
case R4300i_BGTZ:
|
||||
sprintf(CommandName,"%s, %s",GPR_Name[m_opcode.rs], _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s, %s",GPR_Name[m_opcode.rs], _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
break;
|
||||
case R4300i_ADDI:
|
||||
case R4300i_ADDIU:
|
||||
|
@ -1029,7 +1029,7 @@ void COpcodeAnalysis::OpcodeParam(char * CommandName)
|
|||
case R4300i_COP1_BC_BCT:
|
||||
case R4300i_COP1_BC_BCFL:
|
||||
case R4300i_COP1_BC_BCTL:
|
||||
sprintf(CommandName,"%s",_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s",_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1086,27 +1086,27 @@ void COpcodeAnalysis::OpcodeParam(char * CommandName)
|
|||
break;
|
||||
case R4300i_BEQL:
|
||||
if (m_opcode.rs == m_opcode.rt) {
|
||||
sprintf(CommandName,"%s", _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s", _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else if ((m_opcode.rs == 0) ^ (m_opcode.rt == 0)){
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs == 0 ? m_opcode.rt : m_opcode.rs ],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else {
|
||||
sprintf(CommandName,"%s, %s, %s", GPR_Name[m_opcode.rs], GPR_Name[m_opcode.rt],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
}
|
||||
break;
|
||||
case R4300i_BNEL:
|
||||
if ((m_opcode.rs == 0) ^ (m_opcode.rt == 0)){
|
||||
sprintf(CommandName,"%s, %s", GPR_Name[m_opcode.rs == 0 ? m_opcode.rt : m_opcode.rs ],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
} else {
|
||||
sprintf(CommandName,"%s, %s, %s", GPR_Name[m_opcode.rs], GPR_Name[m_opcode.rt],
|
||||
_MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
_Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
}
|
||||
break;
|
||||
case R4300i_BLEZL:
|
||||
case R4300i_BGTZL:
|
||||
sprintf(CommandName,"%s, %s",GPR_Name[m_opcode.rs], _MMU->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4).c_str());
|
||||
sprintf(CommandName,"%s, %s",GPR_Name[m_opcode.rs], _Labels->LabelName(m_opcode.VirtualAddress + ((short)m_opcode.offset << 2) + 4));
|
||||
break;
|
||||
case R4300i_DADDI:
|
||||
case R4300i_DADDIU:
|
||||
|
|
|
@ -2,11 +2,9 @@ class COpcodeAnalysis :
|
|||
private CRegistersName
|
||||
{
|
||||
OPCODE &m_opcode;
|
||||
CMipsMemory * const _MMU;
|
||||
CNotification & _Notify;
|
||||
|
||||
public:
|
||||
COpcodeAnalysis(CMipsMemory * MMU, OPCODE &opcode);
|
||||
COpcodeAnalysis(OPCODE &opcode);
|
||||
|
||||
//Functions dealing with the name of the opcode
|
||||
const char * OpcodeName ( void );
|
||||
|
|
|
@ -22,10 +22,8 @@ DWORD const COpcode::SWR_MASK[4] = { 0x00FFFFFF,0x0000FFFF,0x000000FF,0x00000000
|
|||
int const COpcode::WL_SHIFT[4] = { 0, 8, 16, 24 };
|
||||
int const COpcode::WR_SHIFT[4] = { 24, 16 , 8, 0 };
|
||||
|
||||
COpcode::COpcode ( CMipsMemory * MMU, DWORD VirtualAddress ):
|
||||
COpcodeAnalysis(MMU,m_opcode),
|
||||
_MMU(MMU),
|
||||
_Reg(MMU->SystemRegisters()),
|
||||
COpcode::COpcode ( DWORD VirtualAddress ):
|
||||
COpcodeAnalysis(m_opcode),
|
||||
m_OpLen(OpCode_Size),
|
||||
m_OpcodeCount(_Settings->LoadDword(Game_CounterFactor)),
|
||||
m_FixedOpcodeCount(_Settings->LoadDword(Game_CounterFactor) != 0)
|
||||
|
@ -88,7 +86,7 @@ bool COpcode::Next (void) {
|
|||
Notify().BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
|
||||
if (!_MMU->Load32(m_opcode.VirtualAddress,m_opcode.Hex,_32Bit,false)) {
|
||||
if (!_MMU->LW_VAddr(m_opcode.VirtualAddress,m_opcode.Hex)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -155,9 +155,6 @@ class CRecompilerOps;
|
|||
class COpcode : public COpcodeAnalysis {
|
||||
friend CRecompilerOps; //Can manipulate how the opcode moves
|
||||
|
||||
CMipsMemory * const _MMU;
|
||||
CRegisters * const _Reg;
|
||||
|
||||
DWORD const m_OpLen; //Length of the current opcode (MIPS will always be 4)
|
||||
bool const m_FixedOpcodeCount; //Is the opcode count fixed or is it variable
|
||||
float const m_OpcodeCount; //how many cycles is the fixed opcode count
|
||||
|
@ -167,7 +164,7 @@ class COpcode : public COpcodeAnalysis {
|
|||
|
||||
public:
|
||||
//Constructor/deconstructor
|
||||
COpcode ( CMipsMemory * MMU, DWORD VirtualAddress );
|
||||
COpcode ( DWORD VirtualAddress );
|
||||
|
||||
//Geting/changing details about the opcode stored
|
||||
bool Next ( void ); //move to the next opcode, if it is a jump returns true
|
||||
|
|
|
@ -136,7 +136,7 @@ SigProcessor_InterfaceReg::SigProcessor_InterfaceReg(DWORD * _SignalProcessorInt
|
|||
{
|
||||
}
|
||||
|
||||
void CRegisters::InitalizeR4300iRegisters (CMipsMemory * MMU, bool PostPif, int Country, CICChip CIC_Chip)
|
||||
void CRegisters::InitalizeR4300iRegisters (CMipsMemory & MMU, bool PostPif, int Country, CICChip CIC_Chip)
|
||||
{
|
||||
//Reset General Registers
|
||||
memset(GPR,0,sizeof(GPR));
|
||||
|
@ -214,7 +214,7 @@ void CRegisters::InitalizeR4300iRegisters (CMipsMemory * MMU, bool PostPif, int
|
|||
GPR[24].DW=0x0000000000000000;
|
||||
break;
|
||||
case CIC_NUS_6105:
|
||||
MMU->Store64(0xA4001004,0xBDA807FC,_32Bit);
|
||||
MMU.SW_VAddr(0xA4001004,0xBDA807FC);
|
||||
GPR[5].DW=0xFFFFFFFFDECAAAD1;
|
||||
GPR[14].DW=0x000000000CF85C13;
|
||||
GPR[24].DW=0x0000000000000002;
|
||||
|
@ -242,7 +242,7 @@ void CRegisters::InitalizeR4300iRegisters (CMipsMemory * MMU, bool PostPif, int
|
|||
GPR[14].DW=0x000000005BACA1DF;
|
||||
break;
|
||||
case CIC_NUS_6105:
|
||||
MMU->Store64(0xA4001004,0x8DA807FC,_32Bit);
|
||||
MMU.SW_VAddr(0xA4001004,0x8DA807FC);
|
||||
GPR[5].DW=0x000000005493FB9A;
|
||||
GPR[14].DW=0xFFFFFFFFC2C20384;
|
||||
case CIC_NUS_6106:
|
||||
|
@ -283,13 +283,13 @@ void CRegisters::InitalizeR4300iRegisters (CMipsMemory * MMU, bool PostPif, int
|
|||
GPR[25].DW=0xFFFFFFFF825B21C9;
|
||||
break;
|
||||
case CIC_NUS_6105:
|
||||
MMU->Store64(0xA4001000,0x3C0DBFC0,_32Bit);
|
||||
MMU->Store64(0xA4001008,0x25AD07C0,_32Bit);
|
||||
MMU->Store64(0xA400100C,0x31080080,_32Bit);
|
||||
MMU->Store64(0xA4001010,0x5500FFFC,_32Bit);
|
||||
MMU->Store64(0xA4001014,0x3C0DBFC0,_32Bit);
|
||||
MMU->Store64(0xA4001018,0x8DA80024,_32Bit);
|
||||
MMU->Store64(0xA400101C,0x3C0BB000,_32Bit);
|
||||
MMU.SW_VAddr(0xA4001000,0x3C0DBFC0);
|
||||
MMU.SW_VAddr(0xA4001008,0x25AD07C0);
|
||||
MMU.SW_VAddr(0xA400100C,0x31080080);
|
||||
MMU.SW_VAddr(0xA4001010,0x5500FFFC);
|
||||
MMU.SW_VAddr(0xA4001014,0x3C0DBFC0);
|
||||
MMU.SW_VAddr(0xA4001018,0x8DA80024);
|
||||
MMU.SW_VAddr(0xA400101C,0x3C0BB000);
|
||||
GPR[1].DW=0x0000000000000000;
|
||||
GPR[2].DW=0xFFFFFFFFF58B0FBF;
|
||||
GPR[3].DW=0xFFFFFFFFF58B0FBF;
|
||||
|
@ -354,7 +354,7 @@ void CRegisters::CheckInterrupts ( void ) {
|
|||
if (( STATUS_REGISTER & STATUS_ERL ) != 0 ) { return; }
|
||||
|
||||
if (( STATUS_REGISTER & FAKE_CAUSE_REGISTER & 0xFF00) != 0) {
|
||||
_System->ExternalEvent(ExecuteInterrupt);
|
||||
_N64System->ExternalEvent(ExecuteInterrupt);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -164,10 +164,6 @@ enum {
|
|||
MI_CLR_RDRAM = 0x1000, /* Bit 12: clear RDRAM reg */
|
||||
MI_SET_RDRAM = 0x2000, /* Bit 13: set RDRAM reg mode */
|
||||
|
||||
MI_MODE_INIT = 0x0080, /* Bit 7: init mode */
|
||||
MI_MODE_EBUS = 0x0100, /* Bit 8: ebus test mode */
|
||||
MI_MODE_RDRAM = 0x0200, /* Bit 9: RDRAM reg mode */
|
||||
|
||||
//Flags for writing to MI_INTR_MASK_REG
|
||||
MI_INTR_MASK_CLR_SP = 0x0001, /* Bit 0: clear SP mask */
|
||||
MI_INTR_MASK_SET_SP = 0x0002, /* Bit 1: set SP mask */
|
||||
|
@ -318,47 +314,47 @@ public:
|
|||
|
||||
//Signal Processor interface flags
|
||||
enum {
|
||||
SP_CLR_HALT = 0x00001, /* Bit 0: clear halt */
|
||||
SP_SET_HALT = 0x00002, /* Bit 1: set halt */
|
||||
SP_CLR_BROKE = 0x00004, /* Bit 2: clear broke */
|
||||
SP_CLR_INTR = 0x00008, /* Bit 3: clear intr */
|
||||
SP_SET_INTR = 0x00010, /* Bit 4: set intr */
|
||||
SP_CLR_SSTEP = 0x00020, /* Bit 5: clear sstep */
|
||||
SP_SET_SSTEP = 0x00040, /* Bit 6: set sstep */
|
||||
SP_CLR_INTR_BREAK = 0x00080, /* Bit 7: clear intr on break */
|
||||
SP_SET_INTR_BREAK = 0x00100, /* Bit 8: set intr on break */
|
||||
SP_CLR_SIG0 = 0x00200, /* Bit 9: clear signal 0 */
|
||||
SP_SET_SIG0 = 0x00400, /* Bit 10: set signal 0 */
|
||||
SP_CLR_SIG1 = 0x00800, /* Bit 11: clear signal 1 */
|
||||
SP_SET_SIG1 = 0x01000, /* Bit 12: set signal 1 */
|
||||
SP_CLR_SIG2 = 0x02000, /* Bit 13: clear signal 2 */
|
||||
SP_SET_SIG2 = 0x04000, /* Bit 14: set signal 2 */
|
||||
SP_CLR_SIG3 = 0x08000, /* Bit 15: clear signal 3 */
|
||||
SP_SET_SIG3 = 0x10000, /* Bit 16: set signal 3 */
|
||||
SP_CLR_SIG4 = 0x20000, /* Bit 17: clear signal 4 */
|
||||
SP_SET_SIG4 = 0x40000, /* Bit 18: set signal 4 */
|
||||
SP_CLR_SIG5 = 0x80000, /* Bit 19: clear signal 5 */
|
||||
SP_SET_SIG5 = 0x100000, /* Bit 20: set signal 5 */
|
||||
SP_CLR_SIG6 = 0x200000, /* Bit 21: clear signal 6 */
|
||||
SP_SET_SIG6 = 0x400000, /* Bit 22: set signal 6 */
|
||||
SP_CLR_SIG7 = 0x800000, /* Bit 23: clear signal 7 */
|
||||
SP_SET_SIG7 = 0x1000000, /* Bit 24: set signal 7 */
|
||||
SP_CLR_HALT = 0x00001, /* Bit 0: clear halt */
|
||||
SP_SET_HALT = 0x00002, /* Bit 1: set halt */
|
||||
SP_CLR_BROKE = 0x00004, /* Bit 2: clear broke */
|
||||
SP_CLR_INTR = 0x00008, /* Bit 3: clear intr */
|
||||
SP_SET_INTR = 0x00010, /* Bit 4: set intr */
|
||||
SP_CLR_SSTEP = 0x00020, /* Bit 5: clear sstep */
|
||||
SP_SET_SSTEP = 0x00040, /* Bit 6: set sstep */
|
||||
SP_CLR_INTR_BREAK = 0x00080, /* Bit 7: clear intr on break */
|
||||
SP_SET_INTR_BREAK = 0x00100, /* Bit 8: set intr on break */
|
||||
SP_CLR_SIG0 = 0x00200, /* Bit 9: clear signal 0 */
|
||||
SP_SET_SIG0 = 0x00400, /* Bit 10: set signal 0 */
|
||||
SP_CLR_SIG1 = 0x00800, /* Bit 11: clear signal 1 */
|
||||
SP_SET_SIG1 = 0x01000, /* Bit 12: set signal 1 */
|
||||
SP_CLR_SIG2 = 0x02000, /* Bit 13: clear signal 2 */
|
||||
SP_SET_SIG2 = 0x04000, /* Bit 14: set signal 2 */
|
||||
SP_CLR_SIG3 = 0x08000, /* Bit 15: clear signal 3 */
|
||||
SP_SET_SIG3 = 0x10000, /* Bit 16: set signal 3 */
|
||||
SP_CLR_SIG4 = 0x20000, /* Bit 17: clear signal 4 */
|
||||
SP_SET_SIG4 = 0x40000, /* Bit 18: set signal 4 */
|
||||
SP_CLR_SIG5 = 0x80000, /* Bit 19: clear signal 5 */
|
||||
SP_SET_SIG5 = 0x100000, /* Bit 20: set signal 5 */
|
||||
SP_CLR_SIG6 = 0x200000, /* Bit 21: clear signal 6 */
|
||||
SP_SET_SIG6 = 0x400000, /* Bit 22: set signal 6 */
|
||||
SP_CLR_SIG7 = 0x800000, /* Bit 23: clear signal 7 */
|
||||
SP_SET_SIG7 = 0x1000000, /* Bit 24: set signal 7 */
|
||||
|
||||
SP_STATUS_HALT = 0x001, /* Bit 0: halt */
|
||||
SP_STATUS_BROKE = 0x002, /* Bit 1: broke */
|
||||
SP_STATUS_DMA_BUSY = 0x004, /* Bit 2: dma busy */
|
||||
SP_STATUS_DMA_FULL = 0x008, /* Bit 3: dma full */
|
||||
SP_STATUS_IO_FULL = 0x010, /* Bit 4: io full */
|
||||
SP_STATUS_SSTEP = 0x020, /* Bit 5: single step */
|
||||
SP_STATUS_INTR_BREAK= 0x040, /* Bit 6: interrupt on break */
|
||||
SP_STATUS_SIG0 = 0x080, /* Bit 7: signal 0 set */
|
||||
SP_STATUS_SIG1 = 0x100, /* Bit 8: signal 1 set */
|
||||
SP_STATUS_SIG2 = 0x200, /* Bit 9: signal 2 set */
|
||||
SP_STATUS_SIG3 = 0x400, /* Bit 10: signal 3 set */
|
||||
SP_STATUS_SIG4 = 0x800, /* Bit 11: signal 4 set */
|
||||
SP_STATUS_SIG5 = 0x1000, /* Bit 12: signal 5 set */
|
||||
SP_STATUS_SIG6 = 0x2000, /* Bit 13: signal 6 set */
|
||||
SP_STATUS_SIG7 = 0x4000, /* Bit 14: signal 7 set */
|
||||
SP_STATUS_HALT = 0x001, /* Bit 0: halt */
|
||||
SP_STATUS_BROKE = 0x002, /* Bit 1: broke */
|
||||
SP_STATUS_DMA_BUSY = 0x004, /* Bit 2: dma busy */
|
||||
SP_STATUS_DMA_FULL = 0x008, /* Bit 3: dma full */
|
||||
SP_STATUS_IO_FULL = 0x010, /* Bit 4: io full */
|
||||
SP_STATUS_SSTEP = 0x020, /* Bit 5: single step */
|
||||
SP_STATUS_INTR_BREAK = 0x040, /* Bit 6: interrupt on break */
|
||||
SP_STATUS_SIG0 = 0x080, /* Bit 7: signal 0 set */
|
||||
SP_STATUS_SIG1 = 0x100, /* Bit 8: signal 1 set */
|
||||
SP_STATUS_SIG2 = 0x200, /* Bit 9: signal 2 set */
|
||||
SP_STATUS_SIG3 = 0x400, /* Bit 10: signal 3 set */
|
||||
SP_STATUS_SIG4 = 0x800, /* Bit 11: signal 4 set */
|
||||
SP_STATUS_SIG5 = 0x1000, /* Bit 12: signal 5 set */
|
||||
SP_STATUS_SIG6 = 0x2000, /* Bit 13: signal 6 set */
|
||||
SP_STATUS_SIG7 = 0x4000, /* Bit 14: signal 7 set */
|
||||
};
|
||||
|
||||
//Peripheral Interface
|
||||
|
@ -426,21 +422,15 @@ class CRegisters:
|
|||
public CSystemTimer,
|
||||
public CRegistersName
|
||||
{
|
||||
CN64System * const _System;
|
||||
CNotification * const _Notify;
|
||||
|
||||
public:
|
||||
//Constructor/Deconstructor
|
||||
CRegisters ( CN64System * System, CNotification * Notify ) :
|
||||
CSystemTimer(System,Notify),
|
||||
CRegisters ( void ) :
|
||||
CP0registers(CP0),
|
||||
AudioInterfaceReg(Audio_Interface),
|
||||
Mips_InterfaceReg(Mips_Interface),
|
||||
Video_InterfaceReg(Video_Interface),
|
||||
SigProcessor_InterfaceReg(SigProcessor_Interface),
|
||||
DisplayControlReg(Display_ControlReg),
|
||||
_System(System),
|
||||
_Notify(Notify)
|
||||
DisplayControlReg(Display_ControlReg)
|
||||
{
|
||||
FixFpuLocations();
|
||||
}
|
||||
|
@ -473,7 +463,7 @@ public:
|
|||
DWORD AudioIntrReg;
|
||||
|
||||
|
||||
void InitalizeR4300iRegisters ( CMipsMemory * MMU, bool PostPif, int Country, CICChip CIC_Chip);
|
||||
void InitalizeR4300iRegisters ( CMipsMemory & MMU, bool PostPif, int Country, CICChip CIC_Chip);
|
||||
void CheckInterrupts ( void );
|
||||
void ExecuteCopUnusableException ( bool DelaySlot, int Coprocessor );
|
||||
void ExecuteInterruptException ( bool DelaySlot );
|
||||
|
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
extern CLog TlbLog;
|
||||
|
||||
CSystemTimer::CSystemTimer(CN64System * System, CNotification * Notify) :
|
||||
_System(System),
|
||||
_Notify(Notify)
|
||||
CSystemTimer::CSystemTimer( void )
|
||||
{
|
||||
ResetTimer(50000);
|
||||
}
|
||||
|
@ -35,11 +33,11 @@ void CSystemTimer::CheckTimer (void) {
|
|||
// TlbLog.Log("%s: Timer = %d, CurrentTimerType = %d",_System->GetRecompiler() ? "Recomp" : "Interp",Timer, CurrentTimerType);
|
||||
|
||||
switch (CurrentTimerType) {
|
||||
case ViTimer: _System->ExternalEvent(TimerDone_Vi); break;
|
||||
case AiTimer: _System->ExternalEvent(TimerDone_Ai); break;
|
||||
case AiTimerDMA: _System->ExternalEvent(TimerDone_AiDMA); break;
|
||||
case RSPTimerDlist:_System->ExternalEvent(TimerDone_RSPDlist); break;
|
||||
case CompareTimer: _System->ExternalEvent(TimerDone_Compare); break;
|
||||
case ViTimer: _N64System->ExternalEvent(TimerDone_Vi); break;
|
||||
case AiTimer: _N64System->ExternalEvent(TimerDone_Ai); break;
|
||||
case AiTimerDMA: _N64System->ExternalEvent(TimerDone_AiDMA); break;
|
||||
case RSPTimerDlist:_N64System->ExternalEvent(TimerDone_RSPDlist); break;
|
||||
case CompareTimer: _N64System->ExternalEvent(TimerDone_Compare); break;
|
||||
default:
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
|
|
|
@ -7,19 +7,17 @@ typedef struct {
|
|||
|
||||
class CC_Core;
|
||||
|
||||
class CSystemTimer {
|
||||
class CSystemTimer
|
||||
{
|
||||
friend CC_Core;
|
||||
|
||||
CN64System * const _System; //Main system being run .. pass back any times that occur
|
||||
CNotification * const _Notify;
|
||||
|
||||
TIMER_DETAILS TimerDetatils[MaxTimer];
|
||||
int Timer; //How many cycles to the next event
|
||||
TimerType CurrentTimerType;
|
||||
|
||||
void FixTimers ( void );
|
||||
public:
|
||||
CSystemTimer ( CN64System * System, CNotification * Notify );
|
||||
CSystemTimer ( void );
|
||||
void CheckTimer ( void );
|
||||
void ChangeTimerRelative ( TimerType Type, DWORD Cycles );
|
||||
void ChangeTimerFixed ( TimerType Type, DWORD Cycles );
|
||||
|
|
|
@ -1,130 +1,116 @@
|
|||
typedef struct {
|
||||
bool EntryDefined;
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned zero : 13;
|
||||
unsigned Mask : 12;
|
||||
unsigned zero2 : 7;
|
||||
} ;
|
||||
|
||||
} PageMask;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned ASID : 8;
|
||||
unsigned Zero : 4;
|
||||
unsigned G : 1;
|
||||
unsigned VPN2 : 19;
|
||||
};
|
||||
|
||||
} EntryHi;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned GLOBAL: 1;
|
||||
unsigned V : 1;
|
||||
unsigned D : 1;
|
||||
unsigned C : 3;
|
||||
unsigned PFN : 20;
|
||||
unsigned ZERO: 6;
|
||||
} ;
|
||||
|
||||
} EntryLo0;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned GLOBAL: 1;
|
||||
unsigned V : 1;
|
||||
unsigned D : 1;
|
||||
unsigned C : 3;
|
||||
unsigned PFN : 20;
|
||||
unsigned ZERO: 6;
|
||||
} ;
|
||||
|
||||
} EntryLo1;
|
||||
} TLB;
|
||||
|
||||
typedef struct {
|
||||
DWORD VSTART;
|
||||
DWORD VEND;
|
||||
DWORD PHYSSTART;
|
||||
DWORD PHYSEND;
|
||||
bool VALID;
|
||||
bool DIRTY;
|
||||
bool GLOBAL;
|
||||
bool ValidEntry;
|
||||
bool Random;
|
||||
bool Probed;
|
||||
} FASTTLB;
|
||||
|
||||
class CRecompilerOps;
|
||||
class CC_Core;
|
||||
class CDebugTlb;
|
||||
|
||||
class CMipsTLB_CallBack {
|
||||
public:
|
||||
|
||||
//Protected memory has been written to, returns true if that memory has been unprotected
|
||||
virtual void TLB_Changed ( void ) = 0;
|
||||
virtual void TLB_Unmapping ( int TlbEntry, int FastTlbEntry, DWORD Vaddr, DWORD Len ) = 0;
|
||||
class CTLB_CB
|
||||
{
|
||||
public:
|
||||
virtual void TLB_Mapped ( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly ) = 0;
|
||||
virtual void TLB_Unmaped ( DWORD VAddr, DWORD Len ) = 0;
|
||||
virtual void TLB_Changed ( void ) = 0;
|
||||
};
|
||||
|
||||
class CTLB
|
||||
{
|
||||
friend CN64System; //Need to manipulate all variables in loading/saveing save state
|
||||
friend CRecompilerOps; // so can manipulate for ops
|
||||
friend CC_Core;
|
||||
public:
|
||||
typedef struct {
|
||||
bool EntryDefined;
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned zero : 13;
|
||||
unsigned Mask : 12;
|
||||
unsigned zero2 : 7;
|
||||
} ;
|
||||
|
||||
} PageMask;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned ASID : 8;
|
||||
unsigned Zero : 4;
|
||||
unsigned G : 1;
|
||||
unsigned VPN2 : 19;
|
||||
};
|
||||
|
||||
} EntryHi;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned GLOBAL: 1;
|
||||
unsigned V : 1;
|
||||
unsigned D : 1;
|
||||
unsigned C : 3;
|
||||
unsigned PFN : 20;
|
||||
unsigned ZERO: 6;
|
||||
} ;
|
||||
|
||||
} EntryLo0;
|
||||
|
||||
union {
|
||||
unsigned long Value;
|
||||
unsigned char A[4];
|
||||
|
||||
struct {
|
||||
unsigned GLOBAL: 1;
|
||||
unsigned V : 1;
|
||||
unsigned D : 1;
|
||||
unsigned C : 3;
|
||||
unsigned PFN : 20;
|
||||
unsigned ZERO: 6;
|
||||
} ;
|
||||
|
||||
} EntryLo1;
|
||||
} TLB_ENTRY;
|
||||
|
||||
private:
|
||||
typedef struct {
|
||||
DWORD VSTART;
|
||||
DWORD VEND;
|
||||
DWORD PHYSSTART;
|
||||
DWORD PHYSEND;
|
||||
DWORD Length;
|
||||
bool VALID;
|
||||
bool DIRTY;
|
||||
bool GLOBAL;
|
||||
bool ValidEntry;
|
||||
bool Random;
|
||||
bool Probed;
|
||||
} FASTTLB;
|
||||
|
||||
//friend CC_Core;
|
||||
friend CDebugTlb; // enable debug window to read class
|
||||
|
||||
BYTE * const &m_BasePAddr; //Base Physical Address (eg RDRAM)
|
||||
CMipsTLB_CallBack * const CBClass;
|
||||
|
||||
//Registers
|
||||
DWORD & PROGRAM_COUNTER;
|
||||
DWORD & INDEX_REGISTER;
|
||||
DWORD & PAGE_MASK_REGISTER;
|
||||
DWORD & ENTRYHI_REGISTER;
|
||||
DWORD & ENTRYLO0_REGISTER;
|
||||
DWORD & ENTRYLO1_REGISTER;
|
||||
CTLB_CB * const m_CB;
|
||||
|
||||
TLB tlb[32];
|
||||
FASTTLB FastTlb[64];
|
||||
TLB_ENTRY m_tlb[32];
|
||||
FASTTLB m_FastTlb[64];
|
||||
|
||||
//BIG look up table to quickly translate the tlb to real mem address
|
||||
DWORD * TLB_ReadMap;
|
||||
DWORD * TLB_WriteMap;
|
||||
|
||||
void SetupTLB_Entry ( int index, bool Random );
|
||||
|
||||
public:
|
||||
CTLB ( CMipsTLB_CallBack * CallBack, BYTE * &BasePAddr, CRegisters *const & Registers );
|
||||
CTLB ( CTLB_CB * CallBack );
|
||||
~CTLB ( void );
|
||||
|
||||
void TLB_Reset ( bool InvalidateTLB );
|
||||
void Reset ( bool InvalidateTLB );
|
||||
|
||||
//Used by opcodes of the same name to manipulate the tlb (reads the registers)
|
||||
void TLB_Probe ( void );
|
||||
void TLB_ReadEntry ( void );
|
||||
void TLB_WriteEntry ( int index, bool Random );
|
||||
void Probe ( void );
|
||||
void ReadEntry ( void );
|
||||
void WriteEntry ( int index, bool Random );
|
||||
|
||||
//See if a VAddr has an entry to translate to a PAddr
|
||||
bool TLB_AddressDefined ( DWORD VAddr );
|
||||
bool AddressDefined ( DWORD VAddr );
|
||||
|
||||
|
||||
//Change the Virtual address to a Phyiscal Address
|
||||
inline bool TranslateVaddr ( DWORD VAddr, DWORD &PAddr) const
|
||||
/*inline bool TranslateVaddr ( DWORD VAddr, DWORD &PAddr) const
|
||||
{
|
||||
//Change the Virtual address to a Phyiscal Address
|
||||
if (TLB_ReadMap[VAddr >> 12] == 0) { return false; }
|
||||
|
@ -144,10 +130,7 @@ public:
|
|||
// Find a matching Virtual Addres from a phyiscal one
|
||||
bool PAddrToVAddr ( DWORD PAddr, DWORD & VAddr, DWORD & Index );
|
||||
|
||||
//find out information about the tlb
|
||||
bool TLB_EntryUsed ( int index ); //Test to see if TLB entry is valid
|
||||
int TLB_UnusedEntry ( int MinIndx );//Find a valid entry above MinIndx
|
||||
|
||||
//see if the Vaddr is valid
|
||||
inline bool ValidVaddr ( DWORD VAddr ) const { return TLB_ReadMap[VAddr >> 12] != 0; }
|
||||
*/
|
||||
};
|
||||
|
|
|
@ -1,290 +1,223 @@
|
|||
#include "..\..\N64 System.h"
|
||||
#include "../C Core/C Core Interface.h"
|
||||
#include <windows.h> //needed for memory allocation
|
||||
#include <commctrl.h> //needed for debug window
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
//CLog TlbLog("TLB Log.txt");
|
||||
|
||||
CTLB::CTLB(CMipsTLB_CallBack * CallBack, BYTE * &BasePAddr, CRegisters * const &Registers ):
|
||||
CBClass (CallBack),
|
||||
m_BasePAddr(BasePAddr),
|
||||
PROGRAM_COUNTER(Registers->PROGRAM_COUNTER),
|
||||
INDEX_REGISTER(Registers->INDEX_REGISTER),
|
||||
PAGE_MASK_REGISTER(Registers->PAGE_MASK_REGISTER),
|
||||
ENTRYHI_REGISTER(Registers->ENTRYHI_REGISTER),
|
||||
ENTRYLO0_REGISTER(Registers->ENTRYLO0_REGISTER),
|
||||
ENTRYLO1_REGISTER(Registers->ENTRYLO1_REGISTER)
|
||||
CTLB::CTLB(CTLB_CB * CallBack ):
|
||||
m_CB(CallBack)
|
||||
{
|
||||
WriteTrace(TraceTLB,"CTLB::CTLB - Start");
|
||||
TLB_ReadMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
||||
if (TLB_ReadMap == NULL) {
|
||||
Notify().FatalError(MSG_MEM_ALLOC_ERROR);
|
||||
}
|
||||
|
||||
TLB_WriteMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
|
||||
if (TLB_WriteMap == NULL) {
|
||||
Notify().FatalError(MSG_MEM_ALLOC_ERROR);
|
||||
}
|
||||
|
||||
//TLB_Reset(true);
|
||||
Reset(true);
|
||||
WriteTrace(TraceTLB,"CTLB::CTLB - Done");
|
||||
}
|
||||
|
||||
CTLB::~CTLB (void) {
|
||||
WriteTrace(TraceTLB,"CTLB::~CTLB - Done");
|
||||
VirtualFree( TLB_ReadMap, 0 , MEM_RELEASE);
|
||||
VirtualFree( TLB_WriteMap, 0 , MEM_RELEASE);
|
||||
WriteTrace(TraceTLB,"CTLB::~CTLB - Done");
|
||||
}
|
||||
|
||||
void CTLB::TLB_Reset (bool InvalidateTLB) {
|
||||
void CTLB::Reset (bool InvalidateTLB) {
|
||||
DWORD count;
|
||||
|
||||
if (InvalidateTLB) {
|
||||
for (count = 0; count < 32; count++) { tlb[count].EntryDefined = false; }
|
||||
for (count = 0; count < 64; count++)
|
||||
{
|
||||
m_FastTlb[count].ValidEntry = false;
|
||||
}
|
||||
for (count = 0; count < 64; count++) { FastTlb[count].ValidEntry = false; }
|
||||
|
||||
memset(TLB_ReadMap,0,(0xFFFFF * sizeof(DWORD)));
|
||||
memset(TLB_WriteMap,0,(0xFFFFF * sizeof(DWORD)));
|
||||
for (count = 0x80000000; count < 0xC0000000; count += 0x1000) {
|
||||
TLB_ReadMap[count >> 12] = ((DWORD)m_BasePAddr + (count & 0x1FFFFFFF)) - count;
|
||||
TLB_WriteMap[count >> 12] = ((DWORD)m_BasePAddr + (count & 0x1FFFFFFF)) - count;
|
||||
}
|
||||
for (count = 0; count < 32; count ++) { SetupTLB_Entry(count,false); }
|
||||
//GE Hack
|
||||
|
||||
if (_Settings->LoadDword(Rdb_TLB_VAddrStart) != 0)
|
||||
if (InvalidateTLB)
|
||||
{
|
||||
DWORD Start = _Settings->LoadDword(Rdb_TLB_VAddrStart); //0x7F000000;
|
||||
DWORD Len = _Settings->LoadDword(Rdb_TLB_VAddrLen); //0x01000000;
|
||||
DWORD PAddr = _Settings->LoadDword(Rdb_TLB_PAddrStart); //0x10034b30;
|
||||
DWORD End = Start + Len;
|
||||
for (count = Start; count < End; count += 0x1000) {
|
||||
TLB_ReadMap[count >> 12] = ((DWORD)m_BasePAddr + (count - Start + PAddr)) - count;
|
||||
TLB_WriteMap[count >> 12] = ((DWORD)m_BasePAddr + (count - Start + PAddr)) - count;
|
||||
for (count = 0; count < 32; count++)
|
||||
{
|
||||
m_tlb[count].EntryDefined = false;
|
||||
}
|
||||
} else {
|
||||
for (count = 0; count < 32; count ++)
|
||||
{
|
||||
SetupTLB_Entry(count,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CTLB::TLB_AddressDefined ( DWORD VAddr) {
|
||||
bool CTLB::AddressDefined ( DWORD VAddr) {
|
||||
DWORD i;
|
||||
|
||||
if (VAddr >= 0x80000000 && VAddr <= 0xBFFFFFFF) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (FastTlb[i].ValidEntry == FALSE) { continue; }
|
||||
if (VAddr >= FastTlb[i].VSTART && VAddr <= FastTlb[i].VEND) {
|
||||
//TlbLog.Log("AddressDefined from tlb entry %d",i);
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
if (m_FastTlb[i].ValidEntry &&
|
||||
VAddr >= m_FastTlb[i].VSTART &&
|
||||
VAddr <= m_FastTlb[i].VEND)
|
||||
{
|
||||
//TlbLog.Log("AddressDefined from m_tlb entry %d",i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
void CTLB::TLB_Probe (void) {
|
||||
void CTLB::Probe (void) {
|
||||
int Counter;
|
||||
|
||||
WriteTrace(TraceTLB,"TLB Probe");
|
||||
INDEX_REGISTER |= 0x80000000;
|
||||
for (Counter = 0; Counter < 32; Counter ++) {
|
||||
if (!tlb[Counter].EntryDefined) { continue; }
|
||||
DWORD TlbValue = tlb[Counter].EntryHi.Value & (~tlb[Counter].PageMask.Mask << 13);
|
||||
DWORD EntryHi = ENTRYHI_REGISTER & (~tlb[Counter].PageMask.Mask << 13);
|
||||
_Reg->INDEX_REGISTER |= 0x80000000;
|
||||
for (Counter = 0; Counter < 32; Counter ++)
|
||||
{
|
||||
if (!m_tlb[Counter].EntryDefined)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
DWORD & TlbEntryHiValue = m_tlb[Counter].EntryHi.Value;
|
||||
DWORD Mask = ~m_tlb[Counter].PageMask.Mask << 13;
|
||||
DWORD TlbValueMasked = TlbEntryHiValue & Mask;
|
||||
DWORD EntryHiMasked = _Reg->ENTRYHI_REGISTER & Mask;
|
||||
|
||||
if (TlbValue == EntryHi) {
|
||||
BOOL Global = (tlb[Counter].EntryHi.Value & 0x100) != 0;
|
||||
BOOL SameAsid = ((tlb[Counter].EntryHi.Value & 0xFF) == (ENTRYHI_REGISTER & 0xFF));
|
||||
|
||||
if (Global || SameAsid) {
|
||||
INDEX_REGISTER = Counter;
|
||||
FastTlb[Counter << 1].Probed = true;
|
||||
FastTlb[(Counter << 1) + 1].Probed = true;
|
||||
if (TlbValueMasked == EntryHiMasked) {
|
||||
if ((TlbEntryHiValue & 0x100) != 0 || //Global
|
||||
((TlbEntryHiValue & 0xFF) == (_Reg->ENTRYHI_REGISTER & 0xFF))) //SameAsid
|
||||
{
|
||||
_Reg->INDEX_REGISTER = Counter;
|
||||
int FastIndx = Counter << 1;
|
||||
m_FastTlb[FastIndx].Probed = true;
|
||||
m_FastTlb[FastIndx + 1].Probed = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CTLB::TLB_ReadEntry (void) {
|
||||
DWORD index = INDEX_REGISTER & 0x1F;
|
||||
void CTLB::ReadEntry (void) {
|
||||
DWORD index = _Reg->INDEX_REGISTER & 0x1F;
|
||||
|
||||
PAGE_MASK_REGISTER = tlb[index].PageMask.Value ;
|
||||
ENTRYHI_REGISTER = (tlb[index].EntryHi.Value & ~tlb[index].PageMask.Value) ;
|
||||
ENTRYLO0_REGISTER = tlb[index].EntryLo0.Value;
|
||||
ENTRYLO1_REGISTER = tlb[index].EntryLo1.Value;
|
||||
_Reg->PAGE_MASK_REGISTER = m_tlb[index].PageMask.Value ;
|
||||
_Reg->ENTRYHI_REGISTER = (m_tlb[index].EntryHi.Value & ~m_tlb[index].PageMask.Value) ;
|
||||
_Reg->ENTRYLO0_REGISTER = m_tlb[index].EntryLo0.Value;
|
||||
_Reg->ENTRYLO1_REGISTER = m_tlb[index].EntryLo1.Value;
|
||||
}
|
||||
|
||||
void CTLB::TLB_WriteEntry (int index, bool Random) {
|
||||
void CTLB::WriteEntry (int index, bool Random) {
|
||||
int FastIndx;
|
||||
|
||||
WriteTraceF(TraceTLB,"Write Entry %02d %d %08X %08X %08X %08X ",index,Random,PAGE_MASK_REGISTER,ENTRYHI_REGISTER,ENTRYLO0_REGISTER,ENTRYLO1_REGISTER);
|
||||
WriteTraceF(TraceTLB,"Write Entry %02d %d %08X %08X %08X %08X ",index,Random,_Reg->PAGE_MASK_REGISTER,_Reg->ENTRYHI_REGISTER,_Reg->ENTRYLO0_REGISTER,_Reg->ENTRYLO1_REGISTER);
|
||||
|
||||
//Check to see if entry is unmapping it self
|
||||
if (tlb[index].EntryDefined) {
|
||||
if (m_tlb[index].EntryDefined) {
|
||||
FastIndx = index << 1;
|
||||
if ((PROGRAM_COUNTER >= FastTlb[FastIndx].VSTART &&
|
||||
PROGRAM_COUNTER < FastTlb[FastIndx].VEND &&
|
||||
FastTlb[FastIndx].ValidEntry && FastTlb[FastIndx].VALID)
|
||||
||
|
||||
(PROGRAM_COUNTER >= FastTlb[FastIndx + 1].VSTART &&
|
||||
PROGRAM_COUNTER < FastTlb[FastIndx + 1].VEND &&
|
||||
FastTlb[FastIndx + 1].ValidEntry && FastTlb[FastIndx + 1].VALID))
|
||||
if (*_PROGRAM_COUNTER >= m_FastTlb[FastIndx].VSTART &&
|
||||
*_PROGRAM_COUNTER < m_FastTlb[FastIndx].VEND &&
|
||||
m_FastTlb[FastIndx].ValidEntry && m_FastTlb[FastIndx].VALID)
|
||||
{
|
||||
WriteTraceF(TraceTLB,"Write Entry: Ignored PC: %X VAddr Start: %X VEND: %X",*_PROGRAM_COUNTER,m_FastTlb[FastIndx].VSTART,m_FastTlb[FastIndx].VEND);
|
||||
return;
|
||||
}
|
||||
if (*_PROGRAM_COUNTER >= m_FastTlb[FastIndx + 1].VSTART &&
|
||||
*_PROGRAM_COUNTER < m_FastTlb[FastIndx + 1].VEND &&
|
||||
m_FastTlb[FastIndx + 1].ValidEntry && m_FastTlb[FastIndx + 1].VALID)
|
||||
{
|
||||
WriteTraceF(TraceTLB,"Write Entry: Ignored PC: %X VAddr Start: %X VEND: %X",*_PROGRAM_COUNTER,m_FastTlb[FastIndx + 1].VSTART,m_FastTlb[FastIndx + 1].VEND);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//see if tlb entry is the same
|
||||
|
||||
//Reset old addresses
|
||||
if (tlb[index].EntryDefined) {
|
||||
DWORD count;
|
||||
|
||||
if (m_tlb[index].EntryDefined)
|
||||
{
|
||||
for ( FastIndx = index << 1; FastIndx <= (index << 1) + 1; FastIndx++) {
|
||||
if (!FastTlb[FastIndx].ValidEntry) { continue; }
|
||||
if (!FastTlb[FastIndx].VALID) { continue; }
|
||||
if (tlb[index].PageMask.Value == PAGE_MASK_REGISTER &&
|
||||
tlb[index].EntryHi.Value == ENTRYHI_REGISTER)
|
||||
if (!m_FastTlb[FastIndx].ValidEntry) { continue; }
|
||||
if (!m_FastTlb[FastIndx].VALID) { continue; }
|
||||
if (m_tlb[index].PageMask.Value == _Reg->PAGE_MASK_REGISTER &&
|
||||
m_tlb[index].EntryHi.Value == _Reg->ENTRYHI_REGISTER)
|
||||
{
|
||||
if (FastIndx == (index << 1) && tlb[index].EntryLo0.Value == ENTRYLO0_REGISTER) {
|
||||
if (FastIndx == (index << 1) && m_tlb[index].EntryLo0.Value == _Reg->ENTRYLO0_REGISTER) {
|
||||
continue;
|
||||
}
|
||||
if (FastIndx != (index << 1) && tlb[index].EntryLo1.Value == ENTRYLO1_REGISTER) {
|
||||
if (FastIndx != (index << 1) && m_tlb[index].EntryLo1.Value == _Reg->ENTRYLO1_REGISTER) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (FastTlb[FastIndx].Random && !FastTlb[FastIndx].Probed) {
|
||||
//Move tlb if possible
|
||||
//int NewIndex = TLB_UnusedEntry((int)WIRED_REGISTER);
|
||||
/*if (NewIndex > 0) {
|
||||
tlb[NewIndex].PageMask.Value = tlb[index].PageMask.Value;
|
||||
tlb[NewIndex].EntryHi.Value = tlb[index].EntryHi.Value;
|
||||
tlb[NewIndex].EntryLo0.Value = tlb[index].EntryLo0.Value;
|
||||
tlb[NewIndex].EntryLo1.Value = tlb[index].EntryLo1.Value;
|
||||
tlb[NewIndex].EntryDefined = tlb[index].EntryDefined;
|
||||
SetupTLB_Entry(NewIndex,FastTlb[FastIndx].Random);
|
||||
break;
|
||||
}*/
|
||||
}
|
||||
CBClass->TLB_Unmapping(index,FastIndx,FastTlb[FastIndx].VSTART,(FastTlb[FastIndx].VEND - FastTlb[FastIndx].VSTART));
|
||||
for (count = FastTlb[FastIndx].VSTART; count < FastTlb[FastIndx].VEND; count += 0x1000) {
|
||||
TLB_ReadMap[count >> 12] = 0;
|
||||
TLB_WriteMap[count >> 12] = 0;
|
||||
}
|
||||
m_CB->TLB_Unmaped(m_FastTlb[FastIndx].VSTART,m_FastTlb[FastIndx].Length);
|
||||
}
|
||||
}
|
||||
|
||||
//fill in tlb entry
|
||||
tlb[index].PageMask.Value = PAGE_MASK_REGISTER;
|
||||
tlb[index].EntryHi.Value = ENTRYHI_REGISTER;
|
||||
tlb[index].EntryLo0.Value = ENTRYLO0_REGISTER;
|
||||
tlb[index].EntryLo1.Value = ENTRYLO1_REGISTER;
|
||||
tlb[index].EntryDefined = true;
|
||||
//fill in m_tlb entry
|
||||
m_tlb[index].PageMask.Value = _Reg->PAGE_MASK_REGISTER;
|
||||
m_tlb[index].EntryHi.Value = _Reg->ENTRYHI_REGISTER;
|
||||
m_tlb[index].EntryLo0.Value = _Reg->ENTRYLO0_REGISTER;
|
||||
m_tlb[index].EntryLo1.Value = _Reg->ENTRYLO1_REGISTER;
|
||||
m_tlb[index].EntryDefined = true;
|
||||
SetupTLB_Entry(index,Random);
|
||||
CBClass->TLB_Changed();
|
||||
//RefreshTLBWindow();
|
||||
m_CB->TLB_Changed();
|
||||
}
|
||||
|
||||
void CTLB::SetupTLB_Entry (int index, bool Random) {
|
||||
//Fix up Fast TLB entries
|
||||
if (!tlb[index].EntryDefined) { return; }
|
||||
if (!m_tlb[index].EntryDefined) { return; }
|
||||
|
||||
int FastIndx = index << 1;
|
||||
FastTlb[FastIndx].VSTART=tlb[index].EntryHi.VPN2 << 13;
|
||||
FastTlb[FastIndx].VEND = FastTlb[FastIndx].VSTART + (tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
FastTlb[FastIndx].PHYSSTART = tlb[index].EntryLo0.PFN << 12;
|
||||
FastTlb[FastIndx].PHYSEND = FastTlb[FastIndx].PHYSSTART + (tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
FastTlb[FastIndx].VALID = tlb[index].EntryLo0.V;
|
||||
FastTlb[FastIndx].DIRTY = tlb[index].EntryLo0.D;
|
||||
FastTlb[FastIndx].GLOBAL = tlb[index].EntryLo0.GLOBAL & tlb[index].EntryLo1.GLOBAL;
|
||||
FastTlb[FastIndx].ValidEntry = FALSE;
|
||||
FastTlb[FastIndx].Random = Random;
|
||||
FastTlb[FastIndx].Probed = false;
|
||||
m_FastTlb[FastIndx].Length = (m_tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
m_FastTlb[FastIndx].VSTART=m_tlb[index].EntryHi.VPN2 << 13;
|
||||
m_FastTlb[FastIndx].VEND = m_FastTlb[FastIndx].VSTART + m_FastTlb[FastIndx].Length;
|
||||
m_FastTlb[FastIndx].PHYSSTART = m_tlb[index].EntryLo0.PFN << 12;
|
||||
m_FastTlb[FastIndx].PHYSEND = m_FastTlb[FastIndx].PHYSSTART + m_FastTlb[FastIndx].Length;
|
||||
m_FastTlb[FastIndx].VALID = m_tlb[index].EntryLo0.V;
|
||||
m_FastTlb[FastIndx].DIRTY = m_tlb[index].EntryLo0.D;
|
||||
m_FastTlb[FastIndx].GLOBAL = m_tlb[index].EntryLo0.GLOBAL & m_tlb[index].EntryLo1.GLOBAL;
|
||||
m_FastTlb[FastIndx].ValidEntry = FALSE;
|
||||
m_FastTlb[FastIndx].Random = Random;
|
||||
m_FastTlb[FastIndx].Probed = false;
|
||||
|
||||
|
||||
FastIndx = (index << 1) + 1;
|
||||
FastTlb[FastIndx].VSTART=(tlb[index].EntryHi.VPN2 << 13) + ((tlb[index].PageMask.Mask << 12) + 0xFFF + 1);
|
||||
FastTlb[FastIndx].VEND = FastTlb[FastIndx].VSTART + (tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
FastTlb[FastIndx].PHYSSTART = tlb[index].EntryLo1.PFN << 12;
|
||||
FastTlb[FastIndx].PHYSEND = FastTlb[FastIndx].PHYSSTART + (tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
FastTlb[FastIndx].VALID = tlb[index].EntryLo1.V;
|
||||
FastTlb[FastIndx].DIRTY = tlb[index].EntryLo1.D;
|
||||
FastTlb[FastIndx].GLOBAL = tlb[index].EntryLo0.GLOBAL & tlb[index].EntryLo1.GLOBAL;
|
||||
FastTlb[FastIndx].ValidEntry = FALSE;
|
||||
FastTlb[FastIndx].Random = Random;
|
||||
FastTlb[FastIndx].Probed = false;
|
||||
m_FastTlb[FastIndx].Length = (m_tlb[index].PageMask.Mask << 12) + 0xFFF;
|
||||
m_FastTlb[FastIndx].VSTART=(m_tlb[index].EntryHi.VPN2 << 13) + (m_FastTlb[FastIndx].Length + 1);
|
||||
m_FastTlb[FastIndx].VEND = m_FastTlb[FastIndx].VSTART + m_FastTlb[FastIndx].Length;
|
||||
m_FastTlb[FastIndx].PHYSSTART = m_tlb[index].EntryLo1.PFN << 12;
|
||||
m_FastTlb[FastIndx].PHYSEND = m_FastTlb[FastIndx].PHYSSTART + m_FastTlb[FastIndx].Length;
|
||||
m_FastTlb[FastIndx].VALID = m_tlb[index].EntryLo1.V;
|
||||
m_FastTlb[FastIndx].DIRTY = m_tlb[index].EntryLo1.D;
|
||||
m_FastTlb[FastIndx].GLOBAL = m_tlb[index].EntryLo0.GLOBAL & m_tlb[index].EntryLo1.GLOBAL;
|
||||
m_FastTlb[FastIndx].ValidEntry = FALSE;
|
||||
m_FastTlb[FastIndx].Random = Random;
|
||||
m_FastTlb[FastIndx].Probed = false;
|
||||
|
||||
//Test both entries to see if they are valid
|
||||
for ( FastIndx = index << 1; FastIndx <= (index << 1) + 1; FastIndx++) {
|
||||
DWORD count;
|
||||
|
||||
if (!FastTlb[FastIndx].VALID) {
|
||||
FastTlb[FastIndx].ValidEntry = true;
|
||||
if (!m_FastTlb[FastIndx].VALID) {
|
||||
m_FastTlb[FastIndx].ValidEntry = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FastTlb[FastIndx].VEND <= FastTlb[FastIndx].VSTART) {
|
||||
if (m_FastTlb[FastIndx].VEND <= m_FastTlb[FastIndx].VSTART) {
|
||||
continue;
|
||||
}
|
||||
if (FastTlb[FastIndx].VSTART >= 0x80000000 && FastTlb[FastIndx].VEND <= 0xBFFFFFFF) {
|
||||
if (m_FastTlb[FastIndx].VSTART >= 0x80000000 && m_FastTlb[FastIndx].VEND <= 0xBFFFFFFF) {
|
||||
continue;
|
||||
}
|
||||
if (FastTlb[FastIndx].PHYSSTART > 0x1FFFFFFF) {
|
||||
if (m_FastTlb[FastIndx].PHYSSTART > 0x1FFFFFFF) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//MAP the new tlb entry for reading and writing
|
||||
FastTlb[FastIndx].ValidEntry = true;
|
||||
for (count = FastTlb[FastIndx].VSTART; count < FastTlb[FastIndx].VEND; count += 0x1000) {
|
||||
TLB_ReadMap[count >> 12] = ((DWORD)m_BasePAddr + (count - FastTlb[FastIndx].VSTART + FastTlb[FastIndx].PHYSSTART)) - count;
|
||||
if (!FastTlb[FastIndx].DIRTY) { continue; }
|
||||
TLB_WriteMap[count >> 12] = ((DWORD)m_BasePAddr + (count - FastTlb[FastIndx].VSTART + FastTlb[FastIndx].PHYSSTART)) - count;
|
||||
}
|
||||
//MAP the new m_tlb entry for reading and writing
|
||||
m_FastTlb[FastIndx].ValidEntry = true;
|
||||
m_CB->TLB_Mapped(m_FastTlb[FastIndx].VSTART,m_FastTlb[FastIndx].Length,m_FastTlb[FastIndx].PHYSSTART, !m_FastTlb[FastIndx].DIRTY);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef tofix
|
||||
bool CTLB::VAddrToRealAddr(DWORD VAddr, void * &RealAddress) {
|
||||
if (TLB_ReadMap[VAddr >> 12] == 0) { return false; }
|
||||
RealAddress = (BYTE *)(TLB_ReadMap[VAddr >> 12] + VAddr);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CTLB::TLB_EntryUsed(int index ) {
|
||||
if (!tlb[index].EntryDefined) { return false; }
|
||||
|
||||
//Test both entries to see if they are valid
|
||||
bool ValidEntry = false;
|
||||
for ( int FastIndx = index << 1; FastIndx <= (index << 1) + 1; FastIndx++) {
|
||||
if (!FastTlb[FastIndx].VALID) { continue; }
|
||||
if (FastTlb[FastIndx].VEND <= FastTlb[FastIndx].VSTART) { continue; }
|
||||
if (FastTlb[FastIndx].VSTART >= 0x80000000 && FastTlb[FastIndx].VEND <= 0xBFFFFFFF) { continue; }
|
||||
if (FastTlb[FastIndx].PHYSSTART > 0x1FFFFFFF) { continue; }
|
||||
ValidEntry = true;
|
||||
}
|
||||
return ValidEntry;
|
||||
}
|
||||
|
||||
int CTLB::TLB_UnusedEntry (int MinIndx ) {
|
||||
MinIndx &= 0x1f;
|
||||
|
||||
for (int count = 31; count >= MinIndx; count --) {
|
||||
if (!TLB_EntryUsed(count)) { return count; }
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool CTLB::PAddrToVAddr(DWORD PAddr, DWORD & VAddr, DWORD & Index )
|
||||
{
|
||||
for (int i = Index; i < 64; i++)
|
||||
{
|
||||
if (FastTlb[i].ValidEntry == false) { continue; }
|
||||
if (PAddr >= FastTlb[i].PHYSSTART && PAddr < FastTlb[i].PHYSEND)
|
||||
if (m_FastTlb[i].ValidEntry == false) { continue; }
|
||||
if (PAddr >= m_FastTlb[i].PHYSSTART && PAddr < m_FastTlb[i].PHYSEND)
|
||||
{
|
||||
VAddr = FastTlb[i].VSTART + (PAddr - FastTlb[i].PHYSSTART);
|
||||
VAddr = m_FastTlb[i].VSTART + (PAddr - m_FastTlb[i].PHYSSTART);
|
||||
Index = i + 1;
|
||||
return true;
|
||||
}
|
||||
|
@ -293,3 +226,4 @@ bool CTLB::PAddrToVAddr(DWORD PAddr, DWORD & VAddr, DWORD & Index )
|
|||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -7,7 +7,6 @@
|
|||
typedef std::list<SystemEvent> EVENT_LIST;
|
||||
|
||||
typedef struct {
|
||||
CN64System * _this;
|
||||
stdstr FileName;
|
||||
void * ThreadHandle;
|
||||
DWORD ThreadID;
|
||||
|
@ -23,10 +22,46 @@ class CC_Core;
|
|||
|
||||
class CN64System :
|
||||
private CMipsMemory_CallBack,
|
||||
public CMipsTLB_CallBack,
|
||||
private CTLB_CB,
|
||||
protected CN64SystemSettings,
|
||||
public CDebugger
|
||||
{
|
||||
public:
|
||||
CN64System ( CPlugins * Plugins, bool SavesReadOnly );
|
||||
~CN64System ( void );
|
||||
|
||||
//Methods
|
||||
static bool CN64System::RunFileImage ( const char * FileLoc );
|
||||
|
||||
void CloseCpu ( void );
|
||||
void ExternalEvent ( SystemEvent Event ); //covers gui interacting and timers etc..
|
||||
stdstr ChooseFileToOpen ( WND_HANDLE hParent );
|
||||
void DisplayRomInfo ( WND_HANDLE hParent );
|
||||
void SelectCheats ( WND_HANDLE hParent );
|
||||
void StartEmulation ( bool NewThread );
|
||||
void SyncToAudio ( void );
|
||||
bool IsDialogMsg ( MSG * msg );
|
||||
void IncreaseSpeed ( void ) { m_Limitor.IncreaeSpeed(10); }
|
||||
void DecreaeSpeed ( void ) { m_Limitor.DecreaeSpeed(10); }
|
||||
void SoftReset ( void );
|
||||
|
||||
bool m_EndEmulation;
|
||||
|
||||
//Get the pointer to the Internal Classes
|
||||
CRecompiler * GetRecompiler ( void ) { return m_Recomp; }
|
||||
//CN64Rom * GetCurrentRom ( void ) { return _Rom; }
|
||||
|
||||
inline CPlugins * Plugins ( void ) const { return m_Plugins; }
|
||||
|
||||
//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
|
||||
DWORD m_CurrentSP;
|
||||
#endif
|
||||
//For Sync CPU
|
||||
void UpdateSyncCPU ( CN64System * const SecondCPU, DWORD const Cycles );
|
||||
void SyncCPU ( CN64System * const SecondCPU );
|
||||
|
||||
private:
|
||||
//Make sure plugins can directly access this information
|
||||
friend CGfxPlugin;
|
||||
friend CAudioPlugin;
|
||||
|
@ -36,48 +71,8 @@ class CN64System :
|
|||
//Recompiler has access to manipulate and call functions
|
||||
friend CC_Core;
|
||||
|
||||
CNotification * const _Notify; //Original Notify member used to notify the user when something occurs
|
||||
CPlugins * const _Plugins; //The plugin container
|
||||
CN64System * _SyncCPU;
|
||||
CMipsMemory * _MMU; //Memory of the n64
|
||||
CRegisters * _Reg; //Current Register Set attacted to the _MMU
|
||||
|
||||
CN64Rom * _Rom; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
bool m_OwnRomObject;
|
||||
CCheats * _Cheats;
|
||||
CFramePerSecond FPS;
|
||||
CProfiling m_CPU_Usage, m_Profile; //used to track the cpu usage
|
||||
// CInterpreterOps * InterpreterOpcode; //Pointer to the interpter Opcode
|
||||
CRecompiler * _Recomp;
|
||||
CAudio * _Audio;
|
||||
CSpeedLimitor m_Limitor;
|
||||
bool m_InReset;
|
||||
SystemType m_SystemType;
|
||||
bool m_bCleanFrameBox;
|
||||
|
||||
//When Syncing cores this is the PC where it last Sync'ed correctly
|
||||
DWORD m_LastSuccessSyncPC[10];
|
||||
int m_CyclesToSkip;
|
||||
|
||||
//List of Internal events that need to be acted on by CPU
|
||||
EVENT_LIST EventList;
|
||||
DWORD NoOfEvents;
|
||||
|
||||
//Handle to the cpu thread
|
||||
void * CPU_Handle;
|
||||
DWORD CPU_ThreadID;
|
||||
|
||||
//Handle to pause mutex
|
||||
void * m_hPauseEvent;
|
||||
|
||||
//No of Alist and Dlist sent to the RSP
|
||||
DWORD m_AlistCount, m_DlistCount, m_UnknownCount;
|
||||
|
||||
//list of function that have been called .. used in profiling
|
||||
FUNC_CALLS m_FunctionCalls;
|
||||
|
||||
//Used for loading and potentialy executing the CPU in its own thread.
|
||||
static void LoadFileImage ( FileImageInfo * Info );
|
||||
static void stLoadFileImage ( FileImageInfo * Info );
|
||||
static void StartEmulationThread ( FileImageInfo * Info );
|
||||
|
||||
void ExecuteCycles ( DWORD Cycles );
|
||||
|
@ -87,12 +82,12 @@ class CN64System :
|
|||
bool InPermLoop ( void );
|
||||
void Reset ( void );
|
||||
void RunRSP ( void );
|
||||
void SetupSystem ( CN64Rom * Rom, bool OwnRomObject, bool SavesReadOnly = false );
|
||||
bool SaveState ( void );
|
||||
bool LoadState ( LPCSTR FileName );
|
||||
bool LoadState ( void );
|
||||
void DumpSyncErrors ( CN64System * SecondCPU );
|
||||
void StartEmulation2 ( bool NewThread );
|
||||
bool SetActiveSystem ( bool bActive );
|
||||
|
||||
//CPU Methods
|
||||
void ExecuteRecompiler ( CC_Core & C_Core );
|
||||
|
@ -114,44 +109,47 @@ class CN64System :
|
|||
//Function in CMipsMemory_CallBack
|
||||
virtual bool WriteToProtectedMemory (DWORD Address, int length);
|
||||
|
||||
//Functions in CMipsTLB_CallBack
|
||||
virtual void TLB_Changed ( void );
|
||||
virtual void TLB_Unmapping ( int TlbEntry, int FastTlbEntry, DWORD Vaddr, DWORD Len );
|
||||
//Functions in CTLB_CB
|
||||
void TLB_Mapped ( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly );
|
||||
void TLB_Unmaped ( DWORD VAddr, DWORD Len );
|
||||
void TLB_Changed ( void );
|
||||
|
||||
public:
|
||||
CN64System ( CNotification * Notify, CPlugins * Plugins );
|
||||
~CN64System ( void );
|
||||
CPlugins * const m_Plugins; //The plugin container
|
||||
CN64System * m_SyncCPU;
|
||||
CMipsMemoryVM m_MMU_VM; //Memory of the n64
|
||||
CTLB m_TLB;
|
||||
CRegisters m_Reg;
|
||||
CCheats m_Cheats;
|
||||
CFramePerSecond m_FPS;
|
||||
CProfiling m_CPU_Usage, m_Profile; //used to track the cpu usage
|
||||
CRecompiler * m_Recomp;
|
||||
CAudio m_Audio;
|
||||
CSpeedLimitor m_Limitor;
|
||||
bool m_InReset;
|
||||
SystemType m_SystemType;
|
||||
bool m_bCleanFrameBox;
|
||||
bool m_bInitilized;
|
||||
|
||||
//When Syncing cores this is the PC where it last Sync'ed correctly
|
||||
DWORD m_LastSuccessSyncPC[10];
|
||||
int m_CyclesToSkip;
|
||||
|
||||
//Methods
|
||||
void CloseCpu ( void );
|
||||
void RunFileImage ( const char * FileLoc );
|
||||
void ExternalEvent ( SystemEvent Event ); //covers gui interacting and timers etc..
|
||||
stdstr ChooseFileToOpen ( WND_HANDLE hParent );
|
||||
void DisplayRomInfo ( WND_HANDLE hParent );
|
||||
void SelectCheats ( WND_HANDLE hParent );
|
||||
void StartEmulation ( bool NewThread );
|
||||
void SyncToAudio ( void );
|
||||
bool IsDialogMsg ( MSG * msg );
|
||||
void IncreaseSpeed ( void ) { m_Limitor.IncreaeSpeed(10); }
|
||||
void DecreaeSpeed ( void ) { m_Limitor.DecreaeSpeed(10); }
|
||||
void SoftReset ( void );
|
||||
//List of Internal events that need to be acted on by CPU
|
||||
EVENT_LIST m_EventList;
|
||||
DWORD m_NoOfEvents;
|
||||
|
||||
bool EndEmulation;
|
||||
//Handle to the cpu thread
|
||||
HANDLE m_CPU_Handle;
|
||||
DWORD m_CPU_ThreadID;
|
||||
|
||||
//Handle to pause mutex
|
||||
void * m_hPauseEvent;
|
||||
|
||||
//Get the pointer to the Internal Classes
|
||||
CRecompiler * GetRecompiler ( void ) { return _Recomp; }
|
||||
CN64Rom * GetCurrentRom ( void ) { return _Rom; }
|
||||
|
||||
inline CPlugins * Plugins ( void ) const { return _Plugins; }
|
||||
|
||||
//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
|
||||
DWORD m_CurrentSP;
|
||||
#endif
|
||||
//For Sync CPU
|
||||
void UpdateSyncCPU ( CN64System * const SecondCPU, DWORD const Cycles );
|
||||
void SyncCPU ( CN64System * const SecondCPU );
|
||||
//No of Alist and Dlist sent to the RSP
|
||||
DWORD m_AlistCount, m_DlistCount, m_UnknownCount;
|
||||
|
||||
//list of function that have been called .. used in profiling
|
||||
FUNC_CALLS m_FunctionCalls;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,8 +6,7 @@
|
|||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
CN64Rom::CN64Rom ( CNotification * Notify ) :
|
||||
_Notify(Notify)
|
||||
CN64Rom::CN64Rom ( void )
|
||||
{
|
||||
m_hRomFile = NULL;
|
||||
m_hRomFileMapping = NULL;
|
||||
|
@ -259,7 +258,7 @@ bool CN64Rom::IsValidRomImage ( BYTE Test[4] ) {
|
|||
|
||||
void CN64Rom::NotificationCB ( LPCSTR Status, CN64Rom * _this )
|
||||
{
|
||||
_this->_Notify->DisplayMessage(5,"%s",Status);
|
||||
_Notify->DisplayMessage(5,"%s",Status);
|
||||
}
|
||||
|
||||
bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
||||
|
@ -453,6 +452,11 @@ bool CN64Rom::LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly ) {
|
|||
m_Country = (Country)m_ROMImage[0x3D];
|
||||
m_RomIdent.Format("%08X-%08X-C:%X",*(DWORD *)(&m_ROMImage[0x10]),*(DWORD *)(&m_ROMImage[0x14]),m_ROMImage[0x3D]);
|
||||
CalculateCicChip();
|
||||
|
||||
if (!LoadBootCodeOnly && _Rom == this)
|
||||
{
|
||||
SaveRomSettingID();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
#include "N64 Types.h"
|
||||
|
||||
class CN64Rom {
|
||||
CNotification * const _Notify; //Original Notify member used to notify the user when something occurs
|
||||
|
||||
class CN64Rom
|
||||
{
|
||||
//constant values
|
||||
enum { ReadFromRomSection = 0x400000 };
|
||||
|
||||
|
@ -24,7 +23,7 @@ class CN64Rom {
|
|||
void CalculateCicChip ( void );
|
||||
|
||||
public:
|
||||
CN64Rom ( CNotification * Notify );
|
||||
CN64Rom ( void );
|
||||
~CN64Rom ( void );
|
||||
bool LoadN64Image ( const char * FileLoc, bool LoadBootCodeOnly = false );
|
||||
void SaveRomSettingID ( void );
|
||||
|
|
|
@ -10,9 +10,7 @@
|
|||
#undef LinkBlocks
|
||||
#undef CountPerOp
|
||||
|
||||
CRecompiler::CRecompiler(CMipsMemory * MMU, CProfiling & Profile, bool & EndEmulation, bool SyncSystem) :
|
||||
_MMU(MMU),
|
||||
_Reg(MMU->SystemRegisters()),
|
||||
CRecompiler::CRecompiler(CProfiling & Profile, bool & EndEmulation, bool SyncSystem) :
|
||||
m_Profile(Profile),
|
||||
PROGRAM_COUNTER(_Reg->PROGRAM_COUNTER),
|
||||
m_EndEmulation(EndEmulation),
|
||||
|
@ -29,19 +27,25 @@ CRecompiler::~CRecompiler()
|
|||
|
||||
void CRecompiler::Run()
|
||||
{
|
||||
*g_MemoryStack = (DWORD)(N64MEM+(GPR[29].W[0] & 0x1FFFFFFF));
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
*g_MemoryStack = (DWORD)(RDRAM+(_GPR[29].W[0] & 0x1FFFFFFF));
|
||||
#endif
|
||||
CoInitialize(NULL);
|
||||
if (g_LogX86Code)
|
||||
{
|
||||
Start_x86_Log();
|
||||
}
|
||||
|
||||
if (!g_MMU->AllocateRecompilerMemory(LookUpMode() != FuncFind_VirtualLookup && LookUpMode() != FuncFind_ChangeMemory))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_MMU->AllocateRecompilerMemory(LookUpMode() != FuncFind_VirtualLookup && LookUpMode() != FuncFind_ChangeMemory))
|
||||
{
|
||||
return;
|
||||
}
|
||||
JumpTable = g_MMU->GetJumpTable();
|
||||
RecompCode = g_MMU->GetRecompCode();
|
||||
JumpTable = _MMU->GetJumpTable();
|
||||
RecompCode = _MMU->GetRecompCode();
|
||||
#endif
|
||||
|
||||
ResetRecompCode();
|
||||
m_EndEmulation = false;
|
||||
|
@ -65,7 +69,7 @@ void CRecompiler::Run()
|
|||
RecompilerMain_Lookup();
|
||||
}
|
||||
}
|
||||
__except( _MMU->SystemMemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
||||
__except( _MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
||||
{
|
||||
Notify().DisplayError(MSG_UNKNOWN_MEM_ACTION);
|
||||
}
|
||||
|
@ -94,16 +98,19 @@ void CRecompiler::RecompilerMain_VirtualTable ( void )
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DoTLBMiss(NextInstruction == DELAY_SLOT,PROGRAM_COUNTER);
|
||||
NextInstruction = NORMAL;
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DisplayError("Failed to tranlate PC to a PAddr: %X\n\nEmulation stopped",PROGRAM_COUNTER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
FUNCTION_INFO * info = CompilerCode();
|
||||
|
||||
if (info == NULL || EndEmulation())
|
||||
|
@ -115,18 +122,20 @@ void CRecompiler::RecompilerMain_VirtualTable ( void )
|
|||
//Find Block on hash table
|
||||
if (Info == NULL)
|
||||
{
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DoTLBMiss(NextInstruction == DELAY_SLOT,PROGRAM_COUNTER);
|
||||
NextInstruction = NORMAL;
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DisplayError("Failed to tranlate PC to a PAddr: %X\n\nEmulation stopped",PROGRAM_COUNTER);
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
#endif
|
||||
//Find Block on hash table
|
||||
Info = CompileDelaySlot(PROGRAM_COUNTER);
|
||||
|
||||
|
@ -158,18 +167,20 @@ void CRecompiler::RecompilerMain_VirtualTable_validate ( void )
|
|||
//Find Block on hash table
|
||||
if (Info == NULL)
|
||||
{
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DoTLBMiss(NextInstruction == DELAY_SLOT,PROGRAM_COUNTER);
|
||||
NextInstruction = NORMAL;
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DisplayError("Failed to tranlate PC to a PAddr: %X\n\nEmulation stopped",PROGRAM_COUNTER);
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
#endif
|
||||
//Find Block on hash table
|
||||
Info = CompileDelaySlot(PROGRAM_COUNTER);
|
||||
|
||||
|
@ -216,16 +227,19 @@ void CRecompiler::RecompilerMain_VirtualTable_validate ( void )
|
|||
continue;
|
||||
}
|
||||
}
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DoTLBMiss(NextInstruction == DELAY_SLOT,PROGRAM_COUNTER);
|
||||
NextInstruction = NORMAL;
|
||||
if (!_MMU->ValidVaddr(PROGRAM_COUNTER))
|
||||
if (!_TLB->ValidVaddr(PROGRAM_COUNTER))
|
||||
{
|
||||
DisplayError("Failed to tranlate PC to a PAddr: %X\n\nEmulation stopped",PROGRAM_COUNTER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
FUNCTION_INFO * info = CompilerCode();
|
||||
|
||||
if (info == NULL || EndEmulation())
|
||||
|
@ -324,7 +338,9 @@ void CRecompiler::RecompilerMain_Lookup( void )
|
|||
{
|
||||
if (g_UseTlb)
|
||||
{
|
||||
if (!g_TLB->TranslateVaddr(PROGRAM_COUNTER, Addr))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->TranslateVaddr(PROGRAM_COUNTER, Addr))
|
||||
{
|
||||
DoTLBMiss(NextInstruction == DELAY_SLOT,PROGRAM_COUNTER);
|
||||
NextInstruction = NORMAL;
|
||||
|
@ -333,6 +349,7 @@ void CRecompiler::RecompilerMain_Lookup( void )
|
|||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
Addr = PROGRAM_COUNTER & 0x1FFFFFFF;
|
||||
}
|
||||
|
@ -421,7 +438,7 @@ void CRecompiler::RecompilerMain_Lookup( void )
|
|||
*(JumpTable + (Addr >> 2)) = (void *)Info;
|
||||
|
||||
// if (SelfModCheck == ModCode_ProtectedMemory) {
|
||||
// VirtualProtect(N64MEM + Addr, 4, PAGE_READONLY, &OldProtect);
|
||||
// VirtualProtect(RDRAM + Addr, 4, PAGE_READONLY, &OldProtect);
|
||||
// }
|
||||
}
|
||||
if (bSMM_ValidFunc())
|
||||
|
@ -434,6 +451,7 @@ void CRecompiler::RecompilerMain_Lookup( void )
|
|||
continue;
|
||||
}
|
||||
}
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (Profiling && IndvidualBlock) {
|
||||
static DWORD ProfAddress = 0;
|
||||
|
@ -471,7 +489,7 @@ void CRecompiler::ResetRecompCode()
|
|||
m_FunctionsDelaySlot.Reset();
|
||||
if (JumpTable)
|
||||
{
|
||||
memset(JumpTable,0,g_MMU->RdramSize());
|
||||
memset(JumpTable,0,_MMU->RdramSize());
|
||||
memset(JumpTable + (0x04000000 >> 2),0,0x1000);
|
||||
memset(JumpTable + (0x04001000 >> 2),0,0x1000);
|
||||
if (bRomInMemory())
|
||||
|
@ -486,9 +504,9 @@ void CRecompiler::ResetRecompCode()
|
|||
|
||||
for (count = 0; count < TargetIndex; count++) {
|
||||
PAddr = OrigMem[(WORD)(count)].PAddr;
|
||||
Value = *(DWORD *)(N64MEM + PAddr);
|
||||
Value = *(DWORD *)(RDRAM + PAddr);
|
||||
if ( ((Value >> 16) == 0x7C7C) && ((Value & 0xFFFF) == count)) {
|
||||
*(DWORD *)(N64MEM + PAddr) = OrigMem[(WORD)(count)].OriginalValue;
|
||||
*(DWORD *)(RDRAM + PAddr) = OrigMem[(WORD)(count)].OriginalValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -501,7 +519,7 @@ void CRecompiler::ResetRecompCode()
|
|||
memset(JumpTable + (count << 10),0,0x1000);
|
||||
*(DelaySlotTable + count) = NULL;
|
||||
|
||||
if (VirtualProtect((N64MEM + (count << 12)), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
if (VirtualProtect((RDRAM + (count << 12)), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
DisplayError("Failed to unprotect %X\n1", (count << 12));
|
||||
}
|
||||
}
|
||||
|
@ -511,7 +529,7 @@ void CRecompiler::ResetRecompCode()
|
|||
N64_Blocks.NoOfDMEMBlocks = 0;
|
||||
memset(JumpTable + (0x04000000 >> 2),0,0x1000);
|
||||
*(DelaySlotTable + (0x04000000 >> 12)) = NULL;
|
||||
if (VirtualProtect((N64MEM + 0x04000000), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
if (VirtualProtect((RDRAM + 0x04000000), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
DisplayError("Failed to unprotect %X\n0", 0x04000000);
|
||||
}
|
||||
}
|
||||
|
@ -519,7 +537,7 @@ void CRecompiler::ResetRecompCode()
|
|||
N64_Blocks.NoOfIMEMBlocks = 0;
|
||||
memset(JumpTable + (0x04001000 >> 2),0,0x1000);
|
||||
*(DelaySlotTable + (0x04001000 >> 12)) = NULL;
|
||||
if (VirtualProtect((N64MEM + 0x04001000), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
if (VirtualProtect((RDRAM + 0x04001000), 4, PAGE_READWRITE, &OldProtect) == 0) {
|
||||
DisplayError("Failed to unprotect %X\n4", 0x04001000);
|
||||
}
|
||||
}
|
||||
|
@ -538,12 +556,14 @@ FUNCTION_INFO * CRecompiler::CompileDelaySlot(DWORD PC)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!r4300i_LW_VAddr(PC, &g_Opcode.Hex)) {
|
||||
if (!_MMU->LW_VAddr(PC, g_Opcode.Hex)) {
|
||||
DisplayError("TLB Miss in delay slot\nEmulation will know stop");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FUNCTION_INFO * info = m_FunctionsDelaySlot.AddFunctionInfo(PC, _MMU->TranslateVaddr(PC));
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
FUNCTION_INFO * info = m_FunctionsDelaySlot.AddFunctionInfo(PC, _TLB->TranslateVaddr(PC));
|
||||
|
||||
CBlockInfo BlockInfo(PROGRAM_COUNTER, RecompPos);
|
||||
CBlockSection * Section = &BlockInfo.ParentSection;
|
||||
|
@ -723,12 +743,14 @@ FUNCTION_INFO * CRecompiler::CompileDelaySlot(DWORD PC)
|
|||
|
||||
info->SetVEndPC(BlockInfo.EndVAddr);
|
||||
info->SetFunctionAddr(BlockInfo.CompiledLocation);
|
||||
_MMU->VAddrToRealAddr(info->VStartPC(),*(reinterpret_cast<void **>(&info->MemLocation[0])));
|
||||
_TLB->VAddrToRealAddr(info->VStartPC(),*(reinterpret_cast<void **>(&info->MemLocation[0])));
|
||||
info->MemLocation[1] = info->MemLocation[0] + 1;
|
||||
info->MemContents[0] = *info->MemLocation[0];
|
||||
info->MemContents[1] = *info->MemLocation[1];
|
||||
NextInstruction = NORMAL;
|
||||
return info;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool CRecompiler::AnalyseBlock ( CBlockInfo & BlockInfo)
|
||||
|
@ -936,7 +958,7 @@ bool CRecompiler::FillSectionInfo(CBlockSection * Section, STEP_TYPE StartStepTy
|
|||
Section->RegWorking = Section->RegStart;
|
||||
NextInstruction = StartStepType;
|
||||
do {
|
||||
if (!r4300i_LW_VAddr(Section->CompilePC, &Command.Hex)) {
|
||||
if (!_MMU->LW_VAddr(Section->CompilePC, Command.Hex)) {
|
||||
DisplayError(GS(MSG_FAIL_LOAD_WORD));
|
||||
return false;
|
||||
}
|
||||
|
@ -1624,7 +1646,7 @@ bool CRecompiler::FillSectionInfo(CBlockSection * Section, STEP_TYPE StartStepTy
|
|||
int EffectDelaySlot;
|
||||
OPCODE NewCommand;
|
||||
|
||||
if (!r4300i_LW_VAddr(Section->CompilePC + 4, &NewCommand.Hex)) {
|
||||
if (!_MMU->LW_VAddr(Section->CompilePC + 4, NewCommand.Hex)) {
|
||||
DisplayError(GS(MSG_FAIL_LOAD_WORD));
|
||||
ExitThread(0);
|
||||
}
|
||||
|
@ -1652,7 +1674,7 @@ bool CRecompiler::FillSectionInfo(CBlockSection * Section, STEP_TYPE StartStepTy
|
|||
int EffectDelaySlot;
|
||||
OPCODE NewCommand;
|
||||
|
||||
if (!r4300i_LW_VAddr(Section->CompilePC + 4, &NewCommand.Hex)) {
|
||||
if (!_MMU->LW_VAddr(Section->CompilePC + 4, NewCommand.Hex)) {
|
||||
DisplayError(GS(MSG_FAIL_LOAD_WORD));
|
||||
ExitThread(0);
|
||||
}
|
||||
|
@ -1860,12 +1882,15 @@ bool CRecompiler::Compiler4300iBlock(FUNCTION_INFO * info) {
|
|||
|
||||
if (bProfiling()) { m_Profile.StartTimer(Timer_CompileBlock); }
|
||||
DWORD StartAddress;
|
||||
if (!_MMU->TranslateVaddr(BlockInfo.StartVAddr,StartAddress))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (!_TLB->TranslateVaddr(BlockInfo.StartVAddr,StartAddress))
|
||||
{
|
||||
DisplayError("Ummm... Where does this block go\n%X",BlockInfo.StartVAddr);
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* MarkCodeBlock(StartAddress);
|
||||
if (StartAddress < RdramSize()) {
|
||||
CPU_Message("====== RDRAM: block (%X:%d) ======", StartAddress>>12,N64_Blocks.NoOfRDRamBlocks[StartAddress>>12]);
|
||||
|
@ -1911,7 +1936,9 @@ bool CRecompiler::Compiler4300iBlock(FUNCTION_INFO * info) {
|
|||
|
||||
info->SetVEndPC(BlockInfo.EndVAddr);
|
||||
info->SetFunctionAddr(BlockInfo.CompiledLocation);
|
||||
_MMU->VAddrToRealAddr(info->VStartPC(),*(reinterpret_cast<void **>(&info->MemLocation[0])));
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
_TLB->VAddrToRealAddr(info->VStartPC(),*(reinterpret_cast<void **>(&info->MemLocation[0])));
|
||||
info->MemLocation[1] = info->MemLocation[0] + 1;
|
||||
info->MemContents[0] = *info->MemLocation[0];
|
||||
info->MemContents[1] = *info->MemLocation[1];
|
||||
|
@ -1934,6 +1961,7 @@ bool CRecompiler::Compiler4300iBlock(FUNCTION_INFO * info) {
|
|||
DisplayMessage(0,"Memory used: %d mb %-3d kb %-3d bytes Total Available: %d mb",MB,KB,Size, TotalAvaliable);
|
||||
}
|
||||
if (bProfiling()) { m_Profile.StopTimer(); }
|
||||
#endif
|
||||
|
||||
DWORD TimeTaken = timeGetTime() - StartTime;
|
||||
WriteTraceF(TraceRecompiler,"Compile Block-Done: %X-%X - Taken: %d",info->VStartPC(),info->VEndPC(),TimeTaken);
|
||||
|
@ -1943,6 +1971,7 @@ bool CRecompiler::Compiler4300iBlock(FUNCTION_INFO * info) {
|
|||
|
||||
void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
DWORD Value, Addr;
|
||||
BYTE * Block;
|
||||
|
@ -1987,7 +2016,7 @@ void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
|||
Block = CompileDelaySlot();
|
||||
Value = 0x7C7C0000;
|
||||
Value += (WORD)(TargetIndex);
|
||||
MemValue = *(DWORD *)(N64MEM + Addr);
|
||||
MemValue = *(DWORD *)(RDRAM + Addr);
|
||||
if ( (MemValue >> 16) == 0x7C7C) {
|
||||
MemValue = OrigMem[(MemValue & 0xFFFF)].OriginalValue;
|
||||
}
|
||||
|
@ -2008,7 +2037,7 @@ void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
|||
}
|
||||
|
||||
__try {
|
||||
Value = *(DWORD *)(N64MEM + Addr);
|
||||
Value = *(DWORD *)(RDRAM + Addr);
|
||||
if ( (Value >> 16) == 0x7C7C) {
|
||||
DWORD Index = (Value & 0xFFFF);
|
||||
Block = (BYTE *)OrigMem[Index].CompiledLocation;
|
||||
|
@ -2042,7 +2071,7 @@ void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
|||
}
|
||||
Value = 0x7C7C0000;
|
||||
Value += (WORD)(TargetIndex);
|
||||
MemValue = *(DWORD *)(N64MEM + Addr);
|
||||
MemValue = *(DWORD *)(RDRAM + Addr);
|
||||
if ( (MemValue >> 16) == 0x7C7C) {
|
||||
MemValue = OrigMem[(MemValue & 0xFFFF)].OriginalValue;
|
||||
}
|
||||
|
@ -2051,7 +2080,7 @@ void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
|||
OrigMem[(WORD)(TargetIndex)].PAddr = Addr;
|
||||
OrigMem[(WORD)(TargetIndex)].VAddr = PROGRAM_COUNTER;
|
||||
TargetIndex += 1;
|
||||
*(DWORD *)(N64MEM + Addr) = Value;
|
||||
*(DWORD *)(RDRAM + Addr) = Value;
|
||||
NextInstruction = NORMAL;
|
||||
}
|
||||
if (Profiling && IndvidualBlock) {
|
||||
|
@ -2083,8 +2112,10 @@ void CRecompiler::RecompilerMain_ChangeMemory ( void )
|
|||
|
||||
FUNCTION_INFO * CRecompiler::CompilerCode ( void )
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
_MMU->CheckRecompMem(RecompPos);
|
||||
FUNCTION_INFO * Info = m_Functions.AddFunctionInfo(PROGRAM_COUNTER,_MMU->TranslateVaddr(PROGRAM_COUNTER));
|
||||
FUNCTION_INFO * Info = m_Functions.AddFunctionInfo(PROGRAM_COUNTER,_TLB->TranslateVaddr(PROGRAM_COUNTER));
|
||||
__try {
|
||||
if (!Compiler4300iBlock(Info))
|
||||
{
|
||||
|
@ -2093,13 +2124,14 @@ FUNCTION_INFO * CRecompiler::CompilerCode ( void )
|
|||
return Info;
|
||||
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
||||
ResetRecompCode();
|
||||
Info = m_Functions.AddFunctionInfo(PROGRAM_COUNTER,_MMU->TranslateVaddr(PROGRAM_COUNTER));
|
||||
Info = m_Functions.AddFunctionInfo(PROGRAM_COUNTER,_TLB->TranslateVaddr(PROGRAM_COUNTER));
|
||||
if (!Compiler4300iBlock(Info))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return Info;
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2519,10 +2551,10 @@ bool CRecompiler::GenerateX86Code(CBlockInfo & BlockInfo, CBlockSection * Sectio
|
|||
//if (m_SyncSystem && (DWORD)RecompPos > 0x6094C283) {
|
||||
MoveConstToVariable(Section->StartPC,&PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
if (BlockCycleCount != 0) {
|
||||
AddConstToVariable(BlockCycleCount,&CP0[9],Cop0_Name[9]);
|
||||
AddConstToVariable(BlockCycleCount,&_CP0[9],Cop0_Name[9]);
|
||||
SubConstFromVariable(BlockCycleCount,&Timers.Timer,"Timer");
|
||||
}
|
||||
if (BlockRandomModifier != 0) { SubConstFromVariable(BlockRandomModifier,&CP0[1],Cop0_Name[1]); }
|
||||
if (BlockRandomModifier != 0) { SubConstFromVariable(BlockRandomModifier,&_CP0[1],Cop0_Name[1]); }
|
||||
BlockCycleCount = 0;
|
||||
BlockRandomModifier = 0;
|
||||
Call_Direct(SyncToPC, "SyncToPC");
|
||||
|
@ -2530,11 +2562,11 @@ bool CRecompiler::GenerateX86Code(CBlockInfo & BlockInfo, CBlockSection * Sectio
|
|||
}*/
|
||||
do {
|
||||
__try {
|
||||
if (!r4300i_LW_VAddr(Section->CompilePC, &g_Opcode.Hex)) {
|
||||
if (!_MMU->LW_VAddr(Section->CompilePC, g_Opcode.Hex)) {
|
||||
DisplayError(GS(MSG_FAIL_LOAD_WORD));
|
||||
ExitThread(0);
|
||||
}
|
||||
} __except( r4300i_CPU_MemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) {
|
||||
} __except( _MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) {
|
||||
DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||
ExitThread(0);
|
||||
}
|
||||
|
@ -2545,7 +2577,7 @@ bool CRecompiler::GenerateX86Code(CBlockInfo & BlockInfo, CBlockSection * Sectio
|
|||
// WriteBackRegisters(Section);
|
||||
// UpdateCounters(&Section->BlockCycleCount(),&Section->BlockRandomModifier(),false);
|
||||
//
|
||||
// CompConstToVariable(0x26D5BB0,&CP0[9],Cop0_Name[9]);
|
||||
// CompConstToVariable(0x26D5BB0,&_CP0[9],Cop0_Name[9]);
|
||||
// JlLabel8("blah",0);
|
||||
// BYTE * Jump = RecompPos - 1;
|
||||
// // BreakPoint(__FILE__,__LINE__);
|
||||
|
@ -2969,7 +3001,7 @@ void CRecompiler::CompileExit ( CBlockSection * Section, DWORD JumpPC, DWORD Tar
|
|||
// if (TargetPC >= 0x80000000 && TargetPC < 0xC0000000) {
|
||||
// DWORD pAddr = TargetPC & 0x1FFFFFFF;
|
||||
//
|
||||
// MoveVariableToX86reg((BYTE *)N64MEM + pAddr,"N64MEM + pAddr",x86_EAX);
|
||||
// MoveVariableToX86reg((BYTE *)RDRAM + pAddr,"RDRAM + pAddr",x86_EAX);
|
||||
// Jump2 = NULL;
|
||||
// } else {
|
||||
// MoveConstToX86reg((TargetPC >> 12),x86_ECX);
|
||||
|
@ -3024,7 +3056,7 @@ void CRecompiler::CompileExit ( CBlockSection * Section, DWORD JumpPC, DWORD Tar
|
|||
TestX86RegToX86Reg(x86_ECX,x86_ECX);
|
||||
JeLabel8("NoTlbEntry",0);
|
||||
Jump2 = RecompPos - 1;
|
||||
AddConstToX86Reg(x86_ECX,(DWORD)JumpTable - (DWORD)N64MEM);
|
||||
AddConstToX86Reg(x86_ECX,(DWORD)JumpTable - (DWORD)RDRAM);
|
||||
MoveX86regPointerToX86reg(x86_ECX, x86_EBX,x86_ECX);
|
||||
}
|
||||
if (TargetPC < 0x90000000 || TargetPC >= 0xC0000000)
|
||||
|
@ -3096,7 +3128,7 @@ void CRecompiler::UpdateCounters ( DWORD * Cycles, DWORD * RandomMod, BOOL Check
|
|||
if (*RandomMod != 0 || *Cycles != 0) {
|
||||
WriteX86Comment("Update Counters");
|
||||
}
|
||||
if (*RandomMod != 0) { SubConstFromVariable(*RandomMod,&CP0[1],Cop0_Name[1]); }
|
||||
if (*RandomMod != 0) { SubConstFromVariable(*RandomMod,&_CP0[1],Cop0_Name[1]); }
|
||||
if (*Cycles != 0) {
|
||||
if (m_SyncSystem) {
|
||||
char text[100];
|
||||
|
@ -3108,8 +3140,8 @@ void CRecompiler::UpdateCounters ( DWORD * Cycles, DWORD * RandomMod, BOOL Check
|
|||
Call_Direct(UpdateSyncCPU,"UpdateSyncCPU");
|
||||
Popad();
|
||||
}
|
||||
AddConstToVariable(*Cycles,&CP0[9],Cop0_Name[9]);
|
||||
SubConstFromVariable(*Cycles,g_Timer,"Timer");
|
||||
AddConstToVariable(*Cycles,&_CP0[9],Cop0_Name[9]);
|
||||
SubConstFromVariable(*Cycles,_Timer,"Timer");
|
||||
}
|
||||
*Cycles = 0;
|
||||
*RandomMod = 0;
|
||||
|
@ -3120,9 +3152,9 @@ void CRecompiler::UpdateCounters ( DWORD * Cycles, DWORD * RandomMod, BOOL Check
|
|||
|
||||
// Timer
|
||||
if (*Cycles == 0) {
|
||||
CompConstToVariable(0,g_Timer,"Timer");
|
||||
CompConstToVariable(0,_Timer,"Timer");
|
||||
//} else{
|
||||
// uses SubConstFromVariable(Cycles,g_Timer,"Timer"); for compare flag
|
||||
// uses SubConstFromVariable(Cycles,_Timer,"Timer"); for compare flag
|
||||
}
|
||||
JnsLabel8("Continue_From_Timer_Test",0);
|
||||
Jump = RecompPos - 1;
|
||||
|
@ -3186,7 +3218,10 @@ void SyncRegState (CBlockSection * Section, CRegInfo * SyncTo) {
|
|||
}
|
||||
}
|
||||
if (!changed) {
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
MoveVariableToX86reg(g_MemoryStack,"MemoryStack",x86Reg);
|
||||
#endif
|
||||
}
|
||||
changed = true;
|
||||
}
|
||||
|
@ -3244,8 +3279,8 @@ void SyncRegState (CBlockSection * Section, CRegInfo * SyncTo) {
|
|||
UnMap_X86reg(Section,x86RegHi);
|
||||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_UNKNOWN:
|
||||
MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&GPR[count].UW[1],GPR_NameHi[count],x86RegHi);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[1],GPR_NameHi[count],x86RegHi);
|
||||
break;
|
||||
case CRegInfo::STATE_MAPPED_64:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
@ -3291,7 +3326,7 @@ void SyncRegState (CBlockSection * Section, CRegInfo * SyncTo) {
|
|||
x86Reg = SyncTo->MipsRegLo(count);
|
||||
UnMap_X86reg(Section,x86Reg);
|
||||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg); break;
|
||||
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg); break;
|
||||
case CRegInfo::STATE_CONST_32: MoveConstToX86reg(Section->MipsRegLo(count),x86Reg); break;
|
||||
case CRegInfo::STATE_MAPPED_32_SIGN:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
@ -3327,7 +3362,7 @@ void SyncRegState (CBlockSection * Section, CRegInfo * SyncTo) {
|
|||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_MAPPED_64:
|
||||
case CRegInfo::STATE_UNKNOWN:
|
||||
MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
break;
|
||||
case CRegInfo::STATE_MAPPED_32_ZERO:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
@ -3420,9 +3455,9 @@ void CRecompiler::GenerateSectionLinkage (CBlockSection * Section) {
|
|||
CPU_Message(" $FinishBlock:");
|
||||
SetJump8(Jump,RecompPos);
|
||||
}
|
||||
MoveConstToVariable(Section->CompilePC + 4,g_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
MoveConstToVariable(Section->CompilePC + 4,_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
WriteBackRegisters(Section);
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&Section->BlockCycleCount(),&Section->BlockRandomModifier(),false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&Section->BlockCycleCount(),&Section->BlockRandomModifier(),false);
|
||||
// WriteBackRegisters(Section);
|
||||
// if (m_SyncSystem) { Call_Direct(SyncToPC, "SyncToPC"); }
|
||||
MoveConstToVariable(DELAY_SLOT,&NextInstruction,"NextInstruction");
|
||||
|
@ -3433,14 +3468,14 @@ void CRecompiler::GenerateSectionLinkage (CBlockSection * Section) {
|
|||
if (Section->CompilePC == Section->Jump.TargetPC && (Section->Cont.FallThrough == false)) {
|
||||
if (!DelaySlotEffectsJump(Section->CompilePC)) {
|
||||
CPU_Message("PermLoop *** a");
|
||||
MoveConstToVariable(Section->CompilePC,g_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
MoveConstToVariable(Section->CompilePC,_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
WriteBackRegisters(Section);
|
||||
Section->RegWorking.BlockCycleCount() -= CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&Section->RegWorking.BlockCycleCount(),&Section->RegWorking.BlockRandomModifier(), false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&Section->RegWorking.BlockCycleCount(),&Section->RegWorking.BlockRandomModifier(), false);
|
||||
Call_Direct(InPermLoop,"InPermLoop");
|
||||
Section->RegWorking.BlockCycleCount() += CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&Section->RegWorking.BlockCycleCount(),&Section->RegWorking.BlockRandomModifier(), true);
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(-1,Section->RegWorking);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&Section->RegWorking.BlockCycleCount(),&Section->RegWorking.BlockRandomModifier(), true);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(-1,Section->RegWorking);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -3461,7 +3496,7 @@ CPU_Message("PermLoop *** a");
|
|||
JumpInfo[count]->LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
g_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC, JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC, JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
JumpInfo[count]->FallThrough = false;
|
||||
} else if ((*TargetSection[count]) != NULL && JumpInfo[count] != NULL) {
|
||||
if (!JumpInfo[count]->FallThrough) { continue; }
|
||||
|
@ -3474,7 +3509,7 @@ CPU_Message("PermLoop *** a");
|
|||
JumpInfo[count]->LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
g_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC, JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC, JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
//FreeSection((*TargetSection[count]),Section);
|
||||
}
|
||||
}
|
||||
|
@ -3508,19 +3543,19 @@ CPU_Message("PermLoop *** a");
|
|||
if (JumpInfo[count]->TargetPC <= Section->CompilePC) {
|
||||
if (JumpInfo[count]->PermLoop) {
|
||||
CPU_Message("PermLoop *** 1");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,g_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
JumpInfo[count]->RegSet.BlockCycleCount() -= CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
Call_Direct(InPermLoop,"InPermLoop");
|
||||
JumpInfo[count]->RegSet.BlockCycleCount() += CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
} else {
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(), &JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(), &JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
}
|
||||
} else {
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(), &JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(), &JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
}
|
||||
JumpInfo[count]->RegSet.BlockRandomModifier() = 0;
|
||||
JumpInfo[count]->RegSet.BlockCycleCount() = 0;
|
||||
|
@ -3544,13 +3579,13 @@ CPU_Message("PermLoop *** 1");
|
|||
if (Parent->CompiledLocation != NULL) { continue; }
|
||||
if (JumpInfo[count]->PermLoop) {
|
||||
CPU_Message("PermLoop *** 2");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,g_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
JumpInfo[count]->RegSet.BlockCycleCount() -= CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
Call_Direct(InPermLoop,"InPermLoop");
|
||||
JumpInfo[count]->RegSet.BlockCycleCount() += CountPerOp();
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
}
|
||||
if (JumpInfo[count]->FallThrough) {
|
||||
JumpInfo[count]->FallThrough = false;
|
||||
|
@ -3563,8 +3598,8 @@ CPU_Message("PermLoop *** 1");
|
|||
for (count = 0; count < 2; count ++) {
|
||||
if (JumpInfo[count]->FallThrough) {
|
||||
if (JumpInfo[count]->TargetPC < Section->CompilePC) {
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(),true);
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(),true);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3573,7 +3608,7 @@ CPU_Message("PermLoop *** 1");
|
|||
|
||||
for (count = 0; count < 2; count ++) {
|
||||
if (JumpInfo[count]->FallThrough) {
|
||||
g_N64System->GetRecompiler()->GenerateX86Code(*(Section->BlockInfo),(*TargetSection[count]),CBlockSection::GetNewTestValue());
|
||||
_N64System->GetRecompiler()->GenerateX86Code(*(Section->BlockInfo),(*TargetSection[count]),CBlockSection::GetNewTestValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3588,7 +3623,7 @@ CPU_Message("PermLoop *** 1");
|
|||
SetJump32(JumpInfo[count]->LinkLocation2,RecompPos);
|
||||
JumpInfo[count]->LinkLocation2 = NULL;
|
||||
}
|
||||
g_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC,JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
_N64System->GetRecompiler()->CompileExit (Section,Section->CompilePC,JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet,CExitInfo::Normal,true,NULL);
|
||||
continue;
|
||||
}
|
||||
if (JumpInfo[count]->TargetPC != (*TargetSection[count])->StartPC) {
|
||||
|
@ -3596,7 +3631,7 @@ CPU_Message("PermLoop *** 1");
|
|||
BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
if ((*TargetSection[count])->CompiledLocation == NULL) {
|
||||
g_N64System->GetRecompiler()->GenerateX86Code(*(*TargetSection[count])->BlockInfo,(*TargetSection[count]),CBlockSection::GetNewTestValue());
|
||||
_N64System->GetRecompiler()->GenerateX86Code(*(*TargetSection[count])->BlockInfo,(*TargetSection[count]),CBlockSection::GetNewTestValue());
|
||||
} else {
|
||||
char Label[100];
|
||||
|
||||
|
@ -3609,18 +3644,18 @@ CPU_Message("PermLoop *** 1");
|
|||
}
|
||||
Section->RegWorking = JumpInfo[count]->RegSet;
|
||||
if (JumpInfo[count]->TargetPC <= Section->CompilePC) {
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), true);
|
||||
|
||||
if (JumpInfo[count]->PermLoop) {
|
||||
CPU_Message("PermLoop *** 3");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,g_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
MoveConstToVariable(JumpInfo[count]->TargetPC,_PROGRAM_COUNTER,"PROGRAM_COUNTER");
|
||||
Call_Direct(InPermLoop,"InPermLoop");
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(-1,JumpInfo[count]->RegSet);
|
||||
} else {
|
||||
g_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
_N64System->GetRecompiler()->CompileSystemCheck(JumpInfo[count]->TargetPC,JumpInfo[count]->RegSet);
|
||||
}
|
||||
} else{
|
||||
g_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
_N64System->GetRecompiler()->UpdateCounters(&JumpInfo[count]->RegSet.BlockCycleCount(),&JumpInfo[count]->RegSet.BlockRandomModifier(), false);
|
||||
}
|
||||
Section->RegWorking = JumpInfo[count]->RegSet;
|
||||
SyncRegState(Section,&(*TargetSection[count])->RegStart);
|
||||
|
@ -3693,7 +3728,10 @@ void CRecompiler::RemoveFunction (FUNCTION_INFO * FunInfo, bool DelaySlot, REMOV
|
|||
FUNCTION_INFO * info = m_Functions.FindFunction(Addr,0xFFF);
|
||||
if (info == NULL)
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
_MMU->UnProtectMemory(Addr,Addr + 0xFFC);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3707,7 +3745,9 @@ bool CRecompiler::ClearRecompCode_Phys(DWORD Address, int length, REMOVE_REASON
|
|||
if (g_UseTlb)
|
||||
{
|
||||
DWORD VAddr, Index = 0;
|
||||
while (_MMU->PAddrToVAddr(Address,VAddr,Index))
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
while (_TLB->PAddrToVAddr(Address,VAddr,Index))
|
||||
{
|
||||
WriteTraceF(TraceRecompiler,"ClearRecompCode Vaddr %X len: %d",VAddr,length);
|
||||
if (!ClearRecompCode_Virt(VAddr,length,Reason))
|
||||
|
@ -3715,6 +3755,7 @@ bool CRecompiler::ClearRecompCode_Phys(DWORD Address, int length, REMOVE_REASON
|
|||
Result = false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (LookUpMode() == FuncFind_PhysicalLookup)
|
||||
{
|
||||
|
@ -3787,7 +3828,10 @@ void CRecompiler::SyncRegState (CBlockSection * Section, CRegInfo * SyncTo)
|
|||
}
|
||||
}
|
||||
if (!changed) {
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
MoveVariableToX86reg(g_MemoryStack,"MemoryStack",x86Reg);
|
||||
#endif
|
||||
}
|
||||
changed = TRUE;
|
||||
}
|
||||
|
@ -3845,8 +3889,8 @@ void CRecompiler::SyncRegState (CBlockSection * Section, CRegInfo * SyncTo)
|
|||
UnMap_X86reg(Section,x86RegHi);
|
||||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_UNKNOWN:
|
||||
MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&GPR[count].UW[1],GPR_NameHi[count],x86RegHi);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[1],GPR_NameHi[count],x86RegHi);
|
||||
break;
|
||||
case CRegInfo::STATE_MAPPED_64:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
@ -3892,7 +3936,7 @@ void CRecompiler::SyncRegState (CBlockSection * Section, CRegInfo * SyncTo)
|
|||
x86Reg = SyncTo->MipsRegLo(count);
|
||||
UnMap_X86reg(Section,x86Reg);
|
||||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg); break;
|
||||
case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg); break;
|
||||
case CRegInfo::STATE_CONST_32: MoveConstToX86reg(Section->MipsRegLo(count),x86Reg); break;
|
||||
case CRegInfo::STATE_MAPPED_32_SIGN:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
@ -3928,7 +3972,7 @@ void CRecompiler::SyncRegState (CBlockSection * Section, CRegInfo * SyncTo)
|
|||
switch (Section->MipsRegState(count)) {
|
||||
case CRegInfo::STATE_MAPPED_64:
|
||||
case CRegInfo::STATE_UNKNOWN:
|
||||
MoveVariableToX86reg(&GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
MoveVariableToX86reg(&_GPR[count].UW[0],GPR_NameLo[count],x86Reg);
|
||||
break;
|
||||
case CRegInfo::STATE_MAPPED_32_ZERO:
|
||||
MoveX86RegToX86Reg(Section->MipsRegLo(count),x86Reg);
|
||||
|
|
|
@ -13,8 +13,6 @@ public:
|
|||
};
|
||||
|
||||
private:
|
||||
CMipsMemory * const _MMU; //Memory of the n64
|
||||
CRegisters * const _Reg;
|
||||
bool const m_SyncSystem;
|
||||
CProfiling & m_Profile;
|
||||
bool & m_EndEmulation;
|
||||
|
@ -53,7 +51,7 @@ private:
|
|||
void RemoveFunction (FUNCTION_INFO * FunInfo, bool DelaySlot, REMOVE_REASON Reason );
|
||||
|
||||
public:
|
||||
CRecompiler (CMipsMemory * MMU, CProfiling & Profile, bool & EndEmulation, bool SyncSystem);
|
||||
CRecompiler (CProfiling & Profile, bool & EndEmulation, bool SyncSystem);
|
||||
~CRecompiler (void);
|
||||
|
||||
void Run ( void );
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#include "..\N64 System.h"
|
||||
#include "..\\User Interface\\resource.h"
|
||||
|
||||
RomInformation::RomInformation (const char * RomFile, CNotification * Notify):
|
||||
_Notify(Notify),
|
||||
RomInformation::RomInformation (const char * RomFile):
|
||||
m_DeleteRomInfo(true),
|
||||
m_FileName(RomFile? RomFile : ""),
|
||||
m_pRomInfo(NULL)
|
||||
{
|
||||
if (m_FileName.length() == 0) { return; }
|
||||
m_pRomInfo = new CN64Rom(Notify);
|
||||
m_pRomInfo = new CN64Rom;
|
||||
if (!m_pRomInfo->LoadN64Image(m_FileName.c_str())) {
|
||||
delete m_pRomInfo;
|
||||
m_pRomInfo = NULL;
|
||||
|
@ -16,8 +15,7 @@ RomInformation::RomInformation (const char * RomFile, CNotification * Notify):
|
|||
}
|
||||
}
|
||||
|
||||
RomInformation::RomInformation (CN64Rom * RomInfo, CNotification * Notify):
|
||||
_Notify(Notify),
|
||||
RomInformation::RomInformation (CN64Rom * RomInfo) :
|
||||
m_DeleteRomInfo(false),
|
||||
m_FileName(RomInfo ? RomInfo->GetFileName().c_str() : ""),
|
||||
m_pRomInfo(RomInfo)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class RomInformation {
|
||||
CNotification * const _Notify;
|
||||
class RomInformation
|
||||
{
|
||||
bool const m_DeleteRomInfo;
|
||||
stdstr const m_FileName;
|
||||
CN64Rom * m_pRomInfo;
|
||||
|
@ -7,8 +7,8 @@ class RomInformation {
|
|||
friend DWORD CALLBACK RomInfoProc ( WND_HANDLE, DWORD, DWORD, DWORD );
|
||||
|
||||
public:
|
||||
RomInformation(const char * RomFile, CNotification * Notify);
|
||||
RomInformation(CN64Rom * RomInfo, CNotification * Notify);
|
||||
RomInformation(const char * RomFile );
|
||||
RomInformation(CN64Rom * RomInfo );
|
||||
~RomInformation(void);
|
||||
|
||||
void DisplayInformation (WND_HANDLE hParent) const;
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
#include "N64 System/C Core/C Core.h"
|
||||
#include "System Globals.h"
|
||||
|
||||
CN64System * _N64System;
|
||||
CN64System * _SyncSystem;
|
||||
CRecompiler * _Recompiler;
|
||||
CMipsMemory * _MMU; //Memory of the n64
|
||||
CTLB * _TLB; //TLB Unit
|
||||
CRegisters * _Reg; //Current Register Set attacted to the _MMU
|
||||
CNotification * _Notify;
|
||||
//CSettings * _Settings;
|
||||
CPlugins * _Plugins;
|
||||
CN64Rom * _Rom; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
CAudio * _Audio;
|
||||
CMemoryLabel * _Labels;
|
||||
|
||||
MULTI_ACCESS_QWORD * _GPR, * _FPR, * _RegHI, * _RegLO;
|
||||
DWORD * _PROGRAM_COUNTER, * _CP0, * _RegMI, * _LLBit,
|
||||
* _LLAddr, * _FPCR, * _RegSI, * _RegRI, * _RegPI, * _RegAI,
|
||||
* _RegVI, * _RegDPC, * _RegSP, * _RegRDRAM;
|
||||
double ** _FPRDoubleLocation;
|
||||
float ** _FPRFloatLocation;
|
||||
enum TimerType * _CurrentTimerType;
|
||||
int * _Timer;
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
extern CN64System * _N64System;
|
||||
extern CN64System * _SyncSystem;
|
||||
extern CRecompiler * _Recompiler;
|
||||
extern CMipsMemory * _MMU; //Memory of the n64
|
||||
extern CTLB * _TLB; //TLB Unit
|
||||
extern CRegisters * _Reg; //Current Register Set attacted to the _MMU
|
||||
extern CNotification * _Notify;
|
||||
extern CSettings * _Settings;
|
||||
extern CPlugins * _Plugins;
|
||||
extern CN64Rom * _Rom; //The current rom that this system is executing.. it can only execute one file at the time
|
||||
extern CAudio * _Audio;
|
||||
extern CMemoryLabel * _Labels;
|
||||
|
||||
extern MULTI_ACCESS_QWORD * _GPR, * _FPR, * _RegHI, * _RegLO;
|
||||
extern DWORD * _PROGRAM_COUNTER, * _CP0, * _RegMI, * _LLBit,
|
||||
* _LLAddr, * _FPCR, * _RegSI, * _RegRI, * _RegPI, * _RegAI,
|
||||
* _RegVI, * _RegDPC, * _RegSP, * _RegRDRAM;
|
||||
extern double ** _FPRDoubleLocation;
|
||||
extern float ** _FPRFloatLocation;
|
||||
extern enum TimerType * _CurrentTimerType;
|
||||
extern int * _Timer;
|
|
@ -0,0 +1 @@
|
|||
#include "../stdafx.h"
|
|
@ -3,7 +3,8 @@
|
|||
|
||||
void FixUPXIssue ( BYTE * ProgramLocation );
|
||||
|
||||
CAudioPlugin::CAudioPlugin ( const char * FileName) {
|
||||
CAudioPlugin::CAudioPlugin ( const char * FileName)
|
||||
{
|
||||
//Make sure all parts of the class are initialized
|
||||
m_Initilized = false;
|
||||
m_RomOpen = false;
|
||||
|
@ -90,7 +91,6 @@ CAudioPlugin::CAudioPlugin ( const char * FileName) {
|
|||
if (PluginOpened == NULL) { UnloadPlugin(); return; }
|
||||
PluginOpened();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
CAudioPlugin::~CAudioPlugin (void) {
|
||||
|
@ -162,18 +162,16 @@ bool CAudioPlugin::Initiate ( CN64System * System, CMainGui * RenderWindow ) {
|
|||
Sleep(100);
|
||||
return m_Initilized;
|
||||
}
|
||||
_System = System;
|
||||
_Reg = System->_MMU->_Reg;
|
||||
m_StatusReg = 0;
|
||||
|
||||
//Send Initilization information to the DLL
|
||||
Info.hwnd = (HWND)RenderWindow->m_hMainWindow;
|
||||
Info.hinst = GetModuleHandle(NULL);
|
||||
Info.MemoryBswaped = TRUE;
|
||||
Info.HEADER = System->_MMU->ROM;
|
||||
Info.RDRAM = System->_MMU->RDRAM;
|
||||
Info.DMEM = System->_MMU->DMEM;
|
||||
Info.IMEM = System->_MMU->IMEM;
|
||||
Info.HEADER = _Rom->GetRomAddress();
|
||||
Info.RDRAM = _MMU->Rdram();
|
||||
Info.DMEM = _MMU->Dmem();
|
||||
Info.IMEM = _MMU->Imem();
|
||||
Info.MI__INTR_REG = &_Reg->AudioIntrReg;
|
||||
Info.AI__DRAM_ADDR_REG = &_Reg->AI_DRAM_ADDR_REG;
|
||||
Info.AI__LEN_REG = &_Reg->AI_LEN_REG;
|
||||
|
@ -263,9 +261,6 @@ void CAudioPlugin::UnloadPlugin(void) {
|
|||
RomClosed = NULL;
|
||||
CloseDLL = NULL;
|
||||
m_CountsPerByte = 100;
|
||||
_System = NULL;
|
||||
_Reg = NULL;
|
||||
|
||||
}
|
||||
|
||||
void CAudioPlugin::DacrateChanged (SystemType Type) {
|
||||
|
|
|
@ -3,9 +3,6 @@ class CAudioPlugin {
|
|||
bool m_Initilized, m_RomOpen;
|
||||
void * m_hAudioThread;
|
||||
PLUGIN_INFO m_PluginInfo;
|
||||
|
||||
CN64System * _System;
|
||||
CRegisters * _Reg;
|
||||
|
||||
DWORD m_StatusReg;
|
||||
DWORD m_CountsPerByte;
|
||||
|
|
|
@ -107,7 +107,6 @@ CControl_Plugin::~CControl_Plugin (void) {
|
|||
}
|
||||
|
||||
bool CControl_Plugin::Initiate ( CN64System * System, CMainGui * RenderWindow ) {
|
||||
_Notify = RenderWindow->GetNotifyClass();
|
||||
m_PluginControllers[0].Present = FALSE;
|
||||
m_PluginControllers[0].RawData = FALSE;
|
||||
m_PluginControllers[0].Plugin = PLUGIN_NONE;
|
||||
|
@ -174,7 +173,7 @@ bool CControl_Plugin::Initiate ( CN64System * System, CMainGui * RenderWindow )
|
|||
m_Initilized = true;
|
||||
} else {
|
||||
ControlInfo.Controls = m_PluginControllers;
|
||||
ControlInfo.HEADER = System->_MMU->ROM;
|
||||
ControlInfo.HEADER = _Rom->GetRomAddress();
|
||||
ControlInfo.hinst = GetModuleHandle(NULL);
|
||||
ControlInfo.hMainWindow = (HWND)RenderWindow->m_hMainWindow;
|
||||
ControlInfo.MemoryBswaped = TRUE;
|
||||
|
|
|
@ -219,15 +219,14 @@ bool CGfxPlugin::Initiate ( CN64System * System, CMainGui * RenderWindow ) {
|
|||
}
|
||||
|
||||
//Send Initilization information to the DLL
|
||||
CRegisters * _Reg = System->_MMU->_Reg;
|
||||
Info.MemoryBswaped = TRUE;
|
||||
Info.CheckInterrupts = DummyCheckInterrupts;
|
||||
Info.hWnd = (HWND)RenderWindow->m_hMainWindow;
|
||||
Info.hStatusBar = (HWND)RenderWindow->m_hStatusWnd;
|
||||
Info.HEADER = System->_MMU->ROM;
|
||||
Info.RDRAM = System->_MMU->RDRAM;
|
||||
Info.DMEM = System->_MMU->DMEM;
|
||||
Info.IMEM = System->_MMU->IMEM;
|
||||
Info.HEADER = _Rom->GetRomAddress();
|
||||
Info.RDRAM = _MMU->Rdram();
|
||||
Info.DMEM = _MMU->Dmem();
|
||||
Info.IMEM = _MMU->Imem();
|
||||
Info.MI__INTR_REG = &_Reg->MI_INTR_REG;
|
||||
Info.DPC__START_REG = &_Reg->DPC_START_REG;
|
||||
Info.DPC__END_REG = &_Reg->DPC_END_REG;
|
||||
|
|
|
@ -88,30 +88,19 @@ void CPlugins::SetRenderWindows( CMainGui * RenderWindow, CMainGui * DummyWindow
|
|||
_DummyWindow = DummyWindow;
|
||||
}
|
||||
|
||||
bool CPlugins::Initiate ( CN64System * System )
|
||||
bool CPlugins::Initiate ( void )
|
||||
{
|
||||
PVOID MemBuffer[] = {
|
||||
VirtualAlloc( NULL, 0x10000000, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ),
|
||||
VirtualAlloc( NULL, 0x10000000, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ),
|
||||
VirtualAlloc( NULL, 0x10000000, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ),
|
||||
};
|
||||
|
||||
bool bResult = _RenderWindow->InitiatePlugins(this, System);
|
||||
bool bResult = _RenderWindow->InitiatePlugins();
|
||||
if (bResult)
|
||||
{
|
||||
m_Gfx->RomOpened();
|
||||
m_Audio->RomOpened();
|
||||
m_Control->RomOpened();
|
||||
}
|
||||
|
||||
for (int i = 0; i < sizeof(MemBuffer) / sizeof(MemBuffer[0]); i++)
|
||||
{
|
||||
VirtualFree( MemBuffer[i], 0 , MEM_RELEASE);
|
||||
}
|
||||
return bResult;
|
||||
}
|
||||
|
||||
bool CPlugins::InitiateMainThread(CN64System * System )
|
||||
bool CPlugins::InitiateMainThread( void )
|
||||
{
|
||||
WriteTrace(TraceDebug,"CPlugins::Initiate 1");
|
||||
//Check to make sure we have the plugin avaliable to be used
|
||||
|
@ -132,14 +121,14 @@ bool CPlugins::InitiateMainThread(CN64System * System )
|
|||
WriteTrace(TraceDebug,"CPlugins::Initiate 6");
|
||||
|
||||
WriteTrace(TraceGfxPlugin,"Initiate: Starting");
|
||||
if (!m_Gfx->Initiate(System,_RenderWindow)) { return false; }
|
||||
if (!m_Gfx->Initiate(_N64System,_RenderWindow)) { return false; }
|
||||
WriteTrace(TraceGfxPlugin,"Initiate: Done");
|
||||
WriteTrace(TraceDebug,"CPlugins::Initiate 7");
|
||||
if (!m_Audio->Initiate(System,_RenderWindow)) { return false; }
|
||||
if (!m_Audio->Initiate(_N64System,_RenderWindow)) { return false; }
|
||||
WriteTrace(TraceDebug,"CPlugins::Initiate 8");
|
||||
if (!m_Control->Initiate(System,_RenderWindow)) { return false; }
|
||||
if (!m_Control->Initiate(_N64System,_RenderWindow)) { return false; }
|
||||
WriteTrace(TraceRSP ,"Initiate: Starting");
|
||||
if (!m_RSP->Initiate(this,System)) { return false; }
|
||||
if (!m_RSP->Initiate(this,_N64System)) { return false; }
|
||||
WriteTrace(TraceRSP,"Initiate: Done");
|
||||
WriteTrace(TraceDebug,"CPlugins::Initiate 10");
|
||||
|
||||
|
|
|
@ -90,8 +90,8 @@ public:
|
|||
CPlugins (const stdstr & PluginDir );
|
||||
~CPlugins ();
|
||||
|
||||
bool Initiate ( CN64System * System );
|
||||
bool InitiateMainThread ( CN64System * System );
|
||||
bool Initiate ( void );
|
||||
bool InitiateMainThread ( void );
|
||||
void SetRenderWindows ( CMainGui * RenderWindow, CMainGui * DummyWindow );
|
||||
void ConfigPlugin ( DWORD hParent, PLUGIN_TYPE Type );
|
||||
void CopyPlugins ( const stdstr & DstDir ) const;
|
||||
|
|
|
@ -134,7 +134,6 @@ bool CPluginList::ValidPluginVersion ( PLUGIN_INFO & PluginInfo ) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
#ifdef tofix
|
||||
CPluginList::CPluginList (CSettings * Settings) {
|
||||
_Settings = Settings;
|
||||
|
|
|
@ -119,7 +119,8 @@ void CRSP_Plugin::GameReset(void)
|
|||
}
|
||||
}
|
||||
|
||||
bool CRSP_Plugin::Initiate ( CPlugins * Plugins, CN64System * System ) {
|
||||
bool CRSP_Plugin::Initiate ( CPlugins * Plugins, CN64System * System )
|
||||
{
|
||||
//Get DLL information
|
||||
void (__cdecl *GetDllInfo) ( PLUGIN_INFO * PluginInfo );
|
||||
GetDllInfo = (void (__cdecl *)(PLUGIN_INFO *))GetProcAddress( (HMODULE)hDll, "GetDllInfo" );
|
||||
|
@ -179,7 +180,8 @@ bool CRSP_Plugin::Initiate ( CPlugins * Plugins, CN64System * System ) {
|
|||
//We are initilizing the plugin before any rom is loaded so we do not have any correct
|
||||
//paramaters here .. just needed to we can config the DLL
|
||||
|
||||
if (System == NULL) {
|
||||
if (System == NULL)
|
||||
{
|
||||
BYTE Buffer[100];
|
||||
DWORD Value = 0;
|
||||
|
||||
|
@ -227,7 +229,6 @@ bool CRSP_Plugin::Initiate ( CPlugins * Plugins, CN64System * System ) {
|
|||
}
|
||||
|
||||
//Send Initilization information to the DLL
|
||||
CRegisters * _Reg = System->_MMU->_Reg;
|
||||
Info.CheckInterrupts = DummyCheckInterrupts;
|
||||
Info.ProcessDlist = Plugins->Gfx()->ProcessDList;
|
||||
Info.ProcessRdpList = Plugins->Gfx()->ProcessRDPList;
|
||||
|
@ -235,9 +236,9 @@ bool CRSP_Plugin::Initiate ( CPlugins * Plugins, CN64System * System ) {
|
|||
Info.ProcessAlist = Plugins->Audio()->ProcessAList;
|
||||
|
||||
Info.hInst = GetModuleHandle(NULL);;
|
||||
Info.RDRAM = System->_MMU->RDRAM;
|
||||
Info.DMEM = System->_MMU->DMEM;
|
||||
Info.IMEM = System->_MMU->IMEM;
|
||||
Info.RDRAM = _MMU->Rdram();
|
||||
Info.DMEM = _MMU->Dmem();
|
||||
Info.IMEM = _MMU->Imem();
|
||||
Info.MemoryBswaped = FALSE;
|
||||
|
||||
Info.MI__INTR_REG = &_Reg->MI_INTR_REG;
|
||||
|
|
|
@ -44,7 +44,7 @@ RSC=rc.exe
|
|||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "../" /I "./" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "../" /I "./" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# SUBTRACT CPP /Fr
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
|
@ -281,6 +281,30 @@ SOURCE=".\User Interface\WTL Controls\ModifiedEditBox.cpp"
|
|||
SOURCE=".\User Interface\WTL Controls\PartialGroupBox.cpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Debugger Source"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - Memory Dump.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - Memory Search.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - TLB.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - View Memory.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger.cpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="User Interface\Cheats.cpp"
|
||||
|
@ -378,7 +402,7 @@ SOURCE="N64 System\C Core\C Core Interface.cpp"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\C main.c"
|
||||
SOURCE=".\N64 System\C Core\C main.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -402,7 +426,7 @@ SOURCE=".\N64 System\C Core\Eeprom.cpp"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\Exception.c"
|
||||
SOURCE=".\N64 System\C Core\Exception.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -414,7 +438,15 @@ SOURCE=".\N64 System\C Core\Interpreter CPU.cpp"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\Interpreter Ops.c"
|
||||
SOURCE=".\N64 System\C Core\Interpreter Ops 32.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\N64 System\C Core\Interpreter Ops 32.h"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\N64 System\C Core\Interpreter Ops.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -430,7 +462,7 @@ SOURCE=".\N64 System\C Core\Pif.cpp"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\r4300i Commands.c"
|
||||
SOURCE=".\N64 System\C Core\r4300i Commands.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -458,7 +490,7 @@ SOURCE="N64 System\C Core\Registers.cpp"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\Sram.c"
|
||||
SOURCE=".\N64 System\C Core\Sram.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -470,43 +502,15 @@ SOURCE="N64 System\C Core\TLB Display.c"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\Tlb.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\Win32Timer.c"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\x86 fpu.c"
|
||||
SOURCE=".\N64 System\C Core\x86 fpu.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\C Core\X86.c"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Debugger Source"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - Memory Dump.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - Memory Search.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - TLB.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger - View Memory.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Debugger\Debugger.cpp"
|
||||
SOURCE=".\N64 System\C Core\X86.cpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Recompiler Files"
|
||||
|
@ -557,6 +561,10 @@ SOURCE="N64 System\Rom Information Class.cpp"
|
|||
|
||||
SOURCE="N64 System\Speed Limitor Class.cpp"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\N64 System\System Globals.cpp"
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Plugin Source"
|
||||
|
||||
|
@ -1171,6 +1179,10 @@ SOURCE="N64 System\Speed Limitor Class.h"
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=".\N64 System\System Globals.h"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="N64 System\Types.h"
|
||||
# End Source File
|
||||
# End Group
|
||||
|
@ -1268,6 +1280,10 @@ SOURCE=Settings.h
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\stdafx.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE="User Interface.h"
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
@ -52,6 +52,7 @@ class CN64System;
|
|||
#include ".\\User Interface\\Frame Per Second Class.h"
|
||||
#include ".\\User Interface\\Cheats.h"
|
||||
#include ".\\User Interface\\resource.h"
|
||||
#include ".\\User Interface\\Settings Config.h"
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,16 +1,21 @@
|
|||
#include "stdafx.h"
|
||||
/*
|
||||
#include "..\\User Interface.h"
|
||||
#include "..\\N64 System.h"
|
||||
#include "..\\Plugin.h"
|
||||
#include "..\\Validate Binary.h"
|
||||
#include "..\\User Interface\\Settings Config.h"
|
||||
#include <common/CriticalSection.h>
|
||||
|
||||
#include <vector>
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
*/
|
||||
|
||||
// c functions for old debugger
|
||||
#ifdef toremove
|
||||
extern CSettings * g_Settings;
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
void EnterLogOptions(HWND hwndOwner);
|
||||
}
|
||||
|
@ -38,8 +43,9 @@ bool CMainGui::RegisterWinClass ( void ) {
|
|||
return true;
|
||||
}
|
||||
|
||||
CMainGui::CMainGui (const char * WindowTitle, CNotification * Notify, CN64System * System) :
|
||||
CRomBrowser(m_hMainWindow,m_hStatusWnd,Notify,System)
|
||||
CMainGui::CMainGui (bool bMainWindow, const char * WindowTitle ) :
|
||||
CRomBrowser(m_hMainWindow,m_hStatusWnd),
|
||||
m_bMainWindow(bMainWindow)
|
||||
{
|
||||
m_hacked = false;
|
||||
if (_Settings)
|
||||
|
@ -50,8 +56,6 @@ CMainGui::CMainGui (const char * WindowTitle, CNotification * Notify, CN64System
|
|||
m_hacked = true;
|
||||
}
|
||||
}
|
||||
m_System = System;
|
||||
m_Notify = Notify;
|
||||
m_Menu = NULL;
|
||||
|
||||
m_hMainWindow = 0;
|
||||
|
@ -66,7 +70,7 @@ CMainGui::CMainGui (const char * WindowTitle, CNotification * Notify, CN64System
|
|||
|
||||
m_InvalidExeMsg = RegisterWindowMessage("Invalid");
|
||||
|
||||
if (m_System)
|
||||
if (m_bMainWindow)
|
||||
{
|
||||
_Settings->RegisterChangeCB(RomBrowser_Enabled,this,(CSettings::SettingChangedFunc)RomBowserEnabledChanged);
|
||||
_Settings->RegisterChangeCB(RomBrowser_ColoumnsChanged,this,(CSettings::SettingChangedFunc)RomBowserColoumnsChanged);
|
||||
|
@ -82,7 +86,7 @@ CMainGui::CMainGui (const char * WindowTitle, CNotification * Notify, CN64System
|
|||
CMainGui::~CMainGui (void)
|
||||
{
|
||||
WriteTrace(TraceDebug,"CMainGui::~CMainGui - start");
|
||||
if (m_System)
|
||||
if (m_bMainWindow)
|
||||
{
|
||||
_Settings->UnregisterChangeCB(RomBrowser_Enabled,this,(CSettings::SettingChangedFunc)RomBowserEnabledChanged);
|
||||
_Settings->UnregisterChangeCB(RomBrowser_ColoumnsChanged,this,(CSettings::SettingChangedFunc)RomBowserColoumnsChanged);
|
||||
|
@ -271,9 +275,9 @@ DWORD CALLBACK AboutIniBoxProc (WND_HANDLE WndHandle, DWORD uMsg, DWORD wParam,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
bool CMainGui::InitiatePlugins (CPlugins * _this, CN64System * System)
|
||||
bool CMainGui::InitiatePlugins (void)
|
||||
{
|
||||
return SendMessage((HWND)m_hMainWindow,WM_INIATE_PLUGIN,(WPARAM)_this,(LPARAM)System) != 0;
|
||||
return SendMessage((HWND)m_hMainWindow,WM_INIATE_PLUGIN,0,0) != 0;
|
||||
}
|
||||
|
||||
void CMainGui::BringToTop (void) {
|
||||
|
@ -310,7 +314,7 @@ int CMainGui::ProcessAllMessages (void) {
|
|||
MSG msg;
|
||||
|
||||
while (GetMessage(&msg,NULL,0,0)) {
|
||||
if (m_System && m_System->IsDialogMsg(&msg))
|
||||
if (_N64System && _N64System->IsDialogMsg(&msg))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -363,10 +367,13 @@ void CMainGui::Show (bool Visible) {
|
|||
|
||||
void CMainGui::EnterLogOptions (void)
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
#ifdef tofix
|
||||
g_Settings = _Settings;
|
||||
::EnterLogOptions((HWND)m_hMainWindow);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
int CMainGui::Height (void) {
|
||||
|
@ -502,36 +509,38 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
case WM_MOVE:
|
||||
{
|
||||
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
CN64System * System = _this->m_System;
|
||||
|
||||
if (!IsIconic((HWND)hWnd)) {
|
||||
//get the current position of the window
|
||||
RECT WinRect;
|
||||
GetWindowRect((HWND)hWnd, &WinRect );
|
||||
|
||||
//save the location of the window
|
||||
if (!_this->ShowingRomBrowser()) {
|
||||
if (_this->RomBrowserVisible())
|
||||
{
|
||||
if (!IsZoomed((HWND)hWnd))
|
||||
if (_this->m_bMainWindow)
|
||||
{
|
||||
if (!IsIconic((HWND)hWnd)) {
|
||||
//get the current position of the window
|
||||
RECT WinRect;
|
||||
GetWindowRect((HWND)hWnd, &WinRect );
|
||||
|
||||
//save the location of the window
|
||||
if (!_this->ShowingRomBrowser()) {
|
||||
if (_this->RomBrowserVisible())
|
||||
{
|
||||
_this->m_SaveRomBrowserPos = true;
|
||||
_this->m_SaveRomBrowserTop = WinRect.top;
|
||||
_this->m_SaveRomBrowserLeft = WinRect.left;
|
||||
if (!IsZoomed((HWND)hWnd))
|
||||
{
|
||||
_this->m_SaveRomBrowserPos = true;
|
||||
_this->m_SaveRomBrowserTop = WinRect.top;
|
||||
_this->m_SaveRomBrowserLeft = WinRect.left;
|
||||
}
|
||||
} else {
|
||||
_this->m_SaveMainWindowPos = true;
|
||||
_this->m_SaveMainWindowTop = WinRect.top;
|
||||
_this->m_SaveMainWindowLeft = WinRect.left;
|
||||
}
|
||||
} else {
|
||||
_this->m_SaveMainWindowPos = true;
|
||||
_this->m_SaveMainWindowTop = WinRect.top;
|
||||
_this->m_SaveMainWindowLeft = WinRect.left;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (CGuiSettings::bCPURunning() && System) {
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
if (Plugins->Gfx() && Plugins->Gfx()->MoveScreen) {
|
||||
WriteTrace(TraceGfxPlugin,"MoveScreen: Starting");
|
||||
Plugins->Gfx()->MoveScreen((int)(short) LOWORD(lParam), (int)(short) HIWORD(lParam));
|
||||
WriteTrace(TraceGfxPlugin,"MoveScreen: Done");
|
||||
if (CGuiSettings::bCPURunning() && _N64System) {
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins->Gfx() && Plugins->Gfx()->MoveScreen) {
|
||||
WriteTrace(TraceGfxPlugin,"MoveScreen: Starting");
|
||||
Plugins->Gfx()->MoveScreen((int)(short) LOWORD(lParam), (int)(short) HIWORD(lParam));
|
||||
WriteTrace(TraceGfxPlugin,"MoveScreen: Done");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -601,8 +610,8 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
CN64System * System = _this->m_System;
|
||||
// CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
// CN64System * System = _this->m_System;
|
||||
|
||||
// if (bCPURunning() && Settings->Load(CPU_Paused)) {
|
||||
// CPlugins * Plugins = System->Plugins();
|
||||
|
@ -617,11 +626,14 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
{
|
||||
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
|
||||
if (bCPURunning()) {
|
||||
CN64System * System = _this->m_System;
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
if (Plugins && Plugins->Control()->WM_KeyUp) {
|
||||
Plugins->Control()->WM_KeyUp(wParam, lParam);
|
||||
if (_this->m_bMainWindow && bCPURunning())
|
||||
{
|
||||
if (_N64System)
|
||||
{
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins && Plugins->Control()->WM_KeyUp) {
|
||||
Plugins->Control()->WM_KeyUp(wParam, lParam);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -630,11 +642,15 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
{
|
||||
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
|
||||
if (bCPURunning()) {
|
||||
CN64System * System = _this->m_System;
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
if (Plugins && Plugins->Control()->WM_KeyDown) {
|
||||
Plugins->Control()->WM_KeyDown(wParam, lParam);
|
||||
if (_this->m_bMainWindow && bCPURunning())
|
||||
{
|
||||
if (_N64System)
|
||||
{
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins && Plugins->Control()->WM_KeyDown)
|
||||
{
|
||||
Plugins->Control()->WM_KeyDown(wParam, lParam);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -648,12 +664,12 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
break;
|
||||
}
|
||||
|
||||
if (!bCPURunning()) { break; }
|
||||
if (!bAutoSleep()) { break; }
|
||||
CN64System * System = _this->m_System;
|
||||
if (System)
|
||||
if (_this->m_bMainWindow && bCPURunning() && bAutoSleep())
|
||||
{
|
||||
System->ExternalEvent( ResumeCPU_AppGainedFocus );
|
||||
if (_N64System)
|
||||
{
|
||||
_N64System->ExternalEvent( ResumeCPU_AppGainedFocus );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -665,12 +681,12 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
break;
|
||||
}
|
||||
|
||||
if (!bCPURunning()) { break; }
|
||||
if (!bAutoSleep()) { break; }
|
||||
CN64System * System = _this->m_System;
|
||||
if (System)
|
||||
{
|
||||
System->ExternalEvent( PauseCPU_AppLostFocus );
|
||||
if (_this->m_bMainWindow && bCPURunning() && bAutoSleep())
|
||||
{
|
||||
if (_N64System)
|
||||
{
|
||||
_N64System->ExternalEvent( PauseCPU_AppLostFocus );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -682,23 +698,26 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
if (fActive && _this->RomBrowserVisible()) {
|
||||
PostMessage((HWND)hWnd,WM_BORWSER_TOP,0,0);
|
||||
}
|
||||
if (!bCPURunning()) { break; }
|
||||
|
||||
CN64System * System = _this->m_System;
|
||||
if (!fActive && _Settings->LoadBool(UserInterface_InFullScreen))
|
||||
if (_this->m_bMainWindow && bCPURunning())
|
||||
{
|
||||
_this->m_Notify->WindowMode();
|
||||
if (bAutoSleep() && System)
|
||||
if (!fActive && _Settings->LoadBool(UserInterface_InFullScreen))
|
||||
{
|
||||
//System->ExternalEvent(PauseCPU_AppLostActiveDelayed );
|
||||
_Notify->WindowMode();
|
||||
if (bAutoSleep() && _N64System)
|
||||
{
|
||||
//System->ExternalEvent(PauseCPU_AppLostActiveDelayed );
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (bAutoSleep())
|
||||
{
|
||||
if (_N64System)
|
||||
{
|
||||
_N64System->ExternalEvent(fActive ? ResumeCPU_AppGainedActive : PauseCPU_AppLostActive );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!bAutoSleep()) { break; }
|
||||
if (System)
|
||||
{
|
||||
System->ExternalEvent(fActive ? ResumeCPU_AppGainedActive : PauseCPU_AppLostActive );
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case WM_HIDE_CUROSR:
|
||||
|
@ -717,10 +736,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
break;
|
||||
case WM_INIATE_PLUGIN:
|
||||
{
|
||||
CPlugins * pPlugin = (CPlugins *)wParam;
|
||||
CN64System * pSystem = (CN64System *)lParam;
|
||||
|
||||
return pPlugin->InitiateMainThread(pSystem);
|
||||
return _Plugins->InitiateMainThread();
|
||||
}
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
|
@ -729,19 +745,19 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
if (_this == NULL) { break; }
|
||||
|
||||
switch (LOWORD(wParam)) {
|
||||
case ID_POPUPMENU_PLAYGAME: _this->m_System->RunFileImage(_this->CurrentedSelectedRom()); break;
|
||||
case ID_POPUPMENU_ROMDIRECTORY: _this->SelectRomDir(_this->GetNotifyClass()); break;
|
||||
case ID_POPUPMENU_PLAYGAME: _N64System->RunFileImage(_this->CurrentedSelectedRom()); break;
|
||||
case ID_POPUPMENU_ROMDIRECTORY: _this->SelectRomDir(); break;
|
||||
case ID_POPUPMENU_REFRESHROMLIST: _this->RefreshRomBrowser(); break;
|
||||
case ID_POPUPMENU_ROMINFORMATION:
|
||||
{
|
||||
RomInformation Info(_this->CurrentedSelectedRom(),_this->m_Notify);
|
||||
RomInformation Info(_this->CurrentedSelectedRom());
|
||||
Info.DisplayInformation(hWnd);
|
||||
}
|
||||
break;
|
||||
case ID_POPUPMENU_EDITSETTINGS:
|
||||
case ID_POPUPMENU_EDITCHEATS:
|
||||
{
|
||||
CN64Rom Rom(_this->m_Notify);
|
||||
CN64Rom Rom;
|
||||
Rom.LoadN64Image(_this->CurrentedSelectedRom(),true);
|
||||
Rom.SaveRomSettingID();
|
||||
/*if (_Settings->LoadString(ROM_MD5).length() == 0) {
|
||||
|
@ -757,13 +773,12 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
}
|
||||
|
||||
if (LOWORD(wParam) == ID_POPUPMENU_EDITCHEATS) {
|
||||
CCheats RomCheats(&Rom,_this->m_Notify);
|
||||
CCheats RomCheats(&Rom);
|
||||
RomCheats.SelectCheats(hWnd,true);
|
||||
}
|
||||
|
||||
CN64Rom * CurrentRom = _this->m_System->GetCurrentRom();
|
||||
if (CurrentRom) {
|
||||
CurrentRom->SaveRomSettingID();
|
||||
if (_Rom) {
|
||||
_Rom->SaveRomSettingID();
|
||||
} else {
|
||||
Rom.ClearRomSettingID();
|
||||
}
|
||||
|
@ -772,38 +787,34 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
default:
|
||||
if (_this->m_Menu) {
|
||||
if (LOWORD(wParam) > 5000 && LOWORD(wParam) <= 5100 ) {
|
||||
CN64System * System = _this->m_System;
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins->RSP() && Plugins->RSP()->ProcessMenuItem != NULL) {
|
||||
Plugins->RSP()->ProcessMenuItem(LOWORD(wParam));
|
||||
}
|
||||
} else if (LOWORD(wParam) > 5100 && LOWORD(wParam) <= 5200 ) {
|
||||
CN64System * System = _this->m_System;
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins->Gfx() && Plugins->Gfx()->ProcessMenuItem != NULL) {
|
||||
WriteTrace(TraceGfxPlugin,"ProcessMenuItem: Starting");
|
||||
Plugins->Gfx()->ProcessMenuItem(LOWORD(wParam));
|
||||
WriteTrace(TraceGfxPlugin,"ProcessMenuItem: Done");
|
||||
}
|
||||
} else if (LOWORD(wParam) > 5200 && LOWORD(wParam) <= 5300 ) {
|
||||
CN64System * System = _this->m_System;
|
||||
CPlugins * Plugins = System->Plugins();
|
||||
CPlugins * Plugins = _N64System->Plugins();
|
||||
if (Plugins->Gfx() && Plugins->Gfx()->OnRomBrowserMenuItem != NULL)
|
||||
{
|
||||
CN64Rom Rom(_this->m_Notify);
|
||||
CN64Rom Rom;
|
||||
if (!Rom.LoadN64Image(_this->CurrentedSelectedRom(),true))
|
||||
{
|
||||
break;
|
||||
}
|
||||
Rom.SaveRomSettingID();
|
||||
_this->m_Notify->DisplayMessage(0,"");
|
||||
_Notify->DisplayMessage(0,"");
|
||||
BYTE * RomHeader = Rom.GetRomAddress();
|
||||
WriteTrace(TraceGfxPlugin,"OnRomBrowserMenuItem: Starting");
|
||||
Plugins->Gfx()->OnRomBrowserMenuItem(LOWORD(wParam),hWnd,RomHeader);
|
||||
WriteTrace(TraceGfxPlugin,"OnRomBrowserMenuItem: Done");
|
||||
CN64Rom * CurrentRom = _this->m_System->GetCurrentRom();
|
||||
if (CurrentRom) {
|
||||
CurrentRom->SaveRomSettingID();
|
||||
if (_Rom) {
|
||||
_Rom->SaveRomSettingID();
|
||||
} else {
|
||||
_Settings->SaveString(Game_IniKey,"");
|
||||
}
|
||||
|
@ -819,14 +830,13 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
WriteTrace(TraceDebug,"WM_DESTROY - start");
|
||||
{
|
||||
CMainGui * _this = (CMainGui *)GetProp((HWND)hWnd,"Class");
|
||||
if (_this->m_Notify)
|
||||
if (_this->m_bMainWindow)
|
||||
{
|
||||
_this->m_Notify->WindowMode();
|
||||
_Notify->WindowMode();
|
||||
}
|
||||
CN64System * System = _this->m_System;
|
||||
_this->m_hMainWindow = NULL;
|
||||
WriteTrace(TraceDebug,"WM_DESTROY - 1");
|
||||
if (System)
|
||||
if (_this->m_bMainWindow)
|
||||
{
|
||||
_this->SaveRomListColoumnInfo();
|
||||
WriteTrace(TraceDebug,"WM_DESTROY - 2");
|
||||
|
@ -846,7 +856,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam
|
|||
{
|
||||
if (uMsg == _this->m_InvalidExeMsg)
|
||||
{
|
||||
_this->m_System->CloseCpu();
|
||||
_N64System->CloseCpu();
|
||||
MessageBox((HWND)hWnd,GS(MSG_INVALID_EXE),GS(MSG_INVALID_EXE_TITLE),MB_OK|MB_ICONERROR);
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
|
|
@ -14,9 +14,7 @@ class CMainGui :
|
|||
friend CAudioPlugin;
|
||||
friend CControl_Plugin;
|
||||
|
||||
CN64System * m_System;
|
||||
CBaseMenu * m_Menu;
|
||||
CNotification * m_Notify;
|
||||
|
||||
enum { StatusBarID = 400 };
|
||||
|
||||
|
@ -29,6 +27,7 @@ class CMainGui :
|
|||
|
||||
WND_HANDLE m_hMainWindow, m_hStatusWnd;
|
||||
bool m_hacked;
|
||||
const bool m_bMainWindow;
|
||||
int m_InvalidExeMsg;
|
||||
CriticalSection m_CS;
|
||||
|
||||
|
@ -55,7 +54,7 @@ class CMainGui :
|
|||
friend void RomBrowserRecursiveChanged (CMainGui * Gui);
|
||||
|
||||
public:
|
||||
CMainGui ( const char * WindowTitle = "", CNotification * Notify = 0, CN64System * System = 0 );
|
||||
CMainGui ( bool bMainWindow, const char * WindowTitle = "" );
|
||||
~CMainGui ( void );
|
||||
|
||||
//Message Processing
|
||||
|
@ -91,10 +90,7 @@ public:
|
|||
void AboutBox ( void );
|
||||
|
||||
//Plugins
|
||||
bool InitiatePlugins ( CPlugins * _this, CN64System * System );
|
||||
|
||||
//Get Notification class
|
||||
CNotification * GetNotifyClass (void) { return m_Notify; }
|
||||
bool InitiatePlugins ( void );
|
||||
|
||||
//Get Window Handle
|
||||
inline WND_HANDLE GetHandle ( void ) const { return m_hMainWindow; }
|
||||
|
|
|
@ -6,12 +6,11 @@
|
|||
#include "..\\3rd Party\\HTML Help\\HTMLHELP.H"
|
||||
#include <common/CriticalSection.h>
|
||||
|
||||
CMainMenu::CMainMenu ( CMainGui * hMainWindow, CN64System * N64System ):
|
||||
CMainMenu::CMainMenu ( CMainGui * hMainWindow ):
|
||||
CBaseMenu(),
|
||||
m_ResetAccelerators(true)
|
||||
{
|
||||
_Gui = hMainWindow; //Make a copy of the attatched window
|
||||
_System = N64System; //Make a copy of the n64 system that is being interacted with
|
||||
ResetMenu();
|
||||
|
||||
hMainWindow->SetWindowMenu(this);
|
||||
|
@ -69,29 +68,29 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
switch (MenuID) {
|
||||
case ID_FILE_OPEN_ROM:
|
||||
{
|
||||
stdstr File = _System->ChooseFileToOpen(hWnd);
|
||||
stdstr File = _N64System->ChooseFileToOpen(hWnd);
|
||||
if (File.length() > 0) {
|
||||
_System->RunFileImage(File.c_str());
|
||||
_N64System->RunFileImage(File.c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ID_FILE_ROM_INFO:
|
||||
{
|
||||
_System->DisplayRomInfo(hWnd);
|
||||
_N64System->DisplayRomInfo(hWnd);
|
||||
}
|
||||
break;
|
||||
case ID_FILE_STARTEMULATION:
|
||||
_Gui->SaveWindowLoc();
|
||||
_System->StartEmulation(true);
|
||||
_N64System->StartEmulation(true);
|
||||
break;
|
||||
case ID_FILE_ENDEMULATION:
|
||||
WriteTrace(TraceDebug,"ID_FILE_ENDEMULATION");
|
||||
_System->CloseCpu();
|
||||
_N64System->CloseCpu();
|
||||
_Gui->SaveWindowLoc();
|
||||
break;
|
||||
case ID_FILE_ROMDIRECTORY:
|
||||
WriteTrace(TraceDebug,"ID_FILE_ROMDIRECTORY 1");
|
||||
_Gui->SelectRomDir(_Gui->GetNotifyClass());
|
||||
_Gui->SelectRomDir();
|
||||
WriteTrace(TraceDebug,"ID_FILE_ROMDIRECTORY 2");
|
||||
_Gui->RefreshMenu();
|
||||
WriteTrace(TraceDebug,"ID_FILE_ROMDIRECTORY 3");
|
||||
|
@ -100,20 +99,20 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
case ID_FILE_EXIT: DestroyWindow((HWND)hWnd); break;
|
||||
case ID_SYSTEM_RESET_SOFT:
|
||||
WriteTrace(TraceDebug,"ID_SYSTEM_RESET_SOFT");
|
||||
_System->ExternalEvent(ResetCPU_Soft);
|
||||
_N64System->ExternalEvent(ResetCPU_Soft);
|
||||
break;
|
||||
case ID_SYSTEM_RESET_HARD:
|
||||
WriteTrace(TraceDebug,"ID_SYSTEM_RESET_HARD");
|
||||
_System->ExternalEvent(ResetCPU_Hard);
|
||||
_N64System->ExternalEvent(ResetCPU_Hard);
|
||||
break;
|
||||
case ID_SYSTEM_PAUSE:
|
||||
_Gui->SaveWindowLoc();
|
||||
WriteTrace(TraceDebug,"ID_SYSTEM_PAUSE");
|
||||
if (_Settings->LoadBool(GameRunning_CPU_Paused))
|
||||
{
|
||||
_System->ExternalEvent(ResumeCPU_FromMenu);
|
||||
_N64System->ExternalEvent(ResumeCPU_FromMenu);
|
||||
} else {
|
||||
_System->ExternalEvent(PauseCPU_FromMenu);
|
||||
_N64System->ExternalEvent(PauseCPU_FromMenu);
|
||||
}
|
||||
WriteTrace(TraceDebug,"ID_SYSTEM_PAUSE 1");
|
||||
break;
|
||||
|
@ -121,7 +120,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
{
|
||||
stdstr Dir(_Settings->LoadString(Directory_SnapShot));
|
||||
WriteTraceF(TraceGfxPlugin,"CaptureScreen(%s): Starting",Dir.c_str());
|
||||
_System->Plugins()->Gfx()->CaptureScreen(Dir.c_str());
|
||||
_Plugins->Gfx()->CaptureScreen(Dir.c_str());
|
||||
WriteTrace(TraceGfxPlugin,"CaptureScreen: Done");
|
||||
}
|
||||
break;
|
||||
|
@ -130,7 +129,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_Settings->SaveBool(GameRunning_LimitFPS,!_Settings->LoadBool(GameRunning_LimitFPS));
|
||||
WriteTrace(TraceDebug,"ID_SYSTEM_LIMITFPS 1");
|
||||
break;
|
||||
case ID_SYSTEM_SAVE: WriteTrace(TraceDebug,"ID_SYSTEM_SAVE"); _System->ExternalEvent(SaveMachineState); break;
|
||||
case ID_SYSTEM_SAVE: WriteTrace(TraceDebug,"ID_SYSTEM_SAVE"); _N64System->ExternalEvent(SaveMachineState); break;
|
||||
case ID_SYSTEM_SAVEAS:
|
||||
{
|
||||
char drive[_MAX_DRIVE] ,dir[_MAX_DIR], fname[_MAX_FNAME],ext[_MAX_EXT];
|
||||
|
@ -150,7 +149,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
openfilename.nMaxFile = MAX_PATH;
|
||||
openfilename.Flags = OFN_HIDEREADONLY;
|
||||
|
||||
_System->ExternalEvent(PauseCPU_SaveGame);
|
||||
_N64System->ExternalEvent(PauseCPU_SaveGame);
|
||||
|
||||
if (GetSaveFileName (&openfilename))
|
||||
{
|
||||
|
@ -170,13 +169,13 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_makepath( SaveDir, drive, dir, NULL, NULL );
|
||||
_Settings->SaveString(Directory_LastSave,SaveDir);
|
||||
|
||||
_System->ExternalEvent(SaveMachineState);
|
||||
_N64System->ExternalEvent(SaveMachineState);
|
||||
}
|
||||
|
||||
_System->ExternalEvent(ResumeCPU_SaveGame);
|
||||
_N64System->ExternalEvent(ResumeCPU_SaveGame);
|
||||
}
|
||||
break;
|
||||
case ID_SYSTEM_RESTORE: WriteTrace(TraceDebug,"ID_SYSTEM_RESTORE"); _System->ExternalEvent(LoadMachineState); break;
|
||||
case ID_SYSTEM_RESTORE: WriteTrace(TraceDebug,"ID_SYSTEM_RESTORE"); _N64System->ExternalEvent(LoadMachineState); break;
|
||||
case ID_SYSTEM_LOAD:
|
||||
{
|
||||
char Directory[255], SaveFile[255];
|
||||
|
@ -195,7 +194,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
openfilename.nMaxFile = MAX_PATH;
|
||||
openfilename.Flags = OFN_HIDEREADONLY;
|
||||
|
||||
_System->ExternalEvent(PauseCPU_LoadGame);
|
||||
_N64System->ExternalEvent(PauseCPU_LoadGame);
|
||||
|
||||
if (GetOpenFileName (&openfilename)) {
|
||||
_Settings->SaveString(GameRunning_InstantSaveFile,SaveFile);
|
||||
|
@ -205,18 +204,18 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_makepath( SaveDir, drive, dir, NULL, NULL );
|
||||
_Settings->SaveString(Directory_LastSave,SaveDir);
|
||||
|
||||
_System->ExternalEvent(LoadMachineState);
|
||||
_N64System->ExternalEvent(LoadMachineState);
|
||||
}
|
||||
_System->ExternalEvent(ResumeCPU_LoadGame);
|
||||
_N64System->ExternalEvent(ResumeCPU_LoadGame);
|
||||
}
|
||||
break;
|
||||
case ID_SYSTEM_CHEAT:
|
||||
{
|
||||
_System->SelectCheats(hWnd);
|
||||
_N64System->SelectCheats(hWnd);
|
||||
}
|
||||
break;
|
||||
case ID_SYSTEM_GSBUTTON:
|
||||
_System->ExternalEvent(GSButtonPressed);
|
||||
_N64System->ExternalEvent(GSButtonPressed);
|
||||
break;
|
||||
case ID_OPTIONS_DISPLAY_FR:
|
||||
_Settings->SaveBool(UserInterface_DisplayFrameRate,!_Settings->LoadBool(UserInterface_DisplayFrameRate));
|
||||
|
@ -235,13 +234,13 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
}
|
||||
break;
|
||||
case ID_OPTIONS_INCREASE_SPEED:
|
||||
_System->IncreaseSpeed();
|
||||
_N64System->IncreaseSpeed();
|
||||
break;
|
||||
case ID_OPTIONS_DECREASE_SPEED:
|
||||
_System->DecreaeSpeed();
|
||||
_N64System->DecreaeSpeed();
|
||||
break;
|
||||
case ID_OPTIONS_FULLSCREEN:
|
||||
_System->ExternalEvent(ChangingFullScreen);
|
||||
_N64System->ExternalEvent(ChangingFullScreen);
|
||||
break;
|
||||
case ID_OPTIONS_FULLSCREEN2:
|
||||
if (_Settings->LoadBool(UserInterface_InFullScreen))
|
||||
|
@ -250,7 +249,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_Gui->MakeWindowOnTop(false);
|
||||
Notify().SetGfxPlugin(NULL);
|
||||
WriteTrace(TraceGfxPlugin,"ChangeWindow: Starting");
|
||||
_System->Plugins()->Gfx()->ChangeWindow();
|
||||
_Plugins->Gfx()->ChangeWindow();
|
||||
WriteTrace(TraceGfxPlugin,"ChangeWindow: Done");
|
||||
ShowCursor(true);
|
||||
_Gui->ShowStatusBar(true);
|
||||
|
@ -264,7 +263,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
WriteTrace(TraceDebug,"ID_OPTIONS_FULLSCREEN b 2");
|
||||
try {
|
||||
WriteTrace(TraceGfxPlugin,"ChangeWindow: Starting");
|
||||
_System->Plugins()->Gfx()->ChangeWindow();
|
||||
_Plugins->Gfx()->ChangeWindow();
|
||||
WriteTrace(TraceGfxPlugin,"ChangeWindow: Done");
|
||||
}
|
||||
catch (...)
|
||||
|
@ -277,7 +276,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
WriteTrace(TraceDebug,"ID_OPTIONS_FULLSCREEN b 4");
|
||||
_Gui->MakeWindowOnTop(false);
|
||||
WriteTrace(TraceDebug,"ID_OPTIONS_FULLSCREEN b 5");
|
||||
Notify().SetGfxPlugin(_System->Plugins()->Gfx());
|
||||
Notify().SetGfxPlugin(_Plugins->Gfx());
|
||||
WriteTrace(TraceDebug,"ID_OPTIONS_FULLSCREEN b 3");
|
||||
_Settings->SaveBool(UserInterface_InFullScreen,true);
|
||||
WriteTrace(TraceDebug,"ID_OPTIONS_FULLSCREEN b 6");
|
||||
|
@ -293,20 +292,20 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_Gui->MakeWindowOnTop(_Settings->LoadBool(GameRunning_CPU_Running));
|
||||
}
|
||||
break;
|
||||
case ID_OPTIONS_CONFIG_RSP: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_RSP"); _System->Plugins()->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_RSP); break;
|
||||
case ID_OPTIONS_CONFIG_GFX: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_GFX"); _System->Plugins()->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_GFX); break;
|
||||
case ID_OPTIONS_CONFIG_AUDIO:WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_AUDIO"); _System->Plugins()->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_AUDIO); break;
|
||||
case ID_OPTIONS_CONFIG_CONT: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_CONT"); _System->Plugins()->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_CONTROLLER); break;
|
||||
case ID_OPTIONS_CONFIG_RSP: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_RSP"); _Plugins->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_RSP); break;
|
||||
case ID_OPTIONS_CONFIG_GFX: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_GFX"); _Plugins->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_GFX); break;
|
||||
case ID_OPTIONS_CONFIG_AUDIO:WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_AUDIO"); _Plugins->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_AUDIO); break;
|
||||
case ID_OPTIONS_CONFIG_CONT: WriteTrace(TraceDebug,"ID_OPTIONS_CONFIG_CONT"); _Plugins->ConfigPlugin((DWORD)hWnd,PLUGIN_TYPE_CONTROLLER); break;
|
||||
case ID_OPTIONS_CPU_USAGE:
|
||||
WriteTrace(TraceDebug,"ID_OPTIONS_CPU_USAGE");
|
||||
if (_Settings->LoadBool(UserInterface_ShowCPUPer))
|
||||
{
|
||||
_Settings->SaveBool(UserInterface_ShowCPUPer,false);
|
||||
_Gui->GetNotifyClass()->DisplayMessage(0,"");
|
||||
_Notify->DisplayMessage(0,"");
|
||||
} else {
|
||||
_Settings->SaveBool(UserInterface_ShowCPUPer,true);
|
||||
}
|
||||
_System->ExternalEvent(CPUUsageTimerChanged);
|
||||
_N64System->ExternalEvent(CPUUsageTimerChanged);
|
||||
break;
|
||||
case ID_OPTIONS_SETTINGS:
|
||||
{
|
||||
|
@ -316,10 +315,10 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
break;
|
||||
case ID_PROFILE_PROFILE:
|
||||
_Settings->SaveBool(Debugger_ProfileCode,!_Settings->LoadBool(Debugger_ProfileCode));
|
||||
_System->ExternalEvent(Profile_StartStop);
|
||||
_N64System->ExternalEvent(Profile_StartStop);
|
||||
break;
|
||||
case ID_PROFILE_RESETCOUNTER: _System->ExternalEvent(Profile_ResetLogs); break;
|
||||
case ID_PROFILE_GENERATELOG: _System->ExternalEvent(Profile_GenerateLogs); break;
|
||||
case ID_PROFILE_RESETCOUNTER: _N64System->ExternalEvent(Profile_ResetLogs); break;
|
||||
case ID_PROFILE_GENERATELOG: _N64System->ExternalEvent(Profile_GenerateLogs); break;
|
||||
case ID_DEBUG_SHOW_UNHANDLED_MEM:
|
||||
_Settings->SaveBool(Debugger_ShowUnhandledMemory,!_Settings->LoadBool(Debugger_ShowUnhandledMemory));
|
||||
break;
|
||||
|
@ -327,11 +326,11 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_Settings->SaveBool(Debugger_ShowPifErrors,!_Settings->LoadBool(Debugger_ShowPifErrors));
|
||||
break;
|
||||
case ID_DEBUG_SHOW_DLIST_COUNT:
|
||||
_Gui->GetNotifyClass()->DisplayMessage(0,"");
|
||||
_Notify->DisplayMessage(0,"");
|
||||
_Settings->SaveBool(Debugger_ShowDListAListCount,!_Settings->LoadBool(Debugger_ShowDListAListCount));
|
||||
break;
|
||||
case ID_DEBUG_SHOW_RECOMP_MEM_SIZE:
|
||||
_Gui->GetNotifyClass()->DisplayMessage(0,"");
|
||||
_Notify->DisplayMessage(0,"");
|
||||
_Settings->SaveBool(Debugger_ShowRecompMemSize,!_Settings->LoadBool(Debugger_ShowRecompMemSize));
|
||||
break;
|
||||
case ID_DEBUG_SHOW_CHECK_OPUSAGE:
|
||||
|
@ -441,17 +440,17 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
_Settings->SaveBool(Debugger_GenerateDebugLog,!_Settings->LoadBool(Debugger_GenerateDebugLog));
|
||||
break;
|
||||
case ID_DEBUGGER_DUMPMEMORY:
|
||||
_System->Debug_ShowMemoryDump();
|
||||
_N64System->Debug_ShowMemoryDump();
|
||||
break;
|
||||
case ID_DEBUGGER_SEARCHMEMORY: _System->Debug_ShowMemorySearch(); break;
|
||||
case ID_DEBUGGER_MEMORY: _System->Debug_ShowMemoryWindow(); break;
|
||||
case ID_DEBUGGER_TLBENTRIES: _System->Debug_ShowTLBWindow(); break;
|
||||
case ID_DEBUGGER_INTERRUPT_SP: _System->ExternalEvent(Interrupt_SP); break;
|
||||
case ID_DEBUGGER_INTERRUPT_SI: _System->ExternalEvent(Interrupt_SI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_AI: _System->ExternalEvent(Interrupt_AI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_VI: _System->ExternalEvent(Interrupt_VI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_PI: _System->ExternalEvent(Interrupt_PI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_DP: _System->ExternalEvent(Interrupt_DP); break;
|
||||
case ID_DEBUGGER_SEARCHMEMORY: _N64System->Debug_ShowMemorySearch(); break;
|
||||
case ID_DEBUGGER_MEMORY: _N64System->Debug_ShowMemoryWindow(); break;
|
||||
case ID_DEBUGGER_TLBENTRIES: _N64System->Debug_ShowTLBWindow(); break;
|
||||
case ID_DEBUGGER_INTERRUPT_SP: _N64System->ExternalEvent(Interrupt_SP); break;
|
||||
case ID_DEBUGGER_INTERRUPT_SI: _N64System->ExternalEvent(Interrupt_SI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_AI: _N64System->ExternalEvent(Interrupt_AI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_VI: _N64System->ExternalEvent(Interrupt_VI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_PI: _N64System->ExternalEvent(Interrupt_PI); break;
|
||||
case ID_DEBUGGER_INTERRUPT_DP: _N64System->ExternalEvent(Interrupt_DP); break;
|
||||
case ID_CURRENT_SAVE_DEFAULT:
|
||||
Notify().DisplayMessage(3,"Save Slot (%s) selected",GetSaveSlotString(MenuID - ID_CURRENT_SAVE_DEFAULT).c_str());
|
||||
_Settings->SaveDword(Game_CurrentSaveState,(DWORD)(MenuID - ID_CURRENT_SAVE_DEFAULT));
|
||||
|
@ -509,7 +508,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
if (_Settings->LoadStringIndex(File_RecentGameFileIndex,MenuID - ID_RECENT_ROM_START,FileName) &&
|
||||
FileName.length() > 0)
|
||||
{
|
||||
_System->RunFileImage(FileName.c_str());
|
||||
_N64System->RunFileImage(FileName.c_str());
|
||||
}
|
||||
}
|
||||
if (MenuID >= ID_RECENT_DIR_START && MenuID < ID_RECENT_DIR_END) {
|
||||
|
@ -517,7 +516,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men
|
|||
stdstr Dir = _Settings->LoadStringIndex(Directory_RecentGameDirIndex,Offset);
|
||||
if (Dir.length() > 0) {
|
||||
_Settings->SaveString(Directory_Game,Dir.c_str());
|
||||
_Gui->GetNotifyClass()->AddRecentDir(Dir.c_str());
|
||||
_Notify->AddRecentDir(Dir.c_str());
|
||||
_Gui->RefreshMenu();
|
||||
if (_Gui->RomBrowserVisible()) {
|
||||
_Gui->RefreshRomBrowser();
|
||||
|
@ -860,7 +859,7 @@ void CMainMenu::FillOutMenu ( MENU_HANDLE hMenu ) {
|
|||
MenuItemList OptionMenu;
|
||||
Item.Reset(ID_OPTIONS_FULLSCREEN, MENU_FULL_SCREEN,m_ShortCuts.ShortCutString(ID_OPTIONS_FULLSCREEN,AccessLevel) );
|
||||
Item.ItemEnabled = CPURunning;
|
||||
if (_System->Plugins()->Gfx() && _System->Plugins()->Gfx()->ChangeWindow == NULL) {
|
||||
if (_Plugins->Gfx() && _Plugins->Gfx()->ChangeWindow == NULL) {
|
||||
Item.ItemEnabled = false;
|
||||
}
|
||||
OptionMenu.push_back(Item);
|
||||
|
@ -873,24 +872,24 @@ void CMainMenu::FillOutMenu ( MENU_HANDLE hMenu ) {
|
|||
OptionMenu.push_back(MENU_ITEM(SPLITER ));
|
||||
|
||||
Item.Reset(ID_OPTIONS_CONFIG_GFX, MENU_CONFG_GFX,m_ShortCuts.ShortCutString(ID_OPTIONS_CONFIG_GFX,AccessLevel));
|
||||
if (_System->Plugins()->Gfx() == NULL || _System->Plugins()->Gfx()->Config == NULL) {
|
||||
if (_Plugins->Gfx() == NULL || _Plugins->Gfx()->Config == NULL) {
|
||||
Item.ItemEnabled = false;
|
||||
}
|
||||
OptionMenu.push_back(Item);
|
||||
Item.Reset(ID_OPTIONS_CONFIG_AUDIO, MENU_CONFG_AUDIO,m_ShortCuts.ShortCutString(ID_OPTIONS_CONFIG_AUDIO,AccessLevel));
|
||||
if (_System->Plugins()->Audio() == NULL || _System->Plugins()->Audio()->Config == NULL) {
|
||||
if (_Plugins->Audio() == NULL || _Plugins->Audio()->Config == NULL) {
|
||||
Item.ItemEnabled = false;
|
||||
}
|
||||
OptionMenu.push_back(Item);
|
||||
if (!inBasicMode) {
|
||||
Item.Reset(ID_OPTIONS_CONFIG_RSP, MENU_CONFG_RSP,m_ShortCuts.ShortCutString(ID_OPTIONS_CONFIG_RSP,AccessLevel));
|
||||
if (_System->Plugins()->RSP() == NULL || _System->Plugins()->RSP()->Config == NULL) {
|
||||
if (_Plugins->RSP() == NULL || _Plugins->RSP()->Config == NULL) {
|
||||
Item.ItemEnabled = false;
|
||||
}
|
||||
OptionMenu.push_back(Item);
|
||||
}
|
||||
Item.Reset(ID_OPTIONS_CONFIG_CONT, MENU_CONFG_CTRL,m_ShortCuts.ShortCutString(ID_OPTIONS_CONFIG_CONT,AccessLevel));
|
||||
if (_System->Plugins()->Control() == NULL || _System->Plugins()->Control()->Config == NULL) {
|
||||
if (_Plugins->Control() == NULL || _Plugins->Control()->Config == NULL) {
|
||||
Item.ItemEnabled = false;
|
||||
}
|
||||
OptionMenu.push_back(Item);
|
||||
|
@ -1036,17 +1035,17 @@ void CMainMenu::FillOutMenu ( MENU_HANDLE hMenu ) {
|
|||
|
||||
/* Debug - RSP
|
||||
*******************/
|
||||
if (_System->Plugins()->RSP() != NULL && IsMenu((HMENU)_System->Plugins()->RSP()->GetDebugMenu()))
|
||||
if (_Plugins->RSP() != NULL && IsMenu((HMENU)_Plugins->RSP()->GetDebugMenu()))
|
||||
{
|
||||
Item.Reset(ID_PLUGIN_MENU,EMPTY_STRING,NULL,_System->Plugins()->RSP()->GetDebugMenu(),"&RSP" );
|
||||
Item.Reset(ID_PLUGIN_MENU,EMPTY_STRING,NULL,_Plugins->RSP()->GetDebugMenu(),"&RSP" );
|
||||
DebugMenu.push_back(Item);
|
||||
}
|
||||
|
||||
/* Debug - RDP
|
||||
*******************/
|
||||
if (_System->Plugins()->Gfx() != NULL && IsMenu((HMENU)_System->Plugins()->Gfx()->GetDebugMenu()))
|
||||
if (_Plugins->Gfx() != NULL && IsMenu((HMENU)_Plugins->Gfx()->GetDebugMenu()))
|
||||
{
|
||||
Item.Reset(ID_PLUGIN_MENU,EMPTY_STRING,NULL,_System->Plugins()->Gfx()->GetDebugMenu(),"&RDP" );
|
||||
Item.Reset(ID_PLUGIN_MENU,EMPTY_STRING,NULL,_Plugins->Gfx()->GetDebugMenu(),"&RDP" );
|
||||
DebugMenu.push_back(Item);
|
||||
}
|
||||
|
||||
|
@ -1180,13 +1179,13 @@ void CMainMenu::ResetMenu(void) {
|
|||
_Gui->SetWindowMenu(this);
|
||||
|
||||
WriteTrace(TraceDebug,"CMainMenu::ResetMenu - Remove plugin menu");
|
||||
if (_System->Plugins()->Gfx() != NULL && IsMenu((HMENU)_System->Plugins()->Gfx()->GetDebugMenu()))
|
||||
if (_Plugins->Gfx() != NULL && IsMenu((HMENU)_Plugins->Gfx()->GetDebugMenu()))
|
||||
{
|
||||
RemoveMenu((HMENU)OldMenuHandle,(DWORD)_System->Plugins()->Gfx()->GetDebugMenu(), MF_BYCOMMAND);
|
||||
RemoveMenu((HMENU)OldMenuHandle,(DWORD)_Plugins->Gfx()->GetDebugMenu(), MF_BYCOMMAND);
|
||||
}
|
||||
if (_System->Plugins()->RSP() != NULL && IsMenu((HMENU)_System->Plugins()->RSP()->GetDebugMenu()))
|
||||
if (_Plugins->RSP() != NULL && IsMenu((HMENU)_Plugins->RSP()->GetDebugMenu()))
|
||||
{
|
||||
RemoveMenu((HMENU)OldMenuHandle,(DWORD)_System->Plugins()->RSP()->GetDebugMenu(), MF_BYCOMMAND);
|
||||
RemoveMenu((HMENU)OldMenuHandle,(DWORD)_Plugins->RSP()->GetDebugMenu(), MF_BYCOMMAND);
|
||||
}
|
||||
WriteTrace(TraceDebug,"CMainMenu::ResetMenu - Destroy Old Menu");
|
||||
|
||||
|
|
|
@ -54,7 +54,6 @@ class CMainMenu:public CBaseMenu
|
|||
typedef std::list<SettingID> SettingList;
|
||||
|
||||
CMainGui * _Gui;
|
||||
CN64System * _System;
|
||||
|
||||
//MSC_MAP m_ShortCuts;
|
||||
void * m_AccelTable;
|
||||
|
@ -70,13 +69,11 @@ class CMainMenu:public CBaseMenu
|
|||
|
||||
static void SettingsChanged (CMainMenu * _this );
|
||||
public:
|
||||
CMainMenu ( CMainGui * Window, CN64System * N64System );
|
||||
CMainMenu ( CMainGui * Window );
|
||||
~CMainMenu();
|
||||
|
||||
int ProcessAccelerator ( WND_HANDLE hWnd, void * lpMsg );
|
||||
bool ProcessMessage ( WND_HANDLE hWnd, DWORD wNotifyCode, DWORD wID);
|
||||
void ResetMenu ( void );
|
||||
void ResetAccelerators ( void ) { m_ResetAccelerators = true; }
|
||||
// void SaveShortCuts ( MSC_MAP * ShortCuts );
|
||||
// LanguageStringID GetShortCutMenuItemName (MSC_MAP * ShortCuts, WORD key, bool bCtrl, bool bAlt, bool bShift, CMenuShortCutKey::ACCESS_MODE Access);
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include <shlobj.h>
|
||||
#include <math.h>
|
||||
|
||||
CRomBrowser::CRomBrowser (WND_HANDLE & MainWindow, WND_HANDLE & StatusWindow, CNotification * Notify, CN64System * System) :
|
||||
CRomBrowser::CRomBrowser (WND_HANDLE & MainWindow, WND_HANDLE & StatusWindow ) :
|
||||
m_MainWindow(MainWindow),
|
||||
m_StatusWindow(StatusWindow),
|
||||
m_RefreshThread(NULL),
|
||||
|
@ -19,9 +19,7 @@ CRomBrowser::CRomBrowser (WND_HANDLE & MainWindow, WND_HANDLE & StatusWindow, CN
|
|||
m_ZipIniFile(NULL),
|
||||
m_WatchThreadID(0),
|
||||
m_ShowingRomBrowser(false),
|
||||
_Notify(Notify),
|
||||
m_AllowSelectionLastRom(true),
|
||||
m_Plugins(NULL)
|
||||
m_AllowSelectionLastRom(true)
|
||||
{
|
||||
if (_Settings) {
|
||||
m_RomIniFile = new CIniFile(_Settings->LoadString(SupportFile_RomDatabase).c_str());
|
||||
|
@ -29,7 +27,6 @@ CRomBrowser::CRomBrowser (WND_HANDLE & MainWindow, WND_HANDLE & StatusWindow, CN
|
|||
m_ExtIniFile = new CIniFile(_Settings->LoadString(SupportFile_ExtInfo).c_str());
|
||||
m_ZipIniFile = new CIniFile(_Settings->LoadString(SupportFile_7zipCache).c_str());
|
||||
}
|
||||
_System = System;
|
||||
|
||||
m_hRomList = 0;
|
||||
m_Visible = false;
|
||||
|
@ -549,7 +546,7 @@ void CRomBrowser::GetRomFileNames( strlist & FileList, CPath & BaseDirectory, st
|
|||
|
||||
void CRomBrowser::NotificationCB ( LPCSTR Status, CRomBrowser * _this )
|
||||
{
|
||||
_this->_Notify->DisplayMessage(5,"%s",Status);
|
||||
_Notify->DisplayMessage(5,"%s",Status);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1344,7 +1341,7 @@ void CRomBrowser::RomList_OpenRom(DWORD pnmh) {
|
|||
|
||||
if (!pRomInfo) { return; }
|
||||
m_StopRefresh = true;
|
||||
_System->RunFileImage(pRomInfo->szFullFileName);
|
||||
_N64System->RunFileImage(pRomInfo->szFullFileName);
|
||||
}
|
||||
|
||||
void CRomBrowser::RomList_PopupMenu(DWORD pnmh) {
|
||||
|
@ -1397,9 +1394,9 @@ void CRomBrowser::RomList_PopupMenu(DWORD pnmh) {
|
|||
if (inBasicMode) { DeleteMenu((HMENU)hPopupMenu,8,MF_BYPOSITION); }
|
||||
if (inBasicMode && !CheatsRemembered) { DeleteMenu((HMENU)hPopupMenu,7,MF_BYPOSITION); }
|
||||
DeleteMenu((HMENU)hPopupMenu,6,MF_BYPOSITION);
|
||||
if (!inBasicMode && m_Plugins && m_Plugins->Gfx() && m_Plugins->Gfx()->GetRomBrowserMenu != NULL)
|
||||
if (!inBasicMode && _Plugins && _Plugins->Gfx() && _Plugins->Gfx()->GetRomBrowserMenu != NULL)
|
||||
{
|
||||
HMENU GfxMenu = (HMENU)m_Plugins->Gfx()->GetRomBrowserMenu();
|
||||
HMENU GfxMenu = (HMENU)_Plugins->Gfx()->GetRomBrowserMenu();
|
||||
if (GfxMenu)
|
||||
{
|
||||
MENUITEMINFO lpmii;
|
||||
|
@ -1515,7 +1512,8 @@ int CALLBACK CRomBrowser::SelectRomDirCallBack(WND_HANDLE hwnd,DWORD uMsg,DWORD
|
|||
return 0;
|
||||
}
|
||||
|
||||
void CRomBrowser::SelectRomDir(CNotification * Notify) {
|
||||
void CRomBrowser::SelectRomDir(void)
|
||||
{
|
||||
char SelectedDir[MAX_PATH];
|
||||
LPITEMIDLIST pidl;
|
||||
BROWSEINFO bi;
|
||||
|
@ -1544,7 +1542,7 @@ void CRomBrowser::SelectRomDir(CNotification * Notify) {
|
|||
WriteTrace(TraceDebug,"CRomBrowser::SelectRomDir 6");
|
||||
_Settings->SaveString(Directory_Game,Directory);
|
||||
WriteTrace(TraceDebug,"CRomBrowser::SelectRomDir 7");
|
||||
Notify->AddRecentDir(Directory);
|
||||
_Notify->AddRecentDir(Directory);
|
||||
WriteTrace(TraceDebug,"CRomBrowser::SelectRomDir 8");
|
||||
RefreshRomBrowser();
|
||||
WriteTrace(TraceDebug,"CRomBrowser::SelectRomDir 9");
|
||||
|
@ -1841,8 +1839,3 @@ void CRomBrowser::Store7ZipInfo (CSettings * Settings, C7zip & ZipFile, int File
|
|||
stdstr CacheFileName = Settings->LoadString(SupportFile_RomListCache);
|
||||
DeleteFile(CacheFileName.c_str());
|
||||
}
|
||||
|
||||
void CRomBrowser::SetPluginList ( CPlugins * Plugins )
|
||||
{
|
||||
m_Plugins = Plugins;
|
||||
}
|
||||
|
|
|
@ -66,9 +66,8 @@ typedef struct {
|
|||
} SORT_FIELD;
|
||||
|
||||
class C7zip;
|
||||
class CRomBrowser {
|
||||
CNotification * _Notify;
|
||||
|
||||
class CRomBrowser
|
||||
{
|
||||
enum { IDC_ROMLIST = 223 };
|
||||
enum { RB_FileName = 0, RB_InternalName = 1, RB_GoodName = 2,
|
||||
RB_Status = 3, RB_RomSize = 4, RB_CoreNotes = 5,
|
||||
|
@ -119,7 +118,6 @@ class CRomBrowser {
|
|||
|
||||
typedef std::vector<ROM_INFO> ROMINFO_LIST;
|
||||
|
||||
CN64System * _System;
|
||||
WND_HANDLE & m_MainWindow;
|
||||
WND_HANDLE & m_StatusWindow;
|
||||
WND_HANDLE m_hRomList;
|
||||
|
@ -135,7 +133,6 @@ class CRomBrowser {
|
|||
CIniFile * m_NotesIniFile;
|
||||
CIniFile * m_ExtIniFile;
|
||||
CIniFile * m_ZipIniFile;
|
||||
CPlugins * m_Plugins;
|
||||
bool m_AllowSelectionLastRom;
|
||||
|
||||
void AddFileNameToList ( strlist & FileList, stdstr & Directory, CPath & File );
|
||||
|
@ -184,7 +181,7 @@ class CRomBrowser {
|
|||
static int CALLBACK RomList_CompareItems ( DWORD lParam1, DWORD lParam2, DWORD lParamSort );
|
||||
|
||||
public:
|
||||
CRomBrowser ( WND_HANDLE & hMainWindow, WND_HANDLE & StatusWindow, CNotification * Notify, CN64System * System );
|
||||
CRomBrowser ( WND_HANDLE & hMainWindow, WND_HANDLE & StatusWindow );
|
||||
~CRomBrowser ( void );
|
||||
void HighLightLastRom ( void );
|
||||
void HideRomList ( void );
|
||||
|
@ -197,11 +194,10 @@ public:
|
|||
bool RomListDrawItem ( int idCtrl, DWORD lParam );
|
||||
bool RomListNotify ( int idCtrl, DWORD pnmh );
|
||||
void SaveRomListColoumnInfo ( void );
|
||||
void SelectRomDir ( CNotification * Notify );
|
||||
void SelectRomDir ( void );
|
||||
void ShowRomList ( void );
|
||||
bool ShowingRomBrowser ( void ) { return m_ShowingRomBrowser; }
|
||||
LPCSTR CurrentedSelectedRom ( void ) { return m_SelectedRom.c_str(); }
|
||||
void SetPluginList ( CPlugins * Plugins);
|
||||
static void Store7ZipInfo ( CSettings * Settings, C7zip & ZipFile, int FileNo );
|
||||
|
||||
static void GetFieldInfo ( ROMBROWSER_FIELDS_LIST & Fields, bool UseDefault = false );
|
||||
|
|
Binary file not shown.
|
@ -66,7 +66,7 @@ IDI_LEFT ICON DISCARDABLE "Icons\\left.ico"
|
|||
IDD_Settings_PlugSel DIALOGEX 0, 0, 231, 206
|
||||
STYLE DS_CENTER | WS_CHILD | WS_VISIBLE
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
COMBOBOX GFX_LIST,7,18,155,79,CBS_DROPDOWNLIST | CBS_SORT |
|
||||
WS_VSCROLL | WS_TABSTOP
|
||||
|
@ -134,7 +134,7 @@ END
|
|||
IDD_Settings_RomBrowser DIALOGEX 0, 0, 231, 206
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
CONTROL "Use Rom Browser",IDC_USE_ROMBROWSER,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,6,7,206,10
|
||||
|
@ -158,7 +158,7 @@ END
|
|||
IDD_Settings_General DIALOGEX 0, 0, 231, 210
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
CONTROL "Pause emulation when window is not active?",
|
||||
IDC_AUTOSLEEP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,9,
|
||||
|
@ -226,7 +226,7 @@ END
|
|||
IDD_Settings_GameGeneral DIALOGEX 0, 0, 218, 158
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "Good Name:",IDC_GOOD_NAME_TEXT,6,8,91,10
|
||||
EDITTEXT IDC_GOOD_NAME,102,7,109,12,ES_AUTOHSCROLL | ES_READONLY
|
||||
|
@ -262,7 +262,7 @@ END
|
|||
IDD_Settings_Accelerator DIALOGEX 0, 0, 218, 183
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "CPU State:",IDC_S_CPU_STATE,8,9,42,11
|
||||
COMBOBOX IDC_C_CPU_STATE,58,7,156,66,CBS_DROPDOWNLIST |
|
||||
|
@ -388,7 +388,7 @@ END
|
|||
IDD_Settings_Advanced DIALOGEX 0, 0, 231, 206
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
CONTROL "Start Emulation when rom is opened?",
|
||||
IDC_START_ON_ROM_OPEN,"Button",BS_AUTOCHECKBOX |
|
||||
|
@ -408,7 +408,7 @@ END
|
|||
IDD_Settings_ShellInt DIALOGEX 0, 0, 231, 206
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
GROUPBOX "",IDC_STATIC,5,13,218,168
|
||||
LTEXT "File extension association:",IDC_SHELL_INT_TEXT,73,37,
|
||||
|
@ -717,7 +717,7 @@ END
|
|||
IDD_Settings_GameRecompiler DIALOGEX 0, 0, 230, 156
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "CPU core style:",IDC_CPU_TYPE_TEXT,4,11,106,10
|
||||
COMBOBOX IDC_CPU_TYPE,113,8,99,49,CBS_DROPDOWNLIST | WS_VSCROLL |
|
||||
|
@ -747,7 +747,7 @@ END
|
|||
IDD_Settings_GamePlugin DIALOGEX 0, 0, 231, 206
|
||||
STYLE DS_CENTER | WS_CHILD | WS_VISIBLE
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
COMBOBOX GFX_LIST,7,18,155,79,CBS_DROPDOWNLIST | CBS_SORT |
|
||||
WS_VSCROLL | WS_TABSTOP
|
||||
|
@ -774,7 +774,7 @@ END
|
|||
IDD_Settings_GameStatus DIALOGEX 0, 0, 218, 158
|
||||
STYLE WS_CHILD
|
||||
EXSTYLE WS_EX_CONTROLPARENT
|
||||
FONT 8, "MS Shell Dlg"
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x1
|
||||
BEGIN
|
||||
LTEXT "Status:",IDC_STATUS_TEXT,6,12,74,10
|
||||
COMBOBOX IDC_STATUS_TYPE,80,10,131,49,CBS_DROPDOWNLIST |
|
||||
|
@ -1085,8 +1085,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,7,0,50
|
||||
PRODUCTVERSION 1,7,0,50
|
||||
FILEVERSION 1,7,0,51
|
||||
PRODUCTVERSION 1,7,0,51
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -1099,25 +1099,25 @@ VS_VERSION_INFO VERSIONINFO
|
|||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "0c0904b0"
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "\0"
|
||||
VALUE "CompanyName", " \0"
|
||||
VALUE "FileDescription", "Project64\0"
|
||||
VALUE "FileVersion", "1,7,0,50\0"
|
||||
VALUE "FileVersion", "1, 7, 0, 51\0"
|
||||
VALUE "InternalName", "Project64\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2004\0"
|
||||
VALUE "LegalTrademarks", "\0"
|
||||
VALUE "OriginalFilename", "Project64.exe\0"
|
||||
VALUE "PrivateBuild", "\0"
|
||||
VALUE "ProductName", " Project64\0"
|
||||
VALUE "ProductVersion", "1,7,0,50\0"
|
||||
VALUE "ProductVersion", "1, 7, 0, 51\0"
|
||||
VALUE "SpecialBuild", "\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0xc09, 1200
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
@ -1138,7 +1138,7 @@ IDR_HTML_ABOUT HTML DISCARDABLE "about.htm"
|
|||
|
||||
IDC_DIVIDER CURSOR DISCARDABLE "Icons\\divider.cur"
|
||||
IDC_HYPERLINK CURSOR DISCARDABLE "Icons\\hand.cur"
|
||||
#endif // English (Australia) resources
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
|
|
@ -434,6 +434,11 @@ public:
|
|||
Invalidate();
|
||||
}
|
||||
|
||||
BOOL GetHasEditItem ()
|
||||
{
|
||||
return m_bEditItem;
|
||||
}
|
||||
|
||||
int GetColumnCount()
|
||||
{
|
||||
return m_aColumns.GetSize();
|
||||
|
|
|
@ -1,12 +1,4 @@
|
|||
#include "Multilanguage.h"
|
||||
#include "User Interface.h"
|
||||
#include "N64 System.h"
|
||||
#include "Plugin.h"
|
||||
#include "Support.h"
|
||||
#include <windows.h>
|
||||
#include "Validate Binary.h"
|
||||
#include <Aclapi.h>
|
||||
|
||||
#include "stdafx.h"
|
||||
//#pragma comment(linker,"/merge:.rdata=.text")
|
||||
|
||||
void FixUPXIssue ( BYTE * ProgramLocation )
|
||||
|
@ -268,11 +260,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs,
|
|||
WriteTrace(TraceDebug,"WinMain - Application Starting");
|
||||
FixUPXIssue((BYTE *)hInstance);
|
||||
|
||||
_Notify = &Notify();
|
||||
|
||||
//Create the plugin container
|
||||
WriteTrace(TraceDebug,"WinMain - Create Plugins");
|
||||
CPlugins Plugins ( _Settings->LoadString(Directory_Plugin) );
|
||||
WriteTrace(TraceDebug,"WinMain - Create N64 system");
|
||||
CN64System N64System ( &Notify(), &Plugins ); //Create the backend n64 system
|
||||
_Plugins = new CPlugins(_Settings->LoadString(Directory_Plugin));
|
||||
|
||||
//Select the language
|
||||
_Lang->LoadCurrentStrings(true);
|
||||
|
@ -284,11 +276,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs,
|
|||
{
|
||||
WinTitle.Format("Project64 %s (%s)",VersionInfo(VERSION_PRODUCT_VERSION).c_str(),_Settings->LoadString(Beta_UserName).c_str());
|
||||
}
|
||||
CMainGui MainWindow(WinTitle.c_str(),&Notify(),&N64System), HiddenWindow;
|
||||
CMainMenu MainMenu(&MainWindow, &N64System);
|
||||
Plugins.SetRenderWindows(&MainWindow,&HiddenWindow);
|
||||
Notify().SetMainWindow(&MainWindow);
|
||||
|
||||
CMainGui MainWindow(true,WinTitle.c_str()), HiddenWindow(false);
|
||||
CMainMenu MainMenu(&MainWindow);
|
||||
_Plugins->SetRenderWindows(&MainWindow,&HiddenWindow);
|
||||
_Notify->SetMainWindow(&MainWindow);
|
||||
|
||||
{
|
||||
stdstr_f User("%s",_Settings->LoadString(Beta_UserName).c_str());
|
||||
|
@ -304,13 +295,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs,
|
|||
if (__argc > 1) {
|
||||
WriteTraceF(TraceDebug,"WinMain - Cmd line found \"%s\"",__argv[1]);
|
||||
MainWindow.Show(true); //Show the main window
|
||||
N64System.RunFileImage(__argv[1]);
|
||||
CN64System::RunFileImage(__argv[1]);
|
||||
} else {
|
||||
if (_Settings->LoadDword(RomBrowser_Enabled))
|
||||
{
|
||||
WriteTrace(TraceDebug,"WinMain - Show Rom Browser");
|
||||
//Display the rom browser
|
||||
MainWindow.SetPluginList(&Plugins);
|
||||
MainWindow.ShowRomList();
|
||||
MainWindow.Show(true); //Show the main window
|
||||
MainWindow.HighLightLastRom();
|
||||
|
@ -325,8 +315,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs,
|
|||
MainWindow.ProcessAllMessages();
|
||||
WriteTrace(TraceDebug,"WinMain - Message Loop Finished");
|
||||
|
||||
N64System.CloseCpu(); //terminate the cpu thread before quiting
|
||||
|
||||
if (_N64System)
|
||||
{
|
||||
delete _N64System;
|
||||
_N64System = NULL;
|
||||
}
|
||||
WriteTrace(TraceDebug,"WinMain - System Closed");
|
||||
}
|
||||
catch(...)
|
||||
|
@ -335,16 +328,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs,
|
|||
MessageBox(NULL,stdstr_f("Exception caught\nFile: %s\nLine: %d",__FILE__,__LINE__).c_str(),"Exception",MB_OK);
|
||||
}
|
||||
WriteTrace(TraceDebug,"WinMain - cleaning up global objects");
|
||||
if (_Settings)
|
||||
{
|
||||
delete _Settings;
|
||||
_Settings = NULL;
|
||||
}
|
||||
if (_Lang)
|
||||
{
|
||||
delete _Lang;
|
||||
_Lang = NULL;
|
||||
}
|
||||
|
||||
if (_Rom) { delete _Rom; _Rom = NULL; }
|
||||
if (_Plugins) { delete _Plugins; _Plugins = NULL; }
|
||||
if (_Settings) { delete _Settings; _Settings = NULL; }
|
||||
if (_Lang) { delete _Lang; _Lang = NULL; }
|
||||
|
||||
CoUninitialize();
|
||||
WriteTrace(TraceDebug,"WinMain - Done");
|
||||
CloseTrace();
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
#include "Multilanguage.h"
|
||||
#include "User Interface.h"
|
||||
#include "N64 System.h"
|
||||
#include "Plugin.h"
|
||||
#include "Support.h"
|
||||
#include <windows.h>
|
||||
#include "Validate Binary.h"
|
||||
#include <Aclapi.h>
|
Loading…
Reference in New Issue