git-svn-id: https://localhost/svn/Project64/trunk@27 111125ac-702d-7242-af9c-5ba8ae61c1ef

This commit is contained in:
zilmar 2010-05-22 04:47:15 +00:00
parent f148d1b94c
commit f9db52309f
95 changed files with 9926 additions and 7373 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);
}
}

View File

@ -37,5 +37,6 @@ class CNotification;
//Main Files
#include "N64 System/N64 Class.h"
#include "N64 System/System Globals.h"
#endif

View File

@ -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;
}

View File

@ -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 };

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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
}
}

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 );

View File

@ -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];
}
}

View File

@ -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

View File

@ -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;

View File

@ -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"

View File

@ -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;
}

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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)
{

View File

@ -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 );

View File

@ -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)

View File

@ -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);

View File

@ -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);
};

View File

@ -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");*/
}

View File

@ -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);
};

View File

@ -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;
//}

View File

@ -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 );

View File

@ -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++)

View File

@ -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);

View File

@ -45,3 +45,4 @@
#include "Debugger - Memory Dump.h"
#include "Debugger - TLB.h"

View File

@ -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)
{

View File

@ -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:

View File

@ -0,0 +1 @@
#include "../stdafx.h"

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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 );

View File

@ -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;

View File

@ -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

View File

@ -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);
}
}

View File

@ -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 );

View File

@ -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__);
}

View File

@ -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 );

View File

@ -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; }
*/
};

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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 );

View File

@ -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);

View File

@ -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 );

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -0,0 +1 @@
#include "../stdafx.h"

View File

@ -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) {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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;

View File

@ -134,7 +134,6 @@ bool CPluginList::ValidPluginVersion ( PLUGIN_INFO & PluginInfo ) {
}
#ifdef tofix
CPluginList::CPluginList (CSettings * Settings) {
_Settings = Settings;

View File

@ -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;

View File

@ -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

View 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

View File

@ -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);
}

View File

@ -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; }

View File

@ -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");

View File

@ -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);
};

View File

@ -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;
}

View File

@ -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 );

View File

@ -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
/////////////////////////////////////////////////////////////////////////////

View File

@ -434,6 +434,11 @@ public:
Invalidate();
}
BOOL GetHasEditItem ()
{
return m_bEditItem;
}
int GetColumnCount()
{
return m_aColumns.GetSize();

View File

@ -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();

View File

@ -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>