From a5bfa92557b10c05da7d070c8dc92ba95fe5fd23 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sat, 12 Jun 2010 02:02:06 +0000 Subject: [PATCH] git-svn-id: https://localhost/svn/Project64/trunk@34 111125ac-702d-7242-af9c-5ba8ae61c1ef --- Source/7zip/7zip.plg | 45 +- .../N64 System/C Core/C Core Interface.cpp | 37 +- .../N64 System/C Core/C Core Interface.h | 1 - Source/Project64/N64 System/C Core/Dma.cpp | 4 +- .../Debugger/Debugger - Memory Dump.cpp | 10 +- .../Interpreter/Interpreter CPU.cpp | 8 +- .../Project64/N64 System/Mips/Memory Class.h | 8 - .../N64 System/Mips/Memory Virtual Mem.cpp | 3841 ++++++++++++- .../N64 System/Mips/Memory Virtual Mem.h | 97 +- Source/Project64/N64 System/Mips/Memory.cpp | 5119 +---------------- .../N64 System/Mips/Register Class.cpp | 4 +- .../N64 System/Mips/System Events.cpp | 6 + .../Project64/N64 System/Mips/System Events.h | 1 + .../N64 System/Mips/System Timing.cpp | 7 +- Source/Project64/N64 System/N64 Class.cpp | 124 +- Source/Project64/N64 System/N64 Class.h | 6 +- .../N64 System/Recompiler/Code Section.cpp | 1 - .../Recompiler/Delay Slot Map Class.cpp | 75 - .../Recompiler/Function Map Class.cpp | 49 +- .../Recompiler/Function Map Class.h | 7 + .../Recompiler/Recompiler Class.cpp | 99 +- .../N64 System/Recompiler/Recompiler Class.h | 5 - .../Recompiler/Recompiler Memory.cpp | 6 + .../N64 System/Recompiler/Recompiler Memory.h | 1 + .../N64 System/Recompiler/Recompiler Ops.cpp | 117 +- .../Project64/N64 System/System Globals.cpp | 3 +- Source/Project64/N64 System/System Globals.h | 3 +- Source/Project64/Plugins/Plugin Class.cpp | 10 +- Source/Project64/Project64.dsp | 8 + Source/Project64/Settings/Settings Class.cpp | 720 --- Source/Project64/User Interface/Gui Class.cpp | 56 +- .../User Interface/Main Menu Class.cpp | 79 +- .../User Interface/Main Menu Class.h | 1 + .../User Interface/Rom Browser Class.cpp | 2 +- Source/Project64/main.cpp | 8 +- Source/Project64/stdafx.h | 2 + 36 files changed, 4136 insertions(+), 6434 deletions(-) diff --git a/Source/7zip/7zip.plg b/Source/7zip/7zip.plg index af73e5dde..55cfa1108 100644 --- a/Source/7zip/7zip.plg +++ b/Source/7zip/7zip.plg @@ -3,52 +3,9 @@
 

Build Log

---------------------Configuration: 7zip - Win32 Release-------------------- +--------------------Configuration: 7zip - Win32 External Release--------------------

Command Lines

-Creating temporary file "C:\DOCUME~1\NICHOL~1\LOCALS~1\Temp\RSPC52.tmp" with contents -[ -/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"../../Build/7zip/Release/7zip.pch" /YX /Fo"../../Build/7zip/Release/" /Fd"../../Build/7zip/Release/" /FD /c -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zAlloc.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zBuffer.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zCrc.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zDecode.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zExtract.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zHeader.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zIn.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zItem.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\7zMethodID.c" -"D:\My Programs\Emulation\Projedt64\SOURCE\7zip\Compress\LzmaDecode.c" -] -Creating command line "cl.exe @C:\DOCUME~1\NICHOL~1\LOCALS~1\Temp\RSPC52.tmp" -Creating temporary file "C:\DOCUME~1\NICHOL~1\LOCALS~1\Temp\RSPC53.tmp" with contents -[ -/nologo /out:"../../Build/7zip/Release\7zip.lib" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zAlloc.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zBuffer.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zCrc.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zDecode.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zExtract.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zHeader.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zIn.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zItem.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\7zMethodID.obj" -"\My Programs\Emulation\Projedt64\Build\7zip\Release\LzmaDecode.obj" -] -Creating command line "link.exe -lib @C:\DOCUME~1\NICHOL~1\LOCALS~1\Temp\RSPC53.tmp" -

Output Window

-Compiling... -7zAlloc.c -7zBuffer.c -7zCrc.c -7zDecode.c -7zExtract.c -7zHeader.c -7zIn.c -7zItem.c -7zMethodID.c -LzmaDecode.c -Creating library... diff --git a/Source/Project64/N64 System/C Core/C Core Interface.cpp b/Source/Project64/N64 System/C Core/C Core Interface.cpp index c5a85d33c..22422570a 100644 --- a/Source/Project64/N64 System/C Core/C Core Interface.cpp +++ b/Source/Project64/N64 System/C Core/C Core Interface.cpp @@ -67,14 +67,14 @@ void CC_Core::SetSettings ( ) void CC_Core::PauseExecution ( void ) { - _N64System->Pause(); + _BaseSystem->Pause(); } void CC_Core::RunRsp ( void ) { try { - _N64System->RunRSP(); + _System->RunRSP(); } catch (...) { @@ -86,22 +86,22 @@ void CC_Core::RunRsp ( void ) void CC_Core::GenerateProfileLog ( void ) { - _N64System->m_Profile.GenerateLog(); + _BaseSystem->m_Profile.GenerateLog(); } void CC_Core::ResetTimer ( void ) { - _N64System->m_Profile.ResetCounters(); + _System->m_Profile.ResetCounters(); } DWORD CC_Core::StartTimer ( DWORD Address ) { - return _N64System->m_Profile.StartTimer(Address); + return _System->m_Profile.StartTimer(Address); } DWORD CC_Core::StopTimer ( void ) { - return _N64System->m_Profile.StopTimer(); + return _System->m_Profile.StopTimer(); } void PauseExecution ( void ) @@ -167,19 +167,6 @@ void DacrateChanged ( enum SystemType Type ) _Plugins->Audio()->DacrateChanged(Type); } -BOOL Close_C_CPU ( void ) -{ - if (_Settings == NULL || !_Settings->LoadBool(GameRunning_CPU_Running)) - { - return true; - } - _N64System->m_EndEmulation = true; - _Notify->BreakPoint(__FILE__,__LINE__); -// g_Main_CPU_Action->DoSomething = true; -// g_Main_CPU_Action->CloseCPU = true; - return false; -} - void RunRsp( void ) { CC_Core::RunRsp(); @@ -187,12 +174,12 @@ void RunRsp( void ) void SyncSystem (void) { - _N64System->SyncCPU(_SyncSystem); + _BaseSystem->SyncCPU(_SyncSystem); } void ApplyGSButtonCheats ( void ) { - CC_Core::ApplyGSButtonCheats(_N64System); + CC_Core::ApplyGSButtonCheats(_BaseSystem); } void ChangePluginFunc ( void ) @@ -224,7 +211,7 @@ void ChangePluginFunc ( void ) if (!_Plugins->Initiate()) { _Notify->DisplayMessage(5,MSG_PLUGIN_NOT_INIT); - _N64System->m_EndEmulation = true; + _BaseSystem->m_EndEmulation = true; } else { //CC_Core::SetCurrentSystem(_N64System); } @@ -238,7 +225,7 @@ void ChangeFullScreenFunc ( void ) BOOL Machine_LoadState ( void ) { - bool Result = CC_Core::LoadState(_N64System); + bool Result = CC_Core::LoadState(_System); //CC_Core::SetCurrentSystem(_N64System); return Result; } @@ -265,7 +252,7 @@ DWORD StopTimer ( void ) BOOL Machine_SaveState ( void ) { - return CC_Core::SaveState(_N64System); + return CC_Core::SaveState(_BaseSystem); } void BreakPoint(LPCSTR FileName, int LineNumber ) @@ -305,7 +292,7 @@ void CC_Core::ApplyCheats (CN64System * System) void ApplyCheats (void) { - CC_Core::ApplyCheats(_N64System); + CC_Core::ApplyCheats(_BaseSystem); } void ResetX86Logs ( void ) diff --git a/Source/Project64/N64 System/C Core/C Core Interface.h b/Source/Project64/N64 System/C Core/C Core Interface.h index d5ad9b3d5..86dc84f92 100644 --- a/Source/Project64/N64 System/C Core/C Core Interface.h +++ b/Source/Project64/N64 System/C Core/C Core Interface.h @@ -45,7 +45,6 @@ void DacrateChanged ( enum SystemType Type ); void ChangePluginFunc ( void ); void ApplyGSButtonCheats ( void ); void ChangeFullScreenFunc ( void ); -BOOL Close_C_CPU ( void ); void StartInterpreterCPU ( void ); void SyncSystem ( void ); BOOL Machine_LoadState ( void ); diff --git a/Source/Project64/N64 System/C Core/Dma.cpp b/Source/Project64/N64 System/C Core/Dma.cpp index 042c72060..37fb508c4 100644 --- a/Source/Project64/N64 System/C Core/Dma.cpp +++ b/Source/Project64/N64 System/C Core/Dma.cpp @@ -136,9 +136,9 @@ void PI_DMA_WRITE (void) { } _Reg->PI_CART_ADDR_REG += 0x10000000; - if (!_N64System->DmaUsed()) + if (!_System->DmaUsed()) { - _N64System->SetDmaUsed(true); + _System->SetDmaUsed(true); OnFirstDMA(); } if (_Recompiler && _Recompiler->bSMM_PIDMA()) diff --git a/Source/Project64/N64 System/Debugger/Debugger - Memory Dump.cpp b/Source/Project64/N64 System/Debugger/Debugger - Memory Dump.cpp index dc52ef760..7f670a42d 100644 --- a/Source/Project64/N64 System/Debugger/Debugger - Memory Dump.cpp +++ b/Source/Project64/N64 System/Debugger/Debugger - Memory Dump.cpp @@ -54,7 +54,7 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b openfilename.lpstrInitialDir = Directory; openfilename.nMaxFile = MAX_PATH; openfilename.Flags = OFN_HIDEREADONLY; - _N64System->ExternalEvent(SysEvent_PauseCPU_DumpMemory); + _BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory); if (GetOpenFileName (&openfilename)) { char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; @@ -65,7 +65,7 @@ LRESULT CDumpMemory::OnClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& b } SetDlgItemText(IDC_FILENAME,FileName); } - _N64System->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); } break; case IDOK: @@ -97,14 +97,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); - _N64System->ExternalEvent(SysEvent_PauseCPU_DumpMemory); + _BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory); if (!DumpMemory(FileName,Format,StartPC,EndPC,DumpPC)) { //enable buttons - _N64System->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); return false; } - _N64System->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory); } EndDialog(0); break; diff --git a/Source/Project64/N64 System/Interpreter/Interpreter CPU.cpp b/Source/Project64/N64 System/Interpreter/Interpreter CPU.cpp index 70e0f84cc..7295c65c6 100644 --- a/Source/Project64/N64 System/Interpreter/Interpreter CPU.cpp +++ b/Source/Project64/N64 System/Interpreter/Interpreter CPU.cpp @@ -178,7 +178,7 @@ void InPermLoop (void) { if (( _Reg->STATUS_REGISTER & 0xFF00) == 0) { goto InterruptsDisabled; } /* check sound playing */ - _N64System->SyncToAudio(); + _System->SyncToAudio(); /* check RSP running */ /* check RDP running */ @@ -196,7 +196,7 @@ InterruptsDisabled: //CurrentPercent = 0; //DisplayFPS(); DisplayError(GS(MSG_PERM_LOOP)); - _N64System->CloseCpu(); + _System->CloseCpu(); } @@ -223,7 +223,7 @@ void CInterpreterCPU::BuildCPU (void ) void CInterpreterCPU::ExecuteCPU (void ) { - bool & Done = _N64System->m_EndEmulation; + bool & Done = _System->m_EndEmulation; DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER; OPCODE & Opcode = R4300iOp::m_Opcode; DWORD & JumpToLocation = R4300iOp::m_JumpToLocation; @@ -290,7 +290,7 @@ void CInterpreterCPU::ExecuteCPU (void ) void CInterpreterCPU::ExecuteOps ( int Cycles ) { - bool & Done = _N64System->m_EndEmulation; + bool & Done = _System->m_EndEmulation; DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER; OPCODE & Opcode = R4300iOp::m_Opcode; DWORD & JumpToLocation = R4300iOp::m_JumpToLocation; diff --git a/Source/Project64/N64 System/Mips/Memory Class.h b/Source/Project64/N64 System/Mips/Memory Class.h index a327f854c..ff4a7f5d9 100644 --- a/Source/Project64/N64 System/Mips/Memory Class.h +++ b/Source/Project64/N64 System/Mips/Memory Class.h @@ -1,11 +1,3 @@ -#ifdef toremove -#include - -enum MemorySize { _8Bit, _16Bit, _32Bit, _64Bit }; - -class CC_Core; -#endif - class CMipsMemory_CallBack { public: diff --git a/Source/Project64/N64 System/Mips/Memory Virtual Mem.cpp b/Source/Project64/N64 System/Mips/Memory Virtual Mem.cpp index 1577c4e3b..67f9689bf 100644 --- a/Source/Project64/N64 System/Mips/Memory Virtual Mem.cpp +++ b/Source/Project64/N64 System/Mips/Memory Virtual Mem.cpp @@ -1 +1,3840 @@ -#include "stdafx.h" \ No newline at end of file +#include "stdafx.h" + +DWORD RegModValue; + +CMipsMemoryVM::CMipsMemoryVM ( CMipsMemory_CallBack * CallBack ) : + m_CBClass(CallBack), + m_TLB_ReadMap(NULL), + m_TLB_WriteMap(NULL), + m_RomMapped(false), + m_Rom(NULL), + m_RomSize(0), + m_RomWrittenTo(false), + m_RomWroteValue(0) +{ + m_RDRAM = NULL; + m_DMEM = NULL; + m_IMEM = NULL; + m_HalfLine = 0; +} + +CMipsMemoryVM::~CMipsMemoryVM (void) +{ + FreeMemory(); +} + +BOOL CMipsMemoryVM::Initialize ( void ) +{ + if (m_RDRAM != NULL) + { + return true; + } + + DWORD RdramMemorySize = 0x20000000; + if ((CPU_TYPE)_Settings->LoadDword(Game_CpuType) == CPU_SyncCores) + { + RdramMemorySize = 0x18000000; + } + + m_RDRAM = (unsigned char *) VirtualAlloc( NULL, RdramMemorySize, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ); + if( m_RDRAM == NULL ) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Reserve RDRAM (Size: 0x%X)",RdramMemorySize); + FreeMemory(); + return false; + } + + m_AllocatedRdramSize = _Settings->LoadDword(Game_RDRamSize); + if(VirtualAlloc(m_RDRAM, m_AllocatedRdramSize, MEM_COMMIT, PAGE_READWRITE)==NULL) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate RDRAM (Size: 0x%X)",m_AllocatedRdramSize); + FreeMemory(); + return false; + } + + if(VirtualAlloc(m_RDRAM + 0x04000000, 0x2000, MEM_COMMIT, PAGE_READWRITE)==NULL) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate DMEM/IMEM (Size: 0x%X)",0x2000); + FreeMemory(); + return false; + } + + m_DMEM = (unsigned char *)(m_RDRAM+0x04000000); + m_IMEM = (unsigned char *)(m_RDRAM+0x04001000); + + if (_Settings->LoadBool(Game_LoadRomToMemory)) + { + m_RomMapped = true; + m_Rom = m_RDRAM + 0x10000000; + m_RomSize = _Rom->GetRomSize(); + if(VirtualAlloc(m_Rom, _Rom->GetRomSize(), MEM_COMMIT, PAGE_READWRITE)==NULL) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate Rom (Size: 0x%X)",_Rom->GetRomSize()); + FreeMemory(); + return false; + } + memcpy(m_Rom,_Rom->GetRomAddress(),_Rom->GetRomSize()); + + DWORD OldProtect; + VirtualProtect(m_Rom,_Rom->GetRomSize(),PAGE_READONLY, &OldProtect); + } else { + m_RomMapped = false; + m_Rom = _Rom->GetRomAddress(); + m_RomSize = _Rom->GetRomSize(); + } + memset(m_PIF_Ram,0,sizeof(m_PIF_Ram)); + + m_TLB_ReadMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); + if (m_TLB_ReadMap == NULL) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate m_TLB_ReadMap (Size: 0x%X)",0xFFFFF * sizeof(DWORD)); + FreeMemory(); + return false; + } + + m_TLB_WriteMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); + if (m_TLB_WriteMap == NULL) + { + WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate m_TLB_ReadMap (Size: 0x%X)",0xFFFFF * sizeof(DWORD)); + FreeMemory(); + return false; + } + + memset(m_TLB_ReadMap,0,(0xFFFFF * sizeof(DWORD))); + memset(m_TLB_WriteMap,0,(0xFFFFF * sizeof(DWORD))); + for (DWORD count = 0x80000000; count < 0xC0000000; count += 0x1000) + { + m_TLB_ReadMap[count >> 12] = ((DWORD)m_RDRAM + (count & 0x1FFFFFFF)) - count; + m_TLB_WriteMap[count >> 12] = ((DWORD)m_RDRAM + (count & 0x1FFFFFFF)) - count; + } + + if (_Settings->LoadDword(Rdb_TLB_VAddrStart) != 0) + { + 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) { + m_TLB_ReadMap[count >> 12] = ((DWORD)m_RDRAM + (count - Start + PAddr)) - count; + m_TLB_WriteMap[count >> 12] = ((DWORD)m_RDRAM + (count - Start + PAddr)) - count; + } + } + _Settings->RegisterChangeCB(Game_RDRamSize,this,(CSettings::SettingChangedFunc)RdramChanged); + + return true; +} + +void CMipsMemoryVM::FreeMemory ( void ) +{ + _Settings->UnregisterChangeCB(Game_RDRamSize,this,(CSettings::SettingChangedFunc)RdramChanged); + + if (m_RDRAM) + { + VirtualFree( m_RDRAM, 0 , MEM_RELEASE); + m_RDRAM = NULL; + m_IMEM = NULL; + m_DMEM = NULL; + } + if (m_TLB_ReadMap) + { + VirtualFree( m_TLB_ReadMap, 0 , MEM_RELEASE); + m_TLB_ReadMap = NULL; + } + if (m_TLB_WriteMap) + { + VirtualFree( m_TLB_WriteMap, 0 , MEM_RELEASE); + m_TLB_WriteMap = NULL; + } + memset(m_PIF_Ram,0,sizeof(m_PIF_Ram)); +} + +BYTE * CMipsMemoryVM::Rdram ( void ) +{ + return m_RDRAM; +} + +DWORD CMipsMemoryVM::RdramSize ( void ) +{ + return m_AllocatedRdramSize; +} + +BYTE * CMipsMemoryVM::Dmem ( void ) +{ + return m_DMEM; +} + +BYTE * CMipsMemoryVM::Imem ( void ) +{ + return m_IMEM; +} + +BYTE * CMipsMemoryVM::PifRam ( void ) +{ + return m_PIF_Ram; +} + +BOOL CMipsMemoryVM::LB_VAddr ( DWORD VAddr, BYTE & Value ) +{ + if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } + Value = *(BYTE *)(m_TLB_ReadMap[VAddr >> 12] + (VAddr ^ 3)); + return TRUE; +} + +BOOL CMipsMemoryVM::LH_VAddr ( DWORD VAddr, WORD & Value ) +{ + if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } + Value = *(WORD *)(m_TLB_ReadMap[VAddr >> 12] + (VAddr ^ 2)); + return TRUE; +} + +BOOL CMipsMemoryVM::LW_VAddr ( DWORD VAddr, DWORD & Value ) +{ + if (VAddr >= 0xA3F00000 && VAddr < 0xC0000000) + { + if (VAddr < 0xA4000000 || VAddr >= 0xA4002000) + { + VAddr &= 0x1FFFFFFF; + LW_NonMemory(VAddr,&Value); + return true; + } + } + BYTE * BaseAddress = (BYTE *)m_TLB_ReadMap[VAddr >> 12]; + if (BaseAddress == 0) { return FALSE; } + Value = *(DWORD *)(BaseAddress + VAddr); + +// if (LookUpMode == FuncFind_ChangeMemory) +// { +// BreakPoint(__FILE__,__LINE__); +// if ( (Command.Hex >> 16) == 0x7C7C) { +// Command.Hex = OrigMem[(Command.Hex & 0xFFFF)].OriginalValue; +// } +// } + return TRUE; + return false; +} + +BOOL CMipsMemoryVM::LD_VAddr ( DWORD VAddr, QWORD & Value ) +{ + if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } + *((DWORD *)(&Value) + 1) = *(DWORD *)(m_TLB_ReadMap[VAddr >> 12] + VAddr); + *((DWORD *)(&Value)) = *(DWORD *)(m_TLB_ReadMap[VAddr >> 12] + VAddr + 4); + return TRUE; +} + +BOOL CMipsMemoryVM::SB_VAddr ( DWORD VAddr, BYTE Value ) +{ + if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } + *(BYTE *)(m_TLB_WriteMap[VAddr >> 12] + (VAddr ^ 3)) = Value; + return TRUE; +} + +BOOL CMipsMemoryVM::SH_VAddr ( DWORD VAddr, WORD Value ) +{ + if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } + *(WORD *)(m_TLB_WriteMap[VAddr >> 12] + (VAddr ^ 2)) = Value; + return TRUE; +} + +BOOL CMipsMemoryVM::SW_VAddr ( DWORD VAddr, DWORD Value ) +{ + if (VAddr >= 0xA3F00000 && VAddr < 0xC0000000) + { + if (VAddr < 0xA4000000 || VAddr >= 0xA4002000) + { + VAddr &= 0x1FFFFFFF; + return SW_NonMemory(VAddr,Value); + } + } + if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } + *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr) = Value; + return TRUE; +} + + +BOOL CMipsMemoryVM::SD_VAddr ( DWORD VAddr, QWORD Value ) +{ + if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } + *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr) = *((DWORD *)(&Value) + 1); + *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr + 4) = *((DWORD *)(&Value)); + return TRUE; +} + +bool CMipsMemoryVM::ValidVaddr ( DWORD VAddr ) const +{ + return m_TLB_ReadMap[VAddr >> 12] != 0; +} + +bool CMipsMemoryVM::TranslateVaddr ( DWORD VAddr, DWORD &PAddr) const +{ + //Change the Virtual address to a Phyiscal Address + if (m_TLB_ReadMap[VAddr >> 12] == 0) { return false; } + PAddr = (DWORD)((BYTE *)(m_TLB_ReadMap[VAddr >> 12] + VAddr) - m_RDRAM); + return true; +} + +void CMipsMemoryVM::Compile_LB ( x86Reg Reg, DWORD VAddr, BOOL SignExtend) { + DWORD PAddr; + char VarName[100]; + + if (!TranslateVaddr(VAddr,PAddr)) { + MoveConstToX86reg(0,Reg); + CPU_Message("Compile_LB\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LB\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + case 0x10000000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + if (SignExtend) { + MoveSxVariableToX86regByte(PAddr + m_RDRAM,VarName,Reg); + } else { + MoveZxVariableToX86regByte(PAddr + m_RDRAM,VarName,Reg); + } + break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LB\nFailed to compile address: %X",VAddr); } + } +} + +void CMipsMemoryVM::Compile_LH ( x86Reg Reg, DWORD VAddr, BOOL SignExtend) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + MoveConstToX86reg(0,Reg); + CPU_Message("Compile_LH\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LH\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + case 0x10000000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + if (SignExtend) { + MoveSxVariableToX86regHalf(PAddr + m_RDRAM,VarName,Reg); + } else { + MoveZxVariableToX86regHalf(PAddr + m_RDRAM,VarName,Reg); + } + break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LHU\nFailed to compile address: %X",VAddr); } + } +} + +void CMipsMemoryVM::Compile_LW (x86Reg Reg, DWORD VAddr ) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + MoveConstToX86reg(0,Reg); + CPU_Message("Compile_LW\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address %X",VAddr); } + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + case 0x10000000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); + break; + case 0x04000000: + if (PAddr < 0x04002000) { + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); + break; + } + switch (PAddr) { + case 0x04040010: MoveVariableToX86reg(&_Reg->SP_STATUS_REG,"SP_STATUS_REG",Reg); break; + case 0x04040014: MoveVariableToX86reg(&_Reg->SP_DMA_FULL_REG,"SP_DMA_FULL_REG",Reg); break; + case 0x04040018: MoveVariableToX86reg(&_Reg->SP_DMA_BUSY_REG,"SP_DMA_BUSY_REG",Reg); break; + case 0x04080000: MoveVariableToX86reg(&_Reg->SP_PC_REG,"SP_PC_REG",Reg); break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04100000: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); + break; + case 0x04300000: + switch (PAddr) { + case 0x04300000: MoveVariableToX86reg(&_Reg->MI_MODE_REG,"MI_MODE_REG",Reg); break; + case 0x04300004: MoveVariableToX86reg(&_Reg->MI_VERSION_REG,"MI_VERSION_REG",Reg); break; + case 0x04300008: MoveVariableToX86reg(&_Reg->MI_INTR_REG,"MI_INTR_REG",Reg); break; + case 0x0430000C: MoveVariableToX86reg(&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG",Reg); break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04400000: + switch (PAddr) { + case 0x04400010: + UpdateCounters(m_RegWorkingSet,false,true); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)this,x86_ECX); + Call_Direct(AddressOf(CMipsMemoryVM::UpdateHalfLine),"CMipsMemoryVM::UpdateHalfLine"); + AfterCallDirect(); + MoveVariableToX86reg(&m_HalfLine,"m_HalfLine",Reg); + break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04500000: /* AI registers */ + switch (PAddr) { + case 0x04500004: + if (_Settings->LoadBool(Game_FixedAudio)) + { + UpdateCounters(m_RegWorkingSet,false,true); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Audio,x86_ECX); + Call_Direct(AddressOf(CAudio::AiGetLength),"CAudio::AiGetLength"); + MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); + AfterCallDirect(); + MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); + } else { + if (_Plugins->Audio()->ReadLength != NULL) { + BeforeCallDirect(); + Call_Direct(_Plugins->Audio()->ReadLength,"AiReadLength"); + MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); + AfterCallDirect(); + MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); + } else { + MoveConstToX86reg(0,Reg); + } + } + break; + case 0x0450000C: + if (_Settings->LoadBool(Game_FixedAudio)) + { + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Audio,x86_ECX); + Call_Direct(AddressOf(CAudio::AiGetStatus),"AiGetStatus"); + MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); + AfterCallDirect(); + MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); + } else { + MoveVariableToX86reg(&_Reg->AI_STATUS_REG,"AI_STATUS_REG",Reg); + } + break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04600000: + switch (PAddr) { + case 0x04600010: MoveVariableToX86reg(&_Reg->PI_STATUS_REG,"PI_STATUS_REG",Reg); break; + case 0x04600014: MoveVariableToX86reg(&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG",Reg); break; + case 0x04600018: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG",Reg); break; + case 0x0460001C: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG",Reg); break; + case 0x04600020: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG",Reg); break; + case 0x04600024: MoveVariableToX86reg(&_Reg->PI_DOMAIN2_REG,"PI_DOMAIN2_REG",Reg); break; + case 0x04600028: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_PWD_REG,"PI_BSD_DOM2_PWD_REG",Reg); break; + case 0x0460002C: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_PGS_REG,"PI_BSD_DOM2_PGS_REG",Reg); break; + case 0x04600030: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_RLS_REG,"PI_BSD_DOM2_RLS_REG",Reg); break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04700000: + switch (PAddr) { + case 0x0470000C: MoveVariableToX86reg(&_Reg->RI_SELECT_REG,"RI_SELECT_REG",Reg); break; + case 0x04700010: MoveVariableToX86reg(&_Reg->RI_REFRESH_REG,"RI_REFRESH_REG",Reg); break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x04800000: + switch (PAddr) { + case 0x04800018: MoveVariableToX86reg(&_Reg->SI_STATUS_REG,"SI_STATUS_REG",Reg); break; + default: + MoveConstToX86reg(0,Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } + } + break; + case 0x1FC00000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); + break; + default: + MoveConstToX86reg(((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF),Reg); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { + CPU_Message("Compile_LW\nFailed to translate address: %X",VAddr); + DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); + } + } +} + +void CMipsMemoryVM::Compile_SB_Const ( BYTE Value, DWORD VAddr ) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SB\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstByteToVariable(Value,PAddr + m_RDRAM,VarName); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB_Const\ntrying to store %X in %X?",Value,VAddr); } + } +} + +void CMipsMemoryVM::Compile_SB_Register ( x86Reg Reg, DWORD VAddr ) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SB\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regByteToVariable(Reg,PAddr + m_RDRAM,VarName); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB_Register\ntrying to store in %X?",VAddr); } + } +} + +void CMipsMemoryVM::Compile_SH_Const ( WORD Value, DWORD VAddr ) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SH\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstHalfToVariable(Value,PAddr + m_RDRAM,VarName); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH_Const\ntrying to store %X in %X?",Value,VAddr); } + } +} + +void CMipsMemoryVM::Compile_SH_Register ( x86Reg Reg, DWORD VAddr ) { + char VarName[100]; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SH\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regHalfToVariable(Reg,PAddr + m_RDRAM,VarName); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH_Register\ntrying to store in %X?",PAddr); } + } +} + +void CMipsMemoryVM::Compile_SW_Const ( DWORD Value, DWORD VAddr ) { + char VarName[100]; + BYTE * Jump; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SW\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); + break; + case 0x03F00000: + switch (PAddr) { + case 0x03F00000: MoveConstToVariable(Value,&_Reg->RDRAM_CONFIG_REG,"RDRAM_CONFIG_REG"); break; + case 0x03F00004: MoveConstToVariable(Value,&_Reg->RDRAM_DEVICE_ID_REG,"RDRAM_DEVICE_ID_REG"); break; + case 0x03F00008: MoveConstToVariable(Value,&_Reg->RDRAM_DELAY_REG,"RDRAM_DELAY_REG"); break; + case 0x03F0000C: MoveConstToVariable(Value,&_Reg->RDRAM_MODE_REG,"RDRAM_MODE_REG"); break; + case 0x03F00010: MoveConstToVariable(Value,&_Reg->RDRAM_REF_INTERVAL_REG,"RDRAM_REF_INTERVAL_REG"); break; + case 0x03F00014: MoveConstToVariable(Value,&_Reg->RDRAM_REF_ROW_REG,"RDRAM_REF_ROW_REG"); break; + case 0x03F00018: MoveConstToVariable(Value,&_Reg->RDRAM_RAS_INTERVAL_REG,"RDRAM_RAS_INTERVAL_REG"); break; + case 0x03F0001C: MoveConstToVariable(Value,&_Reg->RDRAM_MIN_INTERVAL_REG,"RDRAM_MIN_INTERVAL_REG"); break; + case 0x03F00020: MoveConstToVariable(Value,&_Reg->RDRAM_ADDR_SELECT_REG,"RDRAM_ADDR_SELECT_REG"); break; + case 0x03F00024: MoveConstToVariable(Value,&_Reg->RDRAM_DEVICE_MANUF_REG,"RDRAM_DEVICE_MANUF_REG"); break; + case 0x03F04004: break; + case 0x03F08004: break; + case 0x03F80004: break; + case 0x03F80008: break; + case 0x03F8000C: break; + case 0x03F80014: break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04000000: + if (PAddr < 0x04002000) { + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); + break; + } + switch (PAddr) { + case 0x04040000: MoveConstToVariable(Value,&_Reg->SP_MEM_ADDR_REG,"SP_MEM_ADDR_REG"); break; + case 0x04040004: MoveConstToVariable(Value,&_Reg->SP_DRAM_ADDR_REG,"SP_DRAM_ADDR_REG"); break; + case 0x04040008: + MoveConstToVariable(Value,&_Reg->SP_RD_LEN_REG,"SP_RD_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&SP_DMA_READ,"SP_DMA_READ"); + AfterCallDirect(); + break; + case 0x04040010: + { + DWORD ModValue; + ModValue = 0; + if ( ( Value & SP_CLR_HALT ) != 0 ) { ModValue |= SP_STATUS_HALT; } + if ( ( Value & SP_CLR_BROKE ) != 0 ) { ModValue |= SP_STATUS_BROKE; } + if ( ( Value & SP_CLR_SSTEP ) != 0 ) { ModValue |= SP_STATUS_SSTEP; } + if ( ( Value & SP_CLR_INTR_BREAK ) != 0 ) { ModValue |= SP_STATUS_INTR_BREAK; } + if ( ( Value & SP_CLR_SIG0 ) != 0 ) { ModValue |= SP_STATUS_SIG0; } + if ( ( Value & SP_CLR_SIG1 ) != 0 ) { ModValue |= SP_STATUS_SIG1; } + if ( ( Value & SP_CLR_SIG2 ) != 0 ) { ModValue |= SP_STATUS_SIG2; } + if ( ( Value & SP_CLR_SIG3 ) != 0 ) { ModValue |= SP_STATUS_SIG3; } + if ( ( Value & SP_CLR_SIG4 ) != 0 ) { ModValue |= SP_STATUS_SIG4; } + if ( ( Value & SP_CLR_SIG5 ) != 0 ) { ModValue |= SP_STATUS_SIG5; } + if ( ( Value & SP_CLR_SIG6 ) != 0 ) { ModValue |= SP_STATUS_SIG6; } + if ( ( Value & SP_CLR_SIG7 ) != 0 ) { ModValue |= SP_STATUS_SIG7; } + if (ModValue != 0) { + AndConstToVariable(~ModValue,&_Reg->SP_STATUS_REG,"SP_STATUS_REG"); + } + + ModValue = 0; + if ( ( Value & SP_SET_HALT ) != 0 ) { ModValue |= SP_STATUS_HALT; } + if ( ( Value & SP_SET_SSTEP ) != 0 ) { ModValue |= SP_STATUS_SSTEP; } + if ( ( Value & SP_SET_INTR_BREAK ) != 0) { ModValue |= SP_STATUS_INTR_BREAK; } + if ( ( Value & SP_SET_SIG0 ) != 0 ) { ModValue |= SP_STATUS_SIG0; } + if ( ( Value & SP_SET_SIG1 ) != 0 ) { ModValue |= SP_STATUS_SIG1; } + if ( ( Value & SP_SET_SIG2 ) != 0 ) { ModValue |= SP_STATUS_SIG2; } + if ( ( Value & SP_SET_SIG3 ) != 0 ) { ModValue |= SP_STATUS_SIG3; } + if ( ( Value & SP_SET_SIG4 ) != 0 ) { ModValue |= SP_STATUS_SIG4; } + if ( ( Value & SP_SET_SIG5 ) != 0 ) { ModValue |= SP_STATUS_SIG5; } + if ( ( Value & SP_SET_SIG6 ) != 0 ) { ModValue |= SP_STATUS_SIG6; } + if ( ( Value & SP_SET_SIG7 ) != 0 ) { ModValue |= SP_STATUS_SIG7; } + if (ModValue != 0) { + OrConstToVariable(ModValue,&_Reg->SP_STATUS_REG,"SP_STATUS_REG"); + } + if ( ( Value & SP_SET_SIG0 ) != 0 && _Settings->LoadBool(Game_RspAudioSignal) ) + { + OrConstToVariable(MI_INTR_SP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + } + if ( ( Value & SP_CLR_INTR ) != 0) { + AndConstToVariable(~MI_INTR_SP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + Call_Direct(RunRsp,"RunRsp"); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + } else { + BeforeCallDirect(); + Call_Direct(RunRsp,"RunRsp"); + AfterCallDirect(); + } + } + break; + case 0x0404001C: MoveConstToVariable(0,&_Reg->SP_SEMAPHORE_REG,"SP_SEMAPHORE_REG"); break; + case 0x04080000: MoveConstToVariable(Value & 0xFFC,&_Reg->SP_PC_REG,"SP_PC_REG"); break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04300000: + switch (PAddr) { + case 0x04300000: + { + DWORD ModValue; + ModValue = 0x7F; + if ( ( Value & MI_CLR_INIT ) != 0 ) { ModValue |= MI_MODE_INIT; } + if ( ( Value & MI_CLR_EBUS ) != 0 ) { ModValue |= MI_MODE_EBUS; } + if ( ( Value & MI_CLR_RDRAM ) != 0 ) { ModValue |= MI_MODE_RDRAM; } + if (ModValue != 0) { + AndConstToVariable(~ModValue,&_Reg->MI_MODE_REG,"MI_MODE_REG"); + } + + ModValue = (Value & 0x7F); + if ( ( Value & MI_SET_INIT ) != 0 ) { ModValue |= MI_MODE_INIT; } + if ( ( Value & MI_SET_EBUS ) != 0 ) { ModValue |= MI_MODE_EBUS; } + if ( ( Value & MI_SET_RDRAM ) != 0 ) { ModValue |= MI_MODE_RDRAM; } + if (ModValue != 0) { + OrConstToVariable(ModValue,&_Reg->MI_MODE_REG,"MI_MODE_REG"); + } + if ( ( Value & MI_CLR_DP_INTR ) != 0 ) { + AndConstToVariable(~MI_INTR_DP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + } + } + break; + case 0x0430000C: + { + DWORD ModValue; + ModValue = 0; + if ( ( Value & MI_INTR_MASK_CLR_SP ) != 0 ) { ModValue |= MI_INTR_MASK_SP; } + if ( ( Value & MI_INTR_MASK_CLR_SI ) != 0 ) { ModValue |= MI_INTR_MASK_SI; } + if ( ( Value & MI_INTR_MASK_CLR_AI ) != 0 ) { ModValue |= MI_INTR_MASK_AI; } + if ( ( Value & MI_INTR_MASK_CLR_VI ) != 0 ) { ModValue |= MI_INTR_MASK_VI; } + if ( ( Value & MI_INTR_MASK_CLR_PI ) != 0 ) { ModValue |= MI_INTR_MASK_PI; } + if ( ( Value & MI_INTR_MASK_CLR_DP ) != 0 ) { ModValue |= MI_INTR_MASK_DP; } + if (ModValue != 0) { + AndConstToVariable(~ModValue,&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG"); + } + + ModValue = 0; + if ( ( Value & MI_INTR_MASK_SET_SP ) != 0 ) { ModValue |= MI_INTR_MASK_SP; } + if ( ( Value & MI_INTR_MASK_SET_SI ) != 0 ) { ModValue |= MI_INTR_MASK_SI; } + if ( ( Value & MI_INTR_MASK_SET_AI ) != 0 ) { ModValue |= MI_INTR_MASK_AI; } + if ( ( Value & MI_INTR_MASK_SET_VI ) != 0 ) { ModValue |= MI_INTR_MASK_VI; } + if ( ( Value & MI_INTR_MASK_SET_PI ) != 0 ) { ModValue |= MI_INTR_MASK_PI; } + if ( ( Value & MI_INTR_MASK_SET_DP ) != 0 ) { ModValue |= MI_INTR_MASK_DP; } + if (ModValue != 0) { + OrConstToVariable(ModValue,&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG"); + } + } + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04400000: + switch (PAddr) { + case 0x04400000: + if (_Plugins->Gfx()->ViStatusChanged != NULL) { + CompConstToVariable(Value,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); + JeLabel8("Continue",0); + Jump = m_RecompPos - 1; + MoveConstToVariable(Value,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); + BeforeCallDirect(); + Call_Direct(_Plugins->Gfx()->ViStatusChanged,"ViStatusChanged"); + AfterCallDirect(); + CPU_Message(""); + CPU_Message(" Continue:"); + *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); + } + break; + case 0x04400004: MoveConstToVariable((Value & 0xFFFFFF),&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); break; + case 0x04400008: + if (_Plugins->Gfx()->ViWidthChanged != NULL) { + CompConstToVariable(Value,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); + JeLabel8("Continue",0); + Jump = m_RecompPos - 1; + MoveConstToVariable(Value,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); + BeforeCallDirect(); + Call_Direct(_Plugins->Gfx()->ViWidthChanged,"ViWidthChanged"); + AfterCallDirect(); + CPU_Message(""); + CPU_Message(" Continue:"); + *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); + } + break; + case 0x0440000C: MoveConstToVariable(Value,&_Reg->VI_INTR_REG,"VI_INTR_REG"); break; + case 0x04400010: + AndConstToVariable(~MI_INTR_VI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + case 0x04400014: MoveConstToVariable(Value,&_Reg->VI_BURST_REG,"VI_BURST_REG"); break; + case 0x04400018: MoveConstToVariable(Value,&_Reg->VI_V_SYNC_REG,"VI_V_SYNC_REG"); break; + case 0x0440001C: MoveConstToVariable(Value,&_Reg->VI_H_SYNC_REG,"VI_H_SYNC_REG"); break; + case 0x04400020: MoveConstToVariable(Value,&_Reg->VI_LEAP_REG,"VI_LEAP_REG"); break; + case 0x04400024: MoveConstToVariable(Value,&_Reg->VI_H_START_REG,"VI_H_START_REG"); break; + case 0x04400028: MoveConstToVariable(Value,&_Reg->VI_V_START_REG,"VI_V_START_REG"); break; + case 0x0440002C: MoveConstToVariable(Value,&_Reg->VI_V_BURST_REG,"VI_V_BURST_REG"); break; + case 0x04400030: MoveConstToVariable(Value,&_Reg->VI_X_SCALE_REG,"VI_X_SCALE_REG"); break; + case 0x04400034: MoveConstToVariable(Value,&_Reg->VI_Y_SCALE_REG,"VI_Y_SCALE_REG"); break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04500000: /* AI registers */ + switch (PAddr) { + case 0x04500000: MoveConstToVariable(Value,&_Reg->AI_DRAM_ADDR_REG,"AI_DRAM_ADDR_REG"); break; + case 0x04500004: + MoveConstToVariable(Value,&_Reg->AI_LEN_REG,"AI_LEN_REG"); + BeforeCallDirect(); + if (_Settings->LoadBool(Game_FixedAudio)) + { + X86BreakPoint(__FILE__,__LINE__); + MoveConstToX86reg((DWORD)Value,x86_EDX); + MoveConstToX86reg((DWORD)_Audio,x86_ECX); + Call_Direct(AddressOf(CAudio::AiSetLength),"AiSetLength"); + } + Call_Direct(_Plugins->Audio()->LenChanged,"AiLenChanged"); + AfterCallDirect(); + break; + case 0x04500008: MoveConstToVariable((Value & 1),&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); break; + case 0x0450000C: + /* Clear Interrupt */; + AndConstToVariable(~MI_INTR_AI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); +#ifdef tofix + if (!_Settings->LoadBool(Game_FixedAudio)) + { + AndConstToVariable(~MI_INTR_AI,&_Reg->m_AudioIntrReg,"m_AudioIntrReg"); + } +#endif + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + case 0x04500010: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); + break; + case 0x04500014: MoveConstToVariable(Value,&_Reg->AI_BITRATE_REG,"AI_BITRATE_REG"); break; + default: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04600000: + switch (PAddr) { + case 0x04600000: MoveConstToVariable(Value,&_Reg->PI_DRAM_ADDR_REG,"PI_DRAM_ADDR_REG"); break; + case 0x04600004: MoveConstToVariable(Value,&_Reg->PI_CART_ADDR_REG,"PI_CART_ADDR_REG"); break; + case 0x04600008: + MoveConstToVariable(Value,&_Reg->PI_RD_LEN_REG,"PI_RD_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&PI_DMA_READ,"PI_DMA_READ"); + AfterCallDirect(); + break; + case 0x0460000C: + MoveConstToVariable(Value,&_Reg->PI_WR_LEN_REG,"PI_WR_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&PI_DMA_WRITE,"PI_DMA_WRITE"); + AfterCallDirect(); + break; + case 0x04600010: + if ((Value & PI_CLR_INTR) != 0 ) { + AndConstToVariable(~MI_INTR_PI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + } + break; + case 0x04600014: MoveConstToVariable((Value & 0xFF),&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); break; + case 0x04600018: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); break; + case 0x0460001C: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); break; + case 0x04600020: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04700000: + switch (PAddr) { + case 0x04700000: MoveConstToVariable(Value,&_Reg->RI_MODE_REG,"RI_MODE_REG"); break; + case 0x04700004: MoveConstToVariable(Value,&_Reg->RI_CONFIG_REG,"RI_CONFIG_REG"); break; + case 0x04700008: MoveConstToVariable(Value,&_Reg->RI_CURRENT_LOAD_REG,"RI_CURRENT_LOAD_REG"); break; + case 0x0470000C: MoveConstToVariable(Value,&_Reg->RI_SELECT_REG,"RI_SELECT_REG"); break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + case 0x04800000: + switch (PAddr) { + case 0x04800000: MoveConstToVariable(Value,&_Reg->SI_DRAM_ADDR_REG,"SI_DRAM_ADDR_REG"); break; + case 0x04800004: + MoveConstToVariable(Value,&_Reg->SI_PIF_ADDR_RD64B_REG,"SI_PIF_ADDR_RD64B_REG"); + BeforeCallDirect(); + Call_Direct(&SI_DMA_READ,"SI_DMA_READ"); + AfterCallDirect(); + break; + case 0x04800010: + MoveConstToVariable(Value,&_Reg->SI_PIF_ADDR_WR64B_REG,"SI_PIF_ADDR_WR64B_REG"); + BeforeCallDirect(); + Call_Direct(&SI_DMA_WRITE,"SI_DMA_WRITE"); + AfterCallDirect(); + break; + case 0x04800018: + AndConstToVariable(~MI_INTR_SI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + AndConstToVariable(~SI_STATUS_INTERRUPT,&_Reg->SI_STATUS_REG,"SI_STATUS_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } + } +} + +void CMipsMemoryVM::Compile_SW_Register (x86Reg Reg, DWORD VAddr ) +{ + char VarName[100]; + BYTE * Jump; + DWORD PAddr; + + if (!TranslateVaddr(VAddr, PAddr)) { + CPU_Message("Compile_SW_Register\nFailed to translate address %X",VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\nFailed to translate address %X",VAddr); } + return; + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + break; + case 0x04000000: + switch (PAddr) { + case 0x04040000: MoveX86regToVariable(Reg,&_Reg->SP_MEM_ADDR_REG,"SP_MEM_ADDR_REG"); break; + case 0x04040004: MoveX86regToVariable(Reg,&_Reg->SP_DRAM_ADDR_REG,"SP_DRAM_ADDR_REG"); break; + case 0x04040008: + MoveX86regToVariable(Reg,&_Reg->SP_RD_LEN_REG,"SP_RD_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&SP_DMA_READ,"SP_DMA_READ"); + AfterCallDirect(); + break; + case 0x0404000C: + MoveX86regToVariable(Reg,&_Reg->SP_WR_LEN_REG,"SP_WR_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&SP_DMA_WRITE,"SP_DMA_WRITE"); + AfterCallDirect(); + break; + case 0x04040010: + MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); + BeforeCallDirect(); + Call_Direct(ChangeSpStatus,"ChangeSpStatus"); + AfterCallDirect(); + break; + case 0x0404001C: MoveConstToVariable(0,&_Reg->SP_SEMAPHORE_REG,"SP_SEMAPHORE_REG"); break; + case 0x04080000: + MoveX86regToVariable(Reg,&_Reg->SP_PC_REG,"SP_PC_REG"); + AndConstToVariable(0xFFC,&_Reg->SP_PC_REG,"SP_PC_REG"); + break; + default: + if (PAddr < 0x04002000) { + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + } else { + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + } + break; + case 0x04100000: + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + case 0x04300000: + switch (PAddr) { + case 0x04300000: + MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); + BeforeCallDirect(); + Call_Direct(ChangeMiIntrMask,"ChangeMiModeReg"); + AfterCallDirect(); + break; + case 0x0430000C: + MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); + BeforeCallDirect(); + Call_Direct(ChangeMiIntrMask,"ChangeMiIntrMask"); + AfterCallDirect(); + break; + default: + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + break; + case 0x04400000: + switch (PAddr) { + case 0x04400000: + if (_Plugins->Gfx()->ViStatusChanged != NULL) { + CompX86regToVariable(Reg,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); + JeLabel8("Continue",0); + Jump = m_RecompPos - 1; + MoveX86regToVariable(Reg,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); + BeforeCallDirect(); + Call_Direct(_Plugins->Gfx()->ViStatusChanged,"ViStatusChanged"); + AfterCallDirect(); + CPU_Message(""); + CPU_Message(" Continue:"); + *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); + } + break; + case 0x04400004: + MoveX86regToVariable(Reg,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); + AndConstToVariable(0xFFFFFF,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); + break; + case 0x04400008: + if (_Plugins->Gfx()->ViWidthChanged != NULL) { + CompX86regToVariable(Reg,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); + JeLabel8("Continue",0); + Jump = m_RecompPos - 1; + MoveX86regToVariable(Reg,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); + BeforeCallDirect(); + Call_Direct(_Plugins->Gfx()->ViWidthChanged,"ViWidthChanged"); + AfterCallDirect(); + CPU_Message(""); + CPU_Message(" Continue:"); + *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); + } + break; + case 0x0440000C: MoveX86regToVariable(Reg,&_Reg->VI_INTR_REG,"VI_INTR_REG"); break; + case 0x04400010: + AndConstToVariable(~MI_INTR_VI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + case 0x04400014: MoveX86regToVariable(Reg,&_Reg->VI_BURST_REG,"VI_BURST_REG"); break; + case 0x04400018: MoveX86regToVariable(Reg,&_Reg->VI_V_SYNC_REG,"VI_V_SYNC_REG"); break; + case 0x0440001C: MoveX86regToVariable(Reg,&_Reg->VI_H_SYNC_REG,"VI_H_SYNC_REG"); break; + case 0x04400020: MoveX86regToVariable(Reg,&_Reg->VI_LEAP_REG,"VI_LEAP_REG"); break; + case 0x04400024: MoveX86regToVariable(Reg,&_Reg->VI_H_START_REG,"VI_H_START_REG"); break; + case 0x04400028: MoveX86regToVariable(Reg,&_Reg->VI_V_START_REG,"VI_V_START_REG"); break; + case 0x0440002C: MoveX86regToVariable(Reg,&_Reg->VI_V_BURST_REG,"VI_V_BURST_REG"); break; + case 0x04400030: MoveX86regToVariable(Reg,&_Reg->VI_X_SCALE_REG,"VI_X_SCALE_REG"); break; + case 0x04400034: MoveX86regToVariable(Reg,&_Reg->VI_Y_SCALE_REG,"VI_Y_SCALE_REG"); break; + default: + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + break; + case 0x04500000: /* AI registers */ + switch (PAddr) { + case 0x04500000: MoveX86regToVariable(Reg,&_Reg->AI_DRAM_ADDR_REG,"AI_DRAM_ADDR_REG"); break; + case 0x04500004: + UpdateCounters(m_RegWorkingSet,false,true); + MoveX86regToVariable(Reg,&_Reg->AI_LEN_REG,"AI_LEN_REG"); + BeforeCallDirect(); + if (_Settings->LoadBool(Game_FixedAudio)) + { + MoveConstToX86reg((DWORD)_Audio,x86_ECX); + Call_Direct(AddressOf(CAudio::AiSetLength),"AiSetLength"); + } + Call_Direct(_Plugins->Audio()->LenChanged,"AiLenChanged"); + AfterCallDirect(); + break; + case 0x04500008: + MoveX86regToVariable(Reg,&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); + AndConstToVariable(1,&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); + case 0x0450000C: + /* Clear Interrupt */; + AndConstToVariable(~MI_INTR_AI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + AndConstToVariable(~MI_INTR_AI,&_Reg->m_AudioIntrReg,"m_AudioIntrReg"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + case 0x04500010: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + break; + case 0x04500014: MoveX86regToVariable(Reg,&_Reg->AI_BITRATE_REG,"AI_BITRATE_REG"); break; + default: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } } + break; + case 0x04600000: + switch (PAddr) { + case 0x04600000: MoveX86regToVariable(Reg,&_Reg->PI_DRAM_ADDR_REG,"PI_DRAM_ADDR_REG"); break; + case 0x04600004: MoveX86regToVariable(Reg,&_Reg->PI_CART_ADDR_REG,"PI_CART_ADDR_REG"); break; + case 0x04600008: + MoveX86regToVariable(Reg,&_Reg->PI_RD_LEN_REG,"PI_RD_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&PI_DMA_READ,"PI_DMA_READ"); + AfterCallDirect(); + break; + case 0x0460000C: + MoveX86regToVariable(Reg,&_Reg->PI_WR_LEN_REG,"PI_WR_LEN_REG"); + BeforeCallDirect(); + Call_Direct(&PI_DMA_WRITE,"PI_DMA_WRITE"); + AfterCallDirect(); + break; + case 0x04600010: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + AndConstToVariable(~MI_INTR_PI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + MoveX86regToVariable(Reg,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); + AndConstToVariable(0xFFFFFF,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); + case 0x04600014: + MoveX86regToVariable(Reg,&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); + AndConstToVariable(0xFF,&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); + break; + case 0x04600018: + MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); + AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); + break; + case 0x0460001C: + MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); + AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); + break; + case 0x04600020: + MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); + AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); + break; + default: + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + break; + case 0x04700000: + switch (PAddr) { + case 0x04700010: MoveX86regToVariable(Reg,&_Reg->RI_REFRESH_REG,"RI_REFRESH_REG"); break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + break; + case 0x04800000: + switch (PAddr) { + case 0x04800000: MoveX86regToVariable(Reg,&_Reg->SI_DRAM_ADDR_REG,"SI_DRAM_ADDR_REG"); break; + case 0x04800004: + MoveX86regToVariable(Reg,&_Reg->SI_PIF_ADDR_RD64B_REG,"SI_PIF_ADDR_RD64B_REG"); + BeforeCallDirect(); + Call_Direct(&SI_DMA_READ,"SI_DMA_READ"); + AfterCallDirect(); + break; + case 0x04800010: + MoveX86regToVariable(Reg,&_Reg->SI_PIF_ADDR_WR64B_REG,"SI_PIF_ADDR_WR64B_REG"); + BeforeCallDirect(); + Call_Direct(&SI_DMA_WRITE,"SI_DMA_WRITE"); + AfterCallDirect(); + break; + case 0x04800018: + AndConstToVariable(~MI_INTR_SI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); + AndConstToVariable(~SI_STATUS_INTERRUPT,&_Reg->SI_STATUS_REG,"SI_STATUS_REG"); + BeforeCallDirect(); + MoveConstToX86reg((DWORD)_Reg,x86_ECX); + Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); + AfterCallDirect(); + break; + default: + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } + } + break; + case 0x1FC00000: + sprintf(VarName,"m_RDRAM + %X",PAddr); + MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); + break; + default: + CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); + if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store in %X?",VAddr); } + } +} + +void CMipsMemoryVM::ResetMemoryStack ( void) +{ + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + x86Reg Reg, TempReg; + + CPU_Message(" ResetMemoryStack"); + x86reg = Map_MemoryStack(Section, x86_Any, false); + if (x86reg >= 0) { UnMap_X86reg(Section,x86reg); } + + x86reg = Map_TempReg(x86_Any, 29, FALSE); + if (_Settings->LoadBool(Game_UseTlb)) + { + TempReg = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(x86reg,TempReg); + ShiftRightUnsignImmed(TempReg,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg,TempReg,4); + AddX86RegToX86Reg(x86reg,TempReg); + } else { + AndConstToX86Reg(x86reg,0x1FFFFFFF); + AddConstToX86Reg(x86reg,(DWORD)m_RDRAM); + } + MoveX86regToVariable(x86reg, g_MemoryStack, "MemoryStack"); +#endif +} + +int CMipsMemoryVM::MemoryFilter( DWORD dwExptCode, void * lpExceptionPointer ) +{ + if (dwExptCode != EXCEPTION_ACCESS_VIOLATION) + { + return EXCEPTION_CONTINUE_SEARCH; + } + + //convert the pointer since we are not having win32 stuctures in headers + LPEXCEPTION_POINTERS lpEP = (LPEXCEPTION_POINTERS)lpExceptionPointer; + + DWORD MemAddress = (char *)lpEP->ExceptionRecord->ExceptionInformation[1] - (char *)_MMU->Rdram(); + if ((int)(MemAddress) < 0 || MemAddress > 0x1FFFFFFF) + { + return EXCEPTION_CONTINUE_SEARCH; + } + + DWORD * Reg; + + BYTE * TypePos = (unsigned char *)lpEP->ContextRecord->Eip; + EXCEPTION_RECORD exRec = *lpEP->ExceptionRecord; + + if (*TypePos == 0xF3 && *(TypePos + 1) == 0xA5) { + DWORD Start, End; + Start = (lpEP->ContextRecord->Edi - (DWORD)m_RDRAM); + End = (Start + (lpEP->ContextRecord->Ecx << 2) - 1); + if ((int)Start < 0) { +#ifndef EXTERNAL_RELEASE + DisplayError("hmmm.... where does this dma start ?"); +#endif + return EXCEPTION_CONTINUE_SEARCH; + } +#ifdef CFB_READ + DWORD count, OldProtect; + if (Start >= CFBStart && End < CFBEnd) { + for ( count = Start; count < End; count += 0x1000 ) { + VirtualProtect(m_RDRAM+count,4,PAGE_READONLY, &OldProtect); + if (FrameBufferRead) { FrameBufferRead(count & ~0xFFF); } + } + return EXCEPTION_CONTINUE_EXECUTION; + } +#endif + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + if ((int)End < RdramSize) { + for ( count = Start; count < End; count += 0x1000 ) { + BreakPoint(__FILE__,__LINE__); + if (N64_Blocks.NoOfRDRamBlocks[(count >> 12)] > 0) { + N64_Blocks.NoOfRDRamBlocks[(count >> 12)] = 0; + memset(JumpTable + ((count & 0x00FFFFF0) >> 2),0,0x1000); + *(DelaySlotTable + count) = NULL; + if (VirtualProtect(m_RDRAM + count, 4, PAGE_READWRITE, &OldProtect) == 0) { +#ifndef EXTERNAL_RELEASE + DisplayError("Failed to unprotect %X\n1", count); +#endif + } + } + } + return EXCEPTION_CONTINUE_EXECUTION; + } + if (Start >= 0x04000000 && End < 0x04001000) { + BreakPoint(__FILE__,__LINE__); + N64_Blocks.NoOfDMEMBlocks = 0; + memset(JumpTable + (0x04000000 >> 2),0,0x1000); + *(DelaySlotTable + (0x04000000 >> 12)) = NULL; + if (VirtualProtect(m_RDRAM + 0x04000000, 4, PAGE_READWRITE, &OldProtect) == 0) { +#ifndef EXTERNAL_RELEASE + DisplayError("Failed to unprotect %X\n7", 0x04000000); +#endif + } + return EXCEPTION_CONTINUE_EXECUTION; + } + if (Start >= 0x04001000 && End < 0x04002000) { + BreakPoint(__FILE__,__LINE__); + N64_Blocks.NoOfIMEMBlocks = 0; + memset(JumpTable + (0x04001000 >> 2),0,0x1000); + *(DelaySlotTable + (0x04001000 >> 12)) = NULL; + if (VirtualProtect(m_RDRAM + 0x04001000, 4, PAGE_READWRITE, &OldProtect) == 0) { +#ifndef EXTERNAL_RELEASE + DisplayError("Failed to unprotect %X\n6", 0x04001000); +#endif + } + return EXCEPTION_CONTINUE_EXECUTION; + } +#ifndef EXTERNAL_RELEASE + DisplayError("hmmm.... where does this dma End ?\nstart: %X\nend:%X\nlocation %X", + Start,End,lpEP->ContextRecord->Eip); +#endif +#endif + return EXCEPTION_CONTINUE_SEARCH; + } + + BYTE * ReadPos; + if (*TypePos == 0x0F && *(TypePos + 1) == 0xB6) { + ReadPos = TypePos + 2; + } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xB7) { + ReadPos = TypePos + 2; + } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xBE) { + ReadPos = TypePos + 2; + } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xBF) { + ReadPos = TypePos + 2; + } else if (*TypePos == 0x66) { + ReadPos = TypePos + 2; + } else { + ReadPos = TypePos + 1; + } + + switch ((*ReadPos & 0x38)) { + case 0x00: Reg = &lpEP->ContextRecord->Eax; break; + case 0x08: Reg = &lpEP->ContextRecord->Ecx; break; + case 0x10: Reg = &lpEP->ContextRecord->Edx; break; + case 0x18: Reg = &lpEP->ContextRecord->Ebx; break; + case 0x20: Reg = &lpEP->ContextRecord->Esp; break; + case 0x28: Reg = &lpEP->ContextRecord->Ebp; break; + case 0x30: Reg = &lpEP->ContextRecord->Esi; break; + case 0x38: Reg = &lpEP->ContextRecord->Edi; break; + } + + switch ((*ReadPos & 0xC7)) { + case 0: ReadPos += 1; break; + case 1: ReadPos += 1; break; + case 2: ReadPos += 1; break; + case 3: ReadPos += 1; break; + case 4: + ReadPos += 1; + switch ((*ReadPos & 0xC7)) { + case 0: ReadPos += 1; break; + case 1: ReadPos += 1; break; + case 2: ReadPos += 1; break; + case 3: ReadPos += 1; break; + case 6: ReadPos += 1; break; + case 7: ReadPos += 1; break; + default: + BreakPoint(__FILE__,__LINE__); + } + break; + case 5: ReadPos += 5; break; + case 6: ReadPos += 1; break; + case 7: ReadPos += 1; break; + case 0x40: ReadPos += 2; break; + case 0x41: ReadPos += 2; break; + case 0x42: ReadPos += 2; break; + case 0x43: ReadPos += 2; break; + case 0x46: ReadPos += 2; break; + case 0x47: ReadPos += 2; break; + case 0x80: ReadPos += 5; break; + case 0x81: ReadPos += 5; break; + case 0x82: ReadPos += 5; break; + case 0x83: ReadPos += 5; break; + case 0x86: ReadPos += 5; break; + case 0x87: ReadPos += 5; break; + default: + DisplayError("Unknown x86 opcode %X\nlocation %X\nloc: %X\nfgh2", + *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); + return EXCEPTION_CONTINUE_SEARCH; + } + + switch(*TypePos) { + case 0x0F: + switch(*(TypePos + 1)) { + case 0xB6: + if (!LB_NonMemory(MemAddress,(DWORD *)Reg,FALSE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0xB7: + if (!LH_NonMemory(MemAddress,(DWORD *)Reg,FALSE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load half word\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0xBE: + if (!LB_NonMemory(MemAddress,Reg,TRUE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0xBF: + if (!LH_NonMemory(MemAddress,Reg,TRUE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load half word\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + default: + DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", + *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); + return EXCEPTION_CONTINUE_SEARCH; + } + break; + case 0x66: + switch(*(TypePos + 1)) { + case 0x8B: + if (!LH_NonMemory(MemAddress,Reg,FALSE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to half word\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0x89: + if (!SH_NonMemory(MemAddress,*(WORD *)Reg)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store half word\n\nMIPS Address: %X\nX86 Address",MemAddress, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0xC7: + if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } + if (!SH_NonMemory(MemAddress,*(WORD *)ReadPos)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store half word\n\nMIPS Address: %X\nX86 Address",MemAddress, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 2); + return EXCEPTION_CONTINUE_EXECUTION; + default: + DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", + *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); + return EXCEPTION_CONTINUE_SEARCH; + } + break; + case 0x88: + if (!SB_NonMemory(MemAddress,*(BYTE *)Reg)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store byte\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0x8A: + if (!LB_NonMemory(MemAddress,Reg,FALSE)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0x8B: + if (!LW_NonMemory(MemAddress,Reg)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to load word\n\nMIPS Address: %X\nX86 Address", + (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0x89: + if (!SW_NonMemory(MemAddress,*(DWORD *)Reg)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store word\n\nMIPS Address: %X\nX86 Address",MemAddress, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)ReadPos; + return EXCEPTION_CONTINUE_EXECUTION; + case 0xC6: + if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } + if (!SB_NonMemory(MemAddress,*(BYTE *)ReadPos)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store byte\n\nMIPS Address: %X\nX86 Address",MemAddress, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 1); + return EXCEPTION_CONTINUE_EXECUTION; + case 0xC7: + if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } + if (!SW_NonMemory(MemAddress,*(DWORD *)ReadPos)) { + if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { + DisplayError("Failed to store word\n\nMIPS Address: %X\nX86 Address",MemAddress, + *(unsigned char *)lpEP->ContextRecord->Eip); + } + } + lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 4); + return EXCEPTION_CONTINUE_EXECUTION; + default: + DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", + *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); + return EXCEPTION_CONTINUE_SEARCH; + } + return EXCEPTION_CONTINUE_SEARCH; +} + +int CMipsMemoryVM::LB_NonMemory ( DWORD PAddr, DWORD * Value, BOOL SignExtend ) { + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + if (PAddr >= 0x10000000 && PAddr < 0x16000000) { + if (WrittenToRom) { return FALSE; } + if ((PAddr & 2) == 0) { PAddr = (PAddr + 4) ^ 2; } + if ((PAddr - 0x10000000) < RomFileSize) { + if (SignExtend) { + *Value = (int)((char)ROM[PAddr - 0x10000000]); + } else { + *Value = ROM[PAddr - 0x10000000]; + } + return TRUE; + } else { + *Value = 0; + return FALSE; + } + } +#endif +// switch (PAddr & 0xFFF00000) { +// default: + * Value = 0; + return FALSE; +// break; +// } +// return TRUE; +} + +int CMipsMemoryVM::LH_NonMemory ( DWORD PAddr, DWORD * Value, int SignExtend ) { +// switch (PAddr & 0xFFF00000) { +// default: + * Value = 0; + return FALSE; +// break; +// } +// return TRUE; +} + +int CMipsMemoryVM::LW_NonMemory ( DWORD PAddr, DWORD * Value ) { +#ifdef CFB_READ + if (PAddr >= CFBStart && PAddr < CFBEnd) { + DWORD OldProtect; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READONLY, &OldProtect); + if (FrameBufferRead) { FrameBufferRead(PAddr & ~0xFFF); } + *Value = *(DWORD *)(m_RDRAM+PAddr); + return TRUE; + } +#endif + if (PAddr >= 0x10000000 && PAddr < 0x16000000) + { + if (m_RomWrittenTo) + { + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + *Value = WroteToRom; + //LogMessage("%X: Read crap from Rom %X from %X",PROGRAM_COUNTER,*Value,PAddr); + WrittenToRom = FALSE; +#ifdef ROM_IN_MAPSPACE + { + DWORD OldProtect; + VirtualProtect(ROM,RomFileSize,PAGE_READONLY, &OldProtect); + } +#endif +#endif + return TRUE; + } + if ((PAddr - 0x10000000) < m_RomSize) { + *Value = *(DWORD *)&m_Rom[PAddr - 0x10000000]; + return TRUE; + } else { + *Value = PAddr & 0xFFFF; + *Value = (*Value << 16) | *Value; + return FALSE; + } + } + + switch (PAddr & 0xFFF00000) { + case 0x03F00000: + switch (PAddr) { + case 0x03F00000: * Value = _Reg->RDRAM_CONFIG_REG; break; + case 0x03F00004: * Value = _Reg->RDRAM_DEVICE_ID_REG; break; + case 0x03F00008: * Value = _Reg->RDRAM_DELAY_REG; break; + case 0x03F0000C: * Value = _Reg->RDRAM_MODE_REG; break; + case 0x03F00010: * Value = _Reg->RDRAM_REF_INTERVAL_REG; break; + case 0x03F00014: * Value = _Reg->RDRAM_REF_ROW_REG; break; + case 0x03F00018: * Value = _Reg->RDRAM_RAS_INTERVAL_REG; break; + case 0x03F0001C: * Value = _Reg->RDRAM_MIN_INTERVAL_REG; break; + case 0x03F00020: * Value = _Reg->RDRAM_ADDR_SELECT_REG; break; + case 0x03F00024: * Value = _Reg->RDRAM_DEVICE_MANUF_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04000000: + switch (PAddr) { + case 0x04040010: *Value = _Reg->SP_STATUS_REG; break; + case 0x04040014: *Value = _Reg->SP_DMA_FULL_REG; break; + case 0x04040018: *Value = _Reg->SP_DMA_BUSY_REG; break; + case 0x04080000: *Value = _Reg->SP_PC_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04100000: + switch (PAddr) { + case 0x0410000C: *Value = _Reg->DPC_STATUS_REG; break; + case 0x04100010: *Value = _Reg->DPC_CLOCK_REG; break; + case 0x04100014: *Value = _Reg->DPC_BUFBUSY_REG; break; + case 0x04100018: *Value = _Reg->DPC_PIPEBUSY_REG; break; + case 0x0410001C: *Value = _Reg->DPC_TMEM_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04300000: + switch (PAddr) { + case 0x04300000: * Value = _Reg->MI_MODE_REG; break; + case 0x04300004: * Value = _Reg->MI_VERSION_REG; break; + case 0x04300008: * Value = _Reg->MI_INTR_REG; break; + case 0x0430000C: * Value = _Reg->MI_INTR_MASK_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04400000: + switch (PAddr) { + case 0x04400000: *Value = _Reg->VI_STATUS_REG; break; + case 0x04400004: *Value = _Reg->VI_ORIGIN_REG; break; + case 0x04400008: *Value = _Reg->VI_WIDTH_REG; break; + case 0x0440000C: *Value = _Reg->VI_INTR_REG; break; + case 0x04400010: + UpdateHalfLine(); + *Value = m_HalfLine; + break; + case 0x04400014: *Value = _Reg->VI_BURST_REG; break; + case 0x04400018: *Value = _Reg->VI_V_SYNC_REG; break; + case 0x0440001C: *Value = _Reg->VI_H_SYNC_REG; break; + case 0x04400020: *Value = _Reg->VI_LEAP_REG; break; + case 0x04400024: *Value = _Reg->VI_H_START_REG; break; + case 0x04400028: *Value = _Reg->VI_V_START_REG ; break; + case 0x0440002C: *Value = _Reg->VI_V_BURST_REG; break; + case 0x04400030: *Value = _Reg->VI_X_SCALE_REG; break; + case 0x04400034: *Value = _Reg->VI_Y_SCALE_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04500000: + switch (PAddr) { + case 0x04500004: + if (_Settings->LoadBool(Game_FixedAudio)) + { + *Value = _Audio->AiGetLength(); + } else { + if (_Plugins->Audio()->ReadLength != NULL) { + *Value = _Plugins->Audio()->ReadLength(); + } else { + *Value = 0; + } + } + break; + case 0x0450000C: + if (_Settings->LoadBool(Game_FixedAudio)) + { + *Value = _Audio->AiGetStatus(); + } else { + *Value = _Reg->AI_STATUS_REG; + } + break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04600000: + switch (PAddr) { + case 0x04600010: *Value = _Reg->PI_STATUS_REG; break; + case 0x04600014: *Value = _Reg->PI_DOMAIN1_REG; break; + case 0x04600018: *Value = _Reg->PI_BSD_DOM1_PWD_REG; break; + case 0x0460001C: *Value = _Reg->PI_BSD_DOM1_PGS_REG; break; + case 0x04600020: *Value = _Reg->PI_BSD_DOM1_RLS_REG; break; + case 0x04600024: *Value = _Reg->PI_DOMAIN2_REG; break; + case 0x04600028: *Value = _Reg->PI_BSD_DOM2_PWD_REG; break; + case 0x0460002C: *Value = _Reg->PI_BSD_DOM2_PGS_REG; break; + case 0x04600030: *Value = _Reg->PI_BSD_DOM2_RLS_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04700000: + switch (PAddr) { + case 0x04700000: * Value = _Reg->RI_MODE_REG; break; + case 0x04700004: * Value = _Reg->RI_CONFIG_REG; break; + case 0x04700008: * Value = _Reg->RI_CURRENT_LOAD_REG; break; + case 0x0470000C: * Value = _Reg->RI_SELECT_REG; break; + case 0x04700010: * Value = _Reg->RI_REFRESH_REG; break; + case 0x04700014: * Value = _Reg->RI_LATENCY_REG; break; + case 0x04700018: * Value = _Reg->RI_RERROR_REG; break; + case 0x0470001C: * Value = _Reg->RI_WERROR_REG; break; + default: + * Value = 0; + return FALSE; + } + break; + case 0x04800000: + switch (PAddr) { + case 0x04800018: *Value = _Reg->SI_STATUS_REG; break; + default: + *Value = 0; + return FALSE; + } + break; + case 0x05000000: + *Value = PAddr & 0xFFFF; + *Value = (*Value << 16) | *Value; + return FALSE; + case 0x08000000: + if (g_SaveUsing == SaveChip_Auto) { g_SaveUsing = SaveChip_FlashRam; } + if (g_SaveUsing != SaveChip_FlashRam) { + *Value = PAddr & 0xFFFF; + *Value = (*Value << 16) | *Value; + return FALSE; + } + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + *Value = ReadFromFlashStatus(PAddr); +#endif + break; + case 0x1FC00000: + if (PAddr < 0x1FC007C0) { +/* DWORD ToSwap = *(DWORD *)(&PifRom[PAddr - 0x1FC00000]); + _asm { + mov eax,ToSwap + bswap eax + mov ToSwap,eax + } + * Value = ToSwap;*/ + BreakPoint(__FILE__,__LINE__); + return TRUE; + } + else if (PAddr < 0x1FC00800) + { + BYTE * PIF_Ram = _MMU->PifRam(); + DWORD ToSwap = *(DWORD *)(&PIF_Ram[PAddr - 0x1FC007C0]); + _asm { + mov eax,ToSwap + bswap eax + mov ToSwap,eax + } + * Value = ToSwap; + return TRUE; + } else { + * Value = 0; + return FALSE; + } + BreakPoint(__FILE__,__LINE__); + break; + default: + *Value = PAddr & 0xFFFF; + *Value = (*Value << 16) | *Value; + return FALSE; + break; + } + return TRUE; +} + +int CMipsMemoryVM::SB_NonMemory ( DWORD PAddr, BYTE Value ) { + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: +#ifdef CFB_READ + if (PAddr >= CFBStart && PAddr < CFBEnd) { + DWORD OldProtect; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); + *(BYTE *)(m_RDRAM+PAddr) = Value; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,OldProtect, &OldProtect); + DisplayError("FrameBufferWrite"); + if (FrameBufferWrite) { FrameBufferWrite(PAddr,1); } + break; + } +#endif + if (PAddr < RdramSize()) { + bool ProtectMem = false; + DWORD Start = PAddr & ~0xFFF; + WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); + if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } + + DWORD OldProtect; + VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect); + *(BYTE *)(m_RDRAM+PAddr) = Value; + if (ProtectMem) + { + VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READONLY, &OldProtect); + } + } + break; + default: + return FALSE; + break; + } + return TRUE; +} + +int CMipsMemoryVM::SH_NonMemory ( DWORD PAddr, WORD Value ) { + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: +#ifdef CFB_READ + if (PAddr >= CFBStart && PAddr < CFBEnd) { + DWORD OldProtect; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); + *(WORD *)(m_RDRAM+PAddr) = Value; + if (FrameBufferWrite) { FrameBufferWrite(PAddr & ~0xFFF,2); } + //*(WORD *)(m_RDRAM+PAddr) = 0xFFFF; + //VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_NOACCESS, &OldProtect); + DisplayError("PAddr = %x",PAddr); + break; + } +#endif + if (PAddr < RdramSize()) { + bool ProtectMem = false; + DWORD Start = PAddr & ~0xFFF; + WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); + if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } + + DWORD OldProtect; + VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect); + *(WORD *)(m_RDRAM+PAddr) = Value; + if (ProtectMem) + { + VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READONLY, &OldProtect); + } + } + break; + default: + return FALSE; + break; + } + return TRUE; +} + +int CMipsMemoryVM::SW_NonMemory ( DWORD PAddr, DWORD Value ) { + if (PAddr >= 0x10000000 && PAddr < 0x16000000) { + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + if ((PAddr - 0x10000000) < RomFileSize) { + WrittenToRom = TRUE; + WroteToRom = Value; +#ifdef ROM_IN_MAPSPACE + { + DWORD OldProtect; + VirtualProtect(ROM,RomFileSize,PAGE_NOACCESS, &OldProtect); + } +#endif + //LogMessage("%X: Wrote To Rom %X from %X",PROGRAM_COUNTER,Value,PAddr); + } else { + return FALSE; + } +#endif + } + + switch (PAddr & 0xFFF00000) { + case 0x00000000: + case 0x00100000: + case 0x00200000: + case 0x00300000: + case 0x00400000: + case 0x00500000: + case 0x00600000: + case 0x00700000: +#ifdef CFB_READ + if (PAddr >= CFBStart && PAddr < CFBEnd) { + DWORD OldProtect; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); + *(DWORD *)(m_RDRAM+PAddr) = Value; + VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,OldProtect, &OldProtect); + DisplayError("FrameBufferWrite %X",PAddr); + if (FrameBufferWrite) { FrameBufferWrite(PAddr,4); } + break; + } +#endif + if (PAddr < RdramSize()) { + bool ProtectMem = false; + + DWORD Start = PAddr & ~0xFFF; + WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); + if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } + + DWORD OldProtect; + VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect); + *(DWORD *)(m_RDRAM+PAddr) = Value; + if (ProtectMem) + { + VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READONLY, &OldProtect); + } + } + break; + case 0x03F00000: + switch (PAddr) { + case 0x03F00000: _Reg->RDRAM_CONFIG_REG = Value; break; + case 0x03F00004: _Reg->RDRAM_DEVICE_ID_REG = Value; break; + case 0x03F00008: _Reg->RDRAM_DELAY_REG = Value; break; + case 0x03F0000C: _Reg->RDRAM_MODE_REG = Value; break; + case 0x03F00010: _Reg->RDRAM_REF_INTERVAL_REG = Value; break; + case 0x03F00014: _Reg->RDRAM_REF_ROW_REG = Value; break; + case 0x03F00018: _Reg->RDRAM_RAS_INTERVAL_REG = Value; break; + case 0x03F0001C: _Reg->RDRAM_MIN_INTERVAL_REG = Value; break; + case 0x03F00020: _Reg->RDRAM_ADDR_SELECT_REG = Value; break; + case 0x03F00024: _Reg->RDRAM_DEVICE_MANUF_REG = Value; break; + case 0x03F04004: break; + case 0x03F08004: break; + case 0x03F80004: break; + case 0x03F80008: break; + case 0x03F8000C: break; + case 0x03F80014: break; + default: + return FALSE; + } + break; + case 0x04000000: + if (PAddr < 0x04002000) { + bool ProtectMem = false; + + DWORD Start = PAddr & ~0xFFF; + WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); + if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } + + DWORD OldProtect; + VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect); + *(DWORD *)(m_RDRAM+PAddr) = Value; + if (ProtectMem) + { + VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READONLY, &OldProtect); + } + } else { + switch (PAddr) { + case 0x04040000: _Reg->SP_MEM_ADDR_REG = Value; break; + case 0x04040004: _Reg->SP_DRAM_ADDR_REG = Value; break; + case 0x04040008: + _Reg->SP_RD_LEN_REG = Value; + SP_DMA_READ(); + break; + case 0x0404000C: + _Reg->SP_WR_LEN_REG = Value; + SP_DMA_WRITE(); + break; + case 0x04040010: + if ( ( Value & SP_CLR_HALT ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_HALT; } + if ( ( Value & SP_SET_HALT ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_HALT; } + if ( ( Value & SP_CLR_BROKE ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_BROKE; } + if ( ( Value & SP_CLR_INTR ) != 0) { + _Reg->MI_INTR_REG &= ~MI_INTR_SP; + _Reg->CheckInterrupts(); + } + #ifndef EXTERNAL_RELEASE + if ( ( Value & SP_SET_INTR ) != 0) { DisplayError("SP_SET_INTR"); } + #endif + if ( ( Value & SP_CLR_SSTEP ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SSTEP; } + if ( ( Value & SP_SET_SSTEP ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SSTEP; } + if ( ( Value & SP_CLR_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_INTR_BREAK; } + if ( ( Value & SP_SET_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_INTR_BREAK; } + if ( ( Value & SP_CLR_SIG0 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG0; } + if ( ( Value & SP_SET_SIG0 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG0; } + if ( ( Value & SP_CLR_SIG1 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG1; } + if ( ( Value & SP_SET_SIG1 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG1; } + if ( ( Value & SP_CLR_SIG2 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG2; } + if ( ( Value & SP_SET_SIG2 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG2; } + if ( ( Value & SP_CLR_SIG3 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG3; } + if ( ( Value & SP_SET_SIG3 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG3; } + if ( ( Value & SP_CLR_SIG4 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG4; } + if ( ( Value & SP_SET_SIG4 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG4; } + if ( ( Value & SP_CLR_SIG5 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG5; } + if ( ( Value & SP_SET_SIG5 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG5; } + if ( ( Value & SP_CLR_SIG6 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG6; } + if ( ( Value & SP_SET_SIG6 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG6; } + if ( ( Value & SP_CLR_SIG7 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG7; } + if ( ( Value & SP_SET_SIG7 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG7; } + +#ifdef tofix + if ( ( Value & SP_SET_SIG0 ) != 0 && AudioSignal) + { + MI_INTR_REG |= MI_INTR_SP; + _Reg->CheckInterrupts(); + } +#endif + //if (*( DWORD *)(DMEM + 0xFC0) == 1) { + // ChangeTimer(RspTimer,0x30000); + //} else { + RunRsp(); + //} + break; + case 0x0404001C: _Reg->SP_SEMAPHORE_REG = 0; break; + case 0x04080000: _Reg->SP_PC_REG = Value & 0xFFC; break; + default: + return FALSE; + } + } + break; + case 0x04100000: + switch (PAddr) { + case 0x04100000: + _Reg->DPC_START_REG = Value; + _Reg->DPC_CURRENT_REG = Value; + break; + case 0x04100004: + _Reg->DPC_END_REG = Value; + if (_Plugins->Gfx()->ProcessRDPList) { _Plugins->Gfx()->ProcessRDPList(); } + break; + //case 0x04100008: _Reg->DPC_CURRENT_REG = Value; break; + case 0x0410000C: + if ( ( Value & DPC_CLR_XBUS_DMEM_DMA ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_XBUS_DMEM_DMA; } + if ( ( Value & DPC_SET_XBUS_DMEM_DMA ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_XBUS_DMEM_DMA; } + if ( ( Value & DPC_CLR_FREEZE ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_FREEZE; } + if ( ( Value & DPC_SET_FREEZE ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_FREEZE; } + if ( ( Value & DPC_CLR_FLUSH ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_FLUSH; } + if ( ( Value & DPC_SET_FLUSH ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_FLUSH; } + if ( ( Value & DPC_CLR_FREEZE ) != 0) + { + if ( ( _Reg->SP_STATUS_REG & SP_STATUS_HALT ) == 0) + { + if ( ( _Reg->SP_STATUS_REG & SP_STATUS_BROKE ) == 0 ) + { + RunRsp(); + } + } + } +#ifdef tofix + if (ShowUnhandledMemory) { + //if ( ( Value & DPC_CLR_TMEM_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_TMEM_CTR"); } + //if ( ( Value & DPC_CLR_PIPE_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR"); } + //if ( ( Value & DPC_CLR_CMD_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR"); } + //if ( ( Value & DPC_CLR_CLOCK_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR"); } + } +#endif + break; + default: + return FALSE; + } + break; + case 0x04300000: + switch (PAddr) { + case 0x04300000: + _Reg->MI_MODE_REG &= ~0x7F; + _Reg->MI_MODE_REG |= (Value & 0x7F); + if ( ( Value & MI_CLR_INIT ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_INIT; } + if ( ( Value & MI_SET_INIT ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_INIT; } + if ( ( Value & MI_CLR_EBUS ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_EBUS; } + if ( ( Value & MI_SET_EBUS ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_EBUS; } + if ( ( Value & MI_CLR_DP_INTR ) != 0 ) { + _Reg->MI_INTR_REG &= ~MI_INTR_DP; + _Reg->CheckInterrupts(); + } + if ( ( Value & MI_CLR_RDRAM ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_RDRAM; } + if ( ( Value & MI_SET_RDRAM ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_RDRAM; } + break; + case 0x0430000C: + if ( ( Value & MI_INTR_MASK_CLR_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SP; } + if ( ( Value & MI_INTR_MASK_SET_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SP; } + if ( ( Value & MI_INTR_MASK_CLR_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SI; } + if ( ( Value & MI_INTR_MASK_SET_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SI; } + if ( ( Value & MI_INTR_MASK_CLR_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_AI; } + if ( ( Value & MI_INTR_MASK_SET_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_AI; } + if ( ( Value & MI_INTR_MASK_CLR_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_VI; } + if ( ( Value & MI_INTR_MASK_SET_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_VI; } + if ( ( Value & MI_INTR_MASK_CLR_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_PI; } + if ( ( Value & MI_INTR_MASK_SET_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_PI; } + if ( ( Value & MI_INTR_MASK_CLR_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_DP; } + if ( ( Value & MI_INTR_MASK_SET_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_DP; } + break; + default: + return FALSE; + } + break; + case 0x04400000: + switch (PAddr) { + case 0x04400000: + if (_Reg->VI_STATUS_REG != Value) { + _Reg->VI_STATUS_REG = Value; + if (_Plugins->Gfx()->ViStatusChanged != NULL ) { _Plugins->Gfx()->ViStatusChanged(); } + } + break; + case 0x04400004: +#ifdef CFB_READ + if (_Reg->VI_ORIGIN_REG > 0x280) { + SetFrameBuffer(_Reg->VI_ORIGIN_REG, (DWORD)(VI_WIDTH_REG * (VI_WIDTH_REG *.75))); + } +#endif + _Reg->VI_ORIGIN_REG = (Value & 0xFFFFFF); + //if (UpdateScreen != NULL ) { UpdateScreen(); } + break; + case 0x04400008: + if (_Reg->VI_WIDTH_REG != Value) { + _Reg->VI_WIDTH_REG = Value; + if (_Plugins->Gfx()->ViWidthChanged != NULL ) { _Plugins->Gfx()->ViWidthChanged(); } + } + break; + case 0x0440000C: _Reg->VI_INTR_REG = Value; break; + case 0x04400010: + _Reg->MI_INTR_REG &= ~MI_INTR_VI; + _Reg->CheckInterrupts(); + break; + case 0x04400014: _Reg->VI_BURST_REG = Value; break; + case 0x04400018: _Reg->VI_V_SYNC_REG = Value; break; + case 0x0440001C: _Reg->VI_H_SYNC_REG = Value; break; + case 0x04400020: _Reg->VI_LEAP_REG = Value; break; + case 0x04400024: _Reg->VI_H_START_REG = Value; break; + case 0x04400028: _Reg->VI_V_START_REG = Value; break; + case 0x0440002C: _Reg->VI_V_BURST_REG = Value; break; + case 0x04400030: _Reg->VI_X_SCALE_REG = Value; break; + case 0x04400034: _Reg->VI_Y_SCALE_REG = Value; break; + default: + return FALSE; + } + break; + case 0x04500000: + switch (PAddr) { + case 0x04500000: _Reg->AI_DRAM_ADDR_REG = Value; break; + case 0x04500004: + _Reg->AI_LEN_REG = Value; + if (g_FixedAudio) + { + _Audio->AiSetLength(); + } + if (_Plugins->Audio()->LenChanged != NULL) { _Plugins->Audio()->LenChanged(); } + break; + case 0x04500008: _Reg->AI_CONTROL_REG = (Value & 1); break; + case 0x0450000C: + /* Clear Interrupt */; + _Reg->MI_INTR_REG &= ~MI_INTR_AI; + _Reg->m_AudioIntrReg &= ~MI_INTR_AI; + _Reg->CheckInterrupts(); + break; + case 0x04500010: + _Reg->AI_DACRATE_REG = Value; + DacrateChanged(g_SystemType); + if (_Settings->LoadBool(Game_FixedAudio)) + { +#ifdef tofix + g_Audio->AiSetFrequency(Value,g_SystemType); +#endif + } + break; + case 0x04500014: _Reg->AI_BITRATE_REG = Value; break; + default: + return FALSE; + } + break; + case 0x04600000: + switch (PAddr) { + case 0x04600000: _Reg->PI_DRAM_ADDR_REG = Value; break; + case 0x04600004: _Reg->PI_CART_ADDR_REG = Value; break; + case 0x04600008: + _Reg->PI_RD_LEN_REG = Value; + PI_DMA_READ(); + break; + case 0x0460000C: + _Reg->PI_WR_LEN_REG = Value; + PI_DMA_WRITE(); + break; + case 0x04600010: + //if ((Value & PI_SET_RESET) != 0 ) { DisplayError("reset Controller"); } + if ((Value & PI_CLR_INTR) != 0 ) { + _Reg->MI_INTR_REG &= ~MI_INTR_PI; + _Reg->CheckInterrupts(); + } + break; + case 0x04600014: _Reg->PI_DOMAIN1_REG = (Value & 0xFF); break; + case 0x04600018: _Reg->PI_BSD_DOM1_PWD_REG = (Value & 0xFF); break; + case 0x0460001C: _Reg->PI_BSD_DOM1_PGS_REG = (Value & 0xFF); break; + case 0x04600020: _Reg->PI_BSD_DOM1_RLS_REG = (Value & 0xFF); break; + default: + return FALSE; + } + break; + case 0x04700000: + switch (PAddr) { + case 0x04700000: _Reg->RI_MODE_REG = Value; break; + case 0x04700004: _Reg->RI_CONFIG_REG = Value; break; + case 0x04700008: _Reg->RI_CURRENT_LOAD_REG = Value; break; + case 0x0470000C: _Reg->RI_SELECT_REG = Value; break; + case 0x04700010: _Reg->RI_REFRESH_REG = Value; break; + case 0x04700014: _Reg->RI_LATENCY_REG = Value; break; + case 0x04700018: _Reg->RI_RERROR_REG = Value; break; + case 0x0470001C: _Reg->RI_WERROR_REG = Value; break; + default: + return FALSE; + } + break; + case 0x04800000: + switch (PAddr) { + case 0x04800000: _Reg->SI_DRAM_ADDR_REG = Value; break; + case 0x04800004: + _Reg->SI_PIF_ADDR_RD64B_REG = Value; + SI_DMA_READ (); + break; + case 0x04800010: + _Reg->SI_PIF_ADDR_WR64B_REG = Value; + SI_DMA_WRITE(); + break; + case 0x04800018: + _Reg->MI_INTR_REG &= ~MI_INTR_SI; + _Reg->SI_STATUS_REG &= ~SI_STATUS_INTERRUPT; + _Reg->CheckInterrupts(); + break; + default: + return FALSE; + } + break; + case 0x08000000: + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + if (PAddr != 0x08010000) { return FALSE; } + if (SaveUsing == SaveChip_Auto) { SaveUsing = SaveChip_FlashRam; } + if (SaveUsing != SaveChip_FlashRam) { return TRUE; } + WriteToFlashCommand(Value); +#endif + return FALSE; + break; + case 0x1FC00000: + if (PAddr < 0x1FC007C0) { + return FALSE; + } else if (PAddr < 0x1FC00800) { + _asm { + mov eax,Value + bswap eax + mov Value,eax + } + *(DWORD *)(&m_PIF_Ram[PAddr - 0x1FC007C0]) = Value; + if (PAddr == 0x1FC007FC) { + PifRamWrite(); + } + return TRUE; + } + return FALSE; + break; + default: + return FALSE; + break; + } + return TRUE; +} + +extern DWORD g_ViRefreshRate; + +void CMipsMemoryVM::UpdateHalfLine (void) +{ + if (*_NextTimer < 0) { + m_HalfLine = 0; + return; + } + m_HalfLine = (DWORD)(*_NextTimer / g_ViRefreshRate); + m_HalfLine &= ~1; +} + +void CMipsMemoryVM::ProtectMemory( DWORD StartVaddr, DWORD EndVaddr ) +{ + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + if (!CTLB::ValidVaddr(StartVaddr) || !CTLB::ValidVaddr(EndVaddr)) { return; } + + //Get Physical Addresses passed + DWORD StartPAddr, EndPAddr; + if (!TranslateVaddr(StartVaddr,StartPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } + if (!TranslateVaddr(EndVaddr,EndPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } + + //Get Length of memory being protected + int Length = (EndPAddr + 4) - StartPAddr; + if (Length < 0) { _Notify->BreakPoint(__FILE__,__LINE__); } + + //Proect that memory address space + DWORD OldProtect; + void * MemLoc; + + if (!VAddrToRealAddr(StartVaddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } + VirtualProtect(MemLoc, Length, PAGE_READONLY, &OldProtect); +#endif +} + +void CMipsMemoryVM::UnProtectMemory( DWORD StartVaddr, DWORD EndVaddr ) +{ +// _Notify->BreakPoint(__FILE__,__LINE__); + WriteTraceF(TraceError,"CMipsMemoryVM::UnProtectMemory: Not implemented startVaddr: %X EndVaddr: %X",StartVaddr,EndVaddr); +#ifdef tofix + if (!CTLB::ValidVaddr(StartVaddr) || !CTLB::ValidVaddr(EndVaddr)) { return; } + + //Get Physical Addresses passed + DWORD StartPAddr, EndPAddr; + if (!TranslateVaddr(StartVaddr,StartPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } + if (!TranslateVaddr(EndVaddr,EndPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } + + //Get Length of memory being protected + int Length = (EndPAddr + 4) - StartPAddr; + if (Length < 0) { _Notify->BreakPoint(__FILE__,__LINE__); } + + //Proect that memory address space + DWORD OldProtect; + void * MemLoc; + + if (!VAddrToRealAddr(StartVaddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } + VirtualProtect(MemLoc, Length, PAGE_READWRITE, &OldProtect); +#endif +} + + +void CMipsMemoryVM::Compile_LB (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; + Map_GPR_32bit(Opcode.rt,TRUE,0); + Compile_LB(cMipsRegMapLo(Opcode.rt),Address,TRUE); + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + XorConstToX86Reg(TempReg1,3); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveSxByteX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,3); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveSxN64MemToX86regByte(cMipsRegMapLo(Opcode.rt), TempReg1); + } +} + +void CMipsMemoryVM::Compile_LBU (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; + Map_GPR_32bit(Opcode.rt,FALSE,0); + Compile_LB(cMipsRegMapLo(Opcode.rt),Address,FALSE); + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + XorConstToX86Reg(TempReg1,3); + Map_GPR_32bit(Opcode.rt,FALSE,-1); + MoveZxByteX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,3); + Map_GPR_32bit(Opcode.rt,FALSE,-1); + MoveZxN64MemToX86regByte(cMipsRegMapLo(Opcode.rt), TempReg1); + } +} + +void CMipsMemoryVM::Compile_LH (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; + Map_GPR_32bit(Opcode.rt,TRUE,0); + Compile_LH(cMipsRegMapLo(Opcode.rt),Address,TRUE); + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + XorConstToX86Reg(TempReg1,2); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveSxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,2); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveSxN64MemToX86regHalf(cMipsRegMapLo(Opcode.rt), TempReg1); + } +} + +void CMipsMemoryVM::Compile_LHU (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; + Map_GPR_32bit(Opcode.rt,FALSE,0); + Compile_LH(cMipsRegMapLo(Opcode.rt),Address,FALSE); + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + XorConstToX86Reg(TempReg1,2); + Map_GPR_32bit(Opcode.rt,FALSE,-1); + MoveZxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,2); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveZxN64MemToX86regHalf(cMipsRegMapLo(Opcode.rt), TempReg1); + } +} + +void CMipsMemoryVM::Compile_LW (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + x86Reg TempReg1, TempReg2; +#ifdef tofix + if (Opcode.base == 29 && SPHack) { + char String[100]; + + Map_GPR_32bit(Opcode.rt,TRUE,-1); + TempReg1 = Map_MemoryStack(x86_Any,true); + sprintf(String,"%Xh",(short)Opcode.offset); + MoveVariableDispToX86Reg((void *)((DWORD)(short)Opcode.offset),String,cMipsRegLo(Opcode.rt),TempReg1,1); + } else { +#endif + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + Map_GPR_32bit(Opcode.rt,TRUE,-1); + Compile_LW(cMipsRegMapLo(Opcode.rt),Address); + } else { + if (g_UseTlb) { + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base) && Opcode.offset == 0) { + ProtectGPR(Opcode.base); + TempReg1 = cMipsRegMapLo(Opcode.base); + } else { + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); + } else { + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + Map_GPR_32bit(Opcode.rt,TRUE,-1); + LeaSourceAndOffset(cMipsRegMapLo(Opcode.rt),cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.base); + } + } else { + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.base); + AddConstToX86Reg(cMipsRegMapLo(Opcode.rt),(short)Opcode.immediate); + } + AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),0x1FFFFFFF); + MoveN64MemToX86reg(cMipsRegMapLo(Opcode.rt),cMipsRegMapLo(Opcode.rt)); + } + } +#ifdef tofix + } + if (SPHack && Opcode.rt == 29) + { + ResetX86Protection(); + _MMU->ResetMemoryStack(m_Section); + } +#endif +} + +void CMipsMemoryVM::Compile_LWC1 (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, TempReg3; + char Name[50]; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + m_Section->CompileCop1Test(); + if ((Opcode.ft & 1) != 0) { + if (RegInStack(Opcode.ft-1,CRegInfo::FPU_Double) || RegInStack(Opcode.ft-1,CRegInfo::FPU_Qword)) { + UnMap_FPR(Opcode.ft-1,TRUE); + } + } + if (RegInStack(Opcode.ft,CRegInfo::FPU_Double) || RegInStack(Opcode.ft,CRegInfo::FPU_Qword)) { + UnMap_FPR(Opcode.ft,TRUE); + } else { + UnMap_FPR(Opcode.ft,FALSE); + } + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(TempReg1,Address); + + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); + MoveX86regToX86Pointer(TempReg1,TempReg2); + return; + } + if (IsMapped(Opcode.base) && Opcode.offset == 0) { + if (g_UseTlb) { + ProtectGPR(Opcode.base); + TempReg1 = cMipsRegMapLo(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + if (Opcode.immediate == 0) { + } else if (Opcode.immediate == 1) { + IncX86reg(TempReg1); + } else if (Opcode.immediate == 0xFFFF) { + DecX86reg(TempReg1); + } else { + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + } + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + if (g_UseTlb) { + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg3); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + MoveN64MemToX86reg(TempReg3,TempReg1); + } + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); + MoveX86regToX86Pointer(TempReg3,TempReg2); +} + +void CMipsMemoryVM::Compile_LWL (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, OffsetReg, shift; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + DWORD Offset = Address & 3; + + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); + x86Reg Value = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(Value,(Address & ~3)); + AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),LWL_MASK[Offset]); + ShiftLeftSignImmed(Value,(BYTE)LWL_SHIFT[Offset]); + AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),Value); + return; + } + + shift = Map_TempReg(x86_ECX,-1,FALSE); + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + + CompileReadTLBMiss(TempReg1,TempReg2); + } + OffsetReg = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, OffsetReg); + AndConstToX86Reg(OffsetReg,3); + AndConstToX86Reg(TempReg1,~3); + + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); + AndVariableDispToX86Reg((void *)LWL_MASK,"LWL_MASK",cMipsRegMapLo(Opcode.rt),OffsetReg,Multip_x4); + MoveVariableDispToX86Reg((void *)LWL_SHIFT,"LWL_SHIFT",shift,OffsetReg,4); + if (g_UseTlb) { + MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg1); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + MoveN64MemToX86reg(TempReg1,TempReg1); + } + ShiftLeftSign(TempReg1); + AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),TempReg1); +} + +void CMipsMemoryVM::Compile_LWR (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, OffsetReg, shift; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + DWORD Offset = Address & 3; + + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); + x86Reg Value = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(Value,(Address & ~3)); + AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),LWR_MASK[Offset]); + ShiftRightUnsignImmed(Value,(BYTE)LWR_SHIFT[Offset]); + AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),Value); + return; + } + + shift = Map_TempReg(x86_ECX,-1,FALSE); + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + + CompileReadTLBMiss(TempReg1,TempReg2); + } + OffsetReg = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, OffsetReg); + AndConstToX86Reg(OffsetReg,3); + AndConstToX86Reg(TempReg1,~3); + + Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); + AndVariableDispToX86Reg((void *)LWR_MASK,"LWR_MASK",cMipsRegMapLo(Opcode.rt),OffsetReg,Multip_x4); + MoveVariableDispToX86Reg((void *)LWR_SHIFT,"LWR_SHIFT",shift,OffsetReg,4); + if (g_UseTlb) { + MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg1); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + MoveN64MemToX86reg(TempReg1,TempReg1); + } + ShiftRightUnsign(TempReg1); + AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),TempReg1); +} + +void CMipsMemoryVM::Compile_LWU (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset); + Map_GPR_32bit(Opcode.rt,FALSE,0); + Compile_LW(cMipsRegLo(Opcode.rt),Address); + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + Map_GPR_32bit(Opcode.rt,FALSE,-1); + MoveZxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegLo(Opcode.rt)); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + Map_GPR_32bit(Opcode.rt,TRUE,-1); + MoveZxN64MemToX86regHalf(cMipsRegLo(Opcode.rt), TempReg1); + } +#endif +} + +void CMipsMemoryVM::Compile_LD (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (Opcode.rt == 0) return; + + x86Reg TempReg1, TempReg2; + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + Map_GPR_64bit(Opcode.rt,-1); + Compile_LW(cMipsRegMapHi(Opcode.rt),Address); + Compile_LW(cMipsRegMapLo(Opcode.rt),Address + 4); +#ifdef tofix + if (SPHack && Opcode.rt == 29) { _MMU->ResetMemoryStack(m_Section); } +#endif + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base) && Opcode.offset == 0) { + if (g_UseTlb) { + ProtectGPR(Opcode.base); + TempReg1 = cMipsRegMapLo(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + Map_GPR_64bit(Opcode.rt,-1); + MoveX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapHi(Opcode.rt)); + MoveX86regPointerToX86regDisp8(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt),4); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + Map_GPR_64bit(Opcode.rt,-1); + MoveN64MemToX86reg(cMipsRegMapHi(Opcode.rt),TempReg1); + MoveN64MemDispToX86reg(cMipsRegMapLo(Opcode.rt),TempReg1,4); + } +#ifdef tofix + if (SPHack && Opcode.rt == 29) { + ResetX86Protection(); + _MMU->ResetMemoryStack(m_Section); + } +#endif +} + +void CMipsMemoryVM::Compile_LDC1 (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, TempReg3; + char Name[50]; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + m_Section->CompileCop1Test(); + + UnMap_FPR(Opcode.ft,FALSE); + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(TempReg1,Address); + + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + AddConstToX86Reg(TempReg2,4); + MoveX86regToX86Pointer(TempReg1,TempReg2); + + Compile_LW(TempReg1,Address + 4); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + MoveX86regToX86Pointer(TempReg1,TempReg2); + return; + } + if (IsMapped(Opcode.base) && Opcode.offset == 0) { + if (g_UseTlb) { + ProtectGPR(Opcode.base); + TempReg1 = cMipsRegMapLo(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + if (Opcode.immediate == 0) { + } else if (Opcode.immediate == 1) { + IncX86reg(TempReg1); + } else if (Opcode.immediate == 0xFFFF) { + DecX86reg(TempReg1); + } else { + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + } + + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + if (g_UseTlb) { + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + CompileReadTLBMiss(TempReg1,TempReg2); + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg3); + Push(TempReg2); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + AddConstToX86Reg(TempReg2,4); + MoveX86regToX86Pointer(TempReg3,TempReg2); + Pop(TempReg2); + MoveX86regPointerToX86regDisp8(TempReg1, TempReg2,TempReg3,4); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + MoveX86regToX86Pointer(TempReg3,TempReg2); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + MoveN64MemToX86reg(TempReg3,TempReg1); + + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + AddConstToX86Reg(TempReg2,4); + MoveX86regToX86Pointer(TempReg3,TempReg2); + + MoveN64MemDispToX86reg(TempReg3,TempReg1,4); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); + MoveX86regToX86Pointer(TempReg3,TempReg2); + } +} + +void CMipsMemoryVM::Compile_LDL (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } + if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } + BeforeCallDirect(); + MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); + Call_Direct(R4300iOp::LDL, "R4300iOp::LDL"); + AfterCallDirect(); +#endif +} + +void CMipsMemoryVM::Compile_LDR (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } + if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } + BeforeCallDirect(); + MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); + Call_Direct(R4300iOp::LDR, "R4300iOp::LDR"); + AfterCallDirect(); +#endif +} + +void CMipsMemoryVM::Compile_SB (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; + + if (IsConst(Opcode.rt)) { + Compile_SB_Const((BYTE)cMipsRegLo(Opcode.rt), Address); + } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { + Compile_SB_Register(cMipsRegMapLo(Opcode.rt), Address); + } else { + Compile_SB_Register(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE), Address); + } + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + XorConstToX86Reg(TempReg1,3); + if (IsConst(Opcode.rt)) { + MoveConstByteToX86regPointer((BYTE)cMipsRegLo(Opcode.rt),TempReg1, TempReg2); + } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { + MoveX86regByteToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); + } else { + UnProtectGPR(Opcode.rt); + MoveX86regByteToX86regPointer(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE),TempReg1, TempReg2); + } + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,3); + if (IsConst(Opcode.rt)) { + MoveConstByteToN64Mem((BYTE)cMipsRegLo(Opcode.rt),TempReg1); + } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { + MoveX86regByteToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); + } else { + UnProtectGPR(Opcode.rt); + MoveX86regByteToN64Mem(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE),TempReg1); + } + } +} + +void CMipsMemoryVM::Compile_SH (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (IsConst(Opcode.base)) { + DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; + + if (IsConst(Opcode.rt)) { + Compile_SH_Const((WORD)cMipsRegLo(Opcode.rt), Address); + } else if (IsMapped(Opcode.rt)) { + Compile_SH_Register(cMipsRegMapLo(Opcode.rt), Address); + } else { + Compile_SH_Register(Map_TempReg(x86_Any,Opcode.rt,FALSE), Address); + } + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + XorConstToX86Reg(TempReg1,2); + if (IsConst(Opcode.rt)) { + MoveConstHalfToX86regPointer((WORD)cMipsRegLo(Opcode.rt),TempReg1, TempReg2); + } else if (IsMapped(Opcode.rt)) { + MoveX86regHalfToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); + } else { + MoveX86regHalfToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1, TempReg2); + } + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + XorConstToX86Reg(TempReg1,2); + if (IsConst(Opcode.rt)) { + MoveConstHalfToN64Mem((WORD)cMipsRegLo(Opcode.rt),TempReg1); + } else if (IsMapped(Opcode.rt)) { + MoveX86regHalfToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); + } else { + MoveX86regHalfToN64Mem(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1); + } + } +} + +void CMipsMemoryVM::Compile_SW (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + x86Reg TempReg1, TempReg2; +#ifdef tofix + if (Opcode.base == 29 && SPHack) { + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + TempReg1 = Map_MemoryStack(x86_Any,true); + + if (IsConst(Opcode.rt)) { + MoveConstToMemoryDisp (cMipsRegLo(Opcode.rt),TempReg1, (DWORD)((short)Opcode.offset)); + } else if (IsMapped(Opcode.rt)) { + MoveX86regToMemory(cMipsRegLo(Opcode.rt),TempReg1,(DWORD)((short)Opcode.offset)); + } else { + TempReg2 = Map_TempReg(x86_Any,Opcode.rt,FALSE); + MoveX86regToMemory(TempReg2,TempReg1,(DWORD)((short)Opcode.offset)); + } + } else { +#endif + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + + if (IsConst(Opcode.rt)) { + Compile_SW_Const(cMipsRegLo(Opcode.rt), Address); + } else if (IsMapped(Opcode.rt)) { + Compile_SW_Register(cMipsRegMapLo(Opcode.rt), Address); + } else { + Compile_SW_Register(Map_TempReg(x86_Any,Opcode.rt,FALSE), Address); + } + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + if (IsConst(Opcode.rt)) { + MoveConstToX86regPointer(cMipsRegLo(Opcode.rt),TempReg1, TempReg2); + } else if (IsMapped(Opcode.rt)) { + MoveX86regToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); + } else { + MoveX86regToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1, TempReg2); + } + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + if (IsConst(Opcode.rt)) { + MoveConstToN64Mem(cMipsRegLo(Opcode.rt),TempReg1); + } else if (IsMapped(Opcode.rt)) { + MoveX86regToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); + } else { + MoveX86regToN64Mem(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1); + } + } +#ifdef tofix + } +#endif +} + +void CMipsMemoryVM::Compile_SWC1 (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, TempReg3; + char Name[50]; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + m_Section->CompileCop1Test(); + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + + UnMap_FPR(Opcode.ft,TRUE); + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg1); + MoveX86PointerToX86reg(TempReg1,TempReg1); + Compile_SW_Register(TempReg1, Address); + return; + } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + if (Opcode.immediate == 0) { + } else if (Opcode.immediate == 1) { + IncX86reg(TempReg1); + } else if (Opcode.immediate == 0xFFFF) { + DecX86reg(TempReg1); + } else { + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + UnMap_FPR(Opcode.ft,TRUE); + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg3); + MoveX86PointerToX86reg(TempReg3,TempReg3); + MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); + } else { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + UnMap_FPR(Opcode.ft,TRUE); + sprintf(Name,"_FPR_S[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); + MoveX86PointerToX86reg(TempReg2,TempReg2); + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + MoveX86regToN64Mem(TempReg2, TempReg1); + } +} + +void CMipsMemoryVM::Compile_SWL (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, Value, shift, OffsetReg; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (IsConst(Opcode.base)) { + DWORD Address; + + Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + DWORD Offset = Address & 3; + + Value = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(Value,(Address & ~3)); + AndConstToX86Reg(Value,R4300iOp::SWL_MASK[Offset]); + TempReg1 = Map_TempReg(x86_Any,Opcode.rt,FALSE); + ShiftRightUnsignImmed(TempReg1,(BYTE)SWL_SHIFT[Offset]); + AddX86RegToX86Reg(Value,TempReg1); + Compile_SW_Register(Value, (Address & ~3)); + return; + } + shift = Map_TempReg(x86_ECX,-1,FALSE); + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + } + + OffsetReg = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, OffsetReg); + AndConstToX86Reg(OffsetReg,3); + AndConstToX86Reg(TempReg1,~3); + + Value = Map_TempReg(x86_Any,-1,FALSE); + if (g_UseTlb) { + MoveX86regPointerToX86reg(TempReg1, TempReg2,Value); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + MoveN64MemToX86reg(Value,TempReg1); + } + + AndVariableDispToX86Reg((void *)SWL_MASK,"SWL_MASK",Value,OffsetReg,Multip_x4); + if (!IsConst(Opcode.rt) || cMipsRegLo(Opcode.rt) != 0) { + MoveVariableDispToX86Reg((void *)SWL_SHIFT,"SWL_SHIFT",shift,OffsetReg,4); + if (IsConst(Opcode.rt)) { + MoveConstToX86reg(cMipsRegLo(Opcode.rt),OffsetReg); + } else if (IsMapped(Opcode.rt)) { + MoveX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),OffsetReg); + } else { + MoveVariableToX86reg(&_GPR[Opcode.rt].UW[0],CRegName::GPR_Lo[Opcode.rt],OffsetReg); + } + ShiftRightUnsign(OffsetReg); + AddX86RegToX86Reg(Value,OffsetReg); + } + + if (g_UseTlb) { + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + + MoveX86regToX86regPointer(Value,TempReg1, TempReg2); + } else { + MoveX86regToN64Mem(Value,TempReg1); + } +} + +void CMipsMemoryVM::Compile_SWR (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, Value, OffsetReg, shift; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + DWORD Offset = Address & 3; + + Value = Map_TempReg(x86_Any,-1,FALSE); + Compile_LW(Value,(Address & ~3)); + AndConstToX86Reg(Value,SWR_MASK[Offset]); + TempReg1 = Map_TempReg(x86_Any,Opcode.rt,FALSE); + ShiftLeftSignImmed(TempReg1,(BYTE)SWR_SHIFT[Offset]); + AddX86RegToX86Reg(Value,TempReg1); + Compile_SW_Register(Value, (Address & ~3)); + return; + } + shift = Map_TempReg(x86_ECX,-1,FALSE); + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + UnProtectGPR(Opcode.base); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); + + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + } + + OffsetReg = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, OffsetReg); + AndConstToX86Reg(OffsetReg,3); + AndConstToX86Reg(TempReg1,~3); + + Value = Map_TempReg(x86_Any,-1,FALSE); + if (g_UseTlb) { + MoveX86regPointerToX86reg(TempReg1, TempReg2,Value); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + MoveN64MemToX86reg(Value,TempReg1); + } + + AndVariableDispToX86Reg((void *)SWR_MASK,"SWR_MASK",Value,OffsetReg,Multip_x4); + if (!IsConst(Opcode.rt) || cMipsRegLo(Opcode.rt) != 0) { + MoveVariableDispToX86Reg((void *)SWR_SHIFT,"SWR_SHIFT",shift,OffsetReg,4); + if (IsConst(Opcode.rt)) { + MoveConstToX86reg(cMipsRegLo(Opcode.rt),OffsetReg); + } else if (IsMapped(Opcode.rt)) { + MoveX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),OffsetReg); + } else { + MoveVariableToX86reg(&_GPR[Opcode.rt].UW[0],CRegName::GPR_Lo[Opcode.rt],OffsetReg); + } + ShiftLeftSign(OffsetReg); + AddX86RegToX86Reg(Value,OffsetReg); + } + + if (g_UseTlb) { + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + + MoveX86regToX86regPointer(Value,TempReg1, TempReg2); + } else { + MoveX86regToN64Mem(Value,TempReg1); + } +} + +void CMipsMemoryVM::Compile_SD (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + + if (IsConst(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + Compile_SW_Const(MipsRegHi(Opcode.rt), Address); + } else { + Compile_SW_Const((MipsRegLo_S(Opcode.rt) >> 31), Address); + } + Compile_SW_Const(cMipsRegLo(Opcode.rt), Address + 4); + } else if (IsMapped(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + Compile_SW_Register(MipsRegMapHi(Opcode.rt), Address); + } else { + Compile_SW_Register(Map_TempReg(x86_Any,Opcode.rt,TRUE), Address); + } + Compile_SW_Register(cMipsRegMapLo(Opcode.rt), Address + 4); + } else { + Compile_SW_Register(TempReg1 = Map_TempReg(x86_Any,Opcode.rt,TRUE), Address); + Compile_SW_Register(Map_TempReg(TempReg1,Opcode.rt,FALSE), Address + 4); + } + return; + } + if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + if (IsConst(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + MoveConstToX86regPointer(MipsRegHi(Opcode.rt),TempReg1, TempReg2); + } else { + MoveConstToX86regPointer((MipsRegLo_S(Opcode.rt) >> 31),TempReg1, TempReg2); + } + AddConstToX86Reg(TempReg1,4); + MoveConstToX86regPointer(cMipsRegLo(Opcode.rt),TempReg1, TempReg2); + } else if (IsMapped(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + MoveX86regToX86regPointer(MipsRegMapHi(Opcode.rt),TempReg1, TempReg2); + } else { + MoveX86regToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,TRUE),TempReg1, TempReg2); + } + AddConstToX86Reg(TempReg1,4); + MoveX86regToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); + } else { + x86Reg Reg = Map_TempReg(x86_Any,Opcode.rt,TRUE); + MoveX86regToX86regPointer(Reg,TempReg1, TempReg2); + AddConstToX86Reg(TempReg1,4); + MoveX86regToX86regPointer(Map_TempReg(Reg,Opcode.rt,FALSE),TempReg1, TempReg2); + } + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + if (IsConst(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + MoveConstToN64Mem(MipsRegHi(Opcode.rt),TempReg1); + } else if (IsSigned(Opcode.rt)) { + MoveConstToN64Mem((cMipsRegLo_S(Opcode.rt) >> 31),TempReg1); + } else { + MoveConstToN64Mem(0,TempReg1); + } + MoveConstToN64MemDisp(cMipsRegLo(Opcode.rt),TempReg1,4); + } else if (IsKnown(Opcode.rt) && IsMapped(Opcode.rt)) { + if (Is64Bit(Opcode.rt)) { + MoveX86regToN64Mem(MipsRegMapHi(Opcode.rt),TempReg1); + } else if (IsSigned(Opcode.rt)) { + MoveX86regToN64Mem(Map_TempReg(x86_Any,Opcode.rt,TRUE), TempReg1); + } else { + MoveConstToN64Mem(0,TempReg1); + } + MoveX86regToN64MemDisp(cMipsRegMapLo(Opcode.rt),TempReg1, 4); + } else { + x86Reg Reg; + MoveX86regToN64Mem(Reg = Map_TempReg(x86_Any,Opcode.rt,TRUE), TempReg1); + MoveX86regToN64MemDisp(Map_TempReg(Reg,Opcode.rt,FALSE), TempReg1,4); + } + } +} + +void CMipsMemoryVM::Compile_SDC1 (void) +{ + OPCODE & Opcode = CRecompilerOps::m_Opcode; + x86Reg TempReg1, TempReg2, TempReg3; + char Name[50]; + + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + + m_Section->CompileCop1Test(); + + if (IsConst(Opcode.base)) { + DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; + + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg1); + AddConstToX86Reg(TempReg1,4); + MoveX86PointerToX86reg(TempReg1,TempReg1); + Compile_SW_Register(TempReg1, Address); + + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg1); + MoveX86PointerToX86reg(TempReg1,TempReg1); + Compile_SW_Register(TempReg1, Address + 4); + return; + } + if (IsMapped(Opcode.base)) { + ProtectGPR(Opcode.base); + if (Opcode.offset != 0) { + TempReg1 = Map_TempReg(x86_Any,-1,FALSE); + LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + } + } else { + TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); + if (Opcode.immediate == 0) { + } else if (Opcode.immediate == 1) { + IncX86reg(TempReg1); + } else if (Opcode.immediate == 0xFFFF) { + DecX86reg(TempReg1); + } else { + AddConstToX86Reg(TempReg1,(short)Opcode.immediate); + } + } + if (g_UseTlb) { + TempReg2 = Map_TempReg(x86_Any,-1,FALSE); + MoveX86RegToX86Reg(TempReg1, TempReg2); + ShiftRightUnsignImmed(TempReg2,12); + MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); + //For tlb miss + //0041C522 85 C0 test eax,eax + //0041C524 75 01 jne 0041C527 + + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); + AddConstToX86Reg(TempReg3,4); + MoveX86PointerToX86reg(TempReg3,TempReg3); + MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); + AddConstToX86Reg(TempReg1,4); + + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); + MoveX86PointerToX86reg(TempReg3,TempReg3); + MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); + } else { + AndConstToX86Reg(TempReg1,0x1FFFFFFF); + TempReg3 = Map_TempReg(x86_Any,-1,FALSE); + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); + AddConstToX86Reg(TempReg3,4); + MoveX86PointerToX86reg(TempReg3,TempReg3); + MoveX86regToN64Mem(TempReg3, TempReg1); + sprintf(Name,"_FPR_D[%d]",Opcode.ft); + MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); + MoveX86PointerToX86reg(TempReg3,TempReg3); + MoveX86regToN64MemDisp(TempReg3, TempReg1,4); + } +} + +void CMipsMemoryVM::Compile_SDL (void) { + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } + if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } + BeforeCallDirect(); + MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); + Call_Direct(R4300iOp::SDL, "R4300iOp::SDL"); + AfterCallDirect(); + +#endif +} + +void CMipsMemoryVM::Compile_SDR (void) { + _Notify->BreakPoint(__FILE__,__LINE__); +#ifdef tofix + CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); + if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } + if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } + BeforeCallDirect(); + MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); + Call_Direct(R4300iOp::SDR, "R4300iOp::SDR"); + AfterCallDirect(); +#endif +} + +LPCTSTR CMipsMemoryVM::LabelName ( DWORD Address ) const +{ + //StringMap::iterator theIterator = m_LabelList.find(Address); + //if (theIterator != m_LabelList.end()) { + // return (*theIterator).second; + //} + + sprintf(m_strLabelName,"0x%08X",Address); + return m_strLabelName; +} + +void CMipsMemoryVM::TLB_Mapped( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly ) +{ + for (DWORD count = VAddr, VEnd = VAddr + Len; count < VEnd; count += 0x1000) { + DWORD Index = count >> 12; + m_TLB_ReadMap[Index] = ((DWORD)m_RDRAM + (count - VAddr + PAddr)) - count; + if (!bReadOnly) + { + m_TLB_WriteMap[Index] = ((DWORD)m_RDRAM + (count - VAddr + PAddr)) - count; + } + } +} + +void CMipsMemoryVM::TLB_Unmaped( DWORD Vaddr, DWORD Len ) +{ + for (DWORD count = Vaddr, End = Vaddr + Len; count < End; count += 0x1000) + { + DWORD Index = count >> 12; + m_TLB_ReadMap[Index] = NULL; + m_TLB_WriteMap[Index] = NULL; + } +} + +void CMipsMemoryVM::RdramChanged ( CMipsMemoryVM * _this ) +{ + if (_this->m_AllocatedRdramSize == _Settings->LoadDword(Game_RDRamSize)) + { + return; + } + if (_this->m_AllocatedRdramSize == 0x400000) { + if (VirtualAlloc(_this->m_RDRAM + 0x400000, 0x400000, MEM_COMMIT, PAGE_READWRITE)==NULL) + { + WriteTrace(TraceError,"CMipsMemoryVM::RdramChanged: failed to allocate extended memory"); + _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); + } + _this->m_AllocatedRdramSize = 0x800000; + } else { + VirtualFree(_this->m_RDRAM + 0x400000, 0x400000,MEM_DECOMMIT); + _this->m_AllocatedRdramSize = 0x400000; + } + +} + +void CMipsMemoryVM::ChangeSpStatus (void) +{ + if ( ( RegModValue & SP_CLR_HALT ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_HALT; } + if ( ( RegModValue & SP_SET_HALT ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_HALT; } + if ( ( RegModValue & SP_CLR_BROKE ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_BROKE; } + if ( ( RegModValue & SP_CLR_INTR ) != 0) { + _Reg->MI_INTR_REG &= ~MI_INTR_SP; + _Reg->CheckInterrupts(); + } +#ifndef EXTERNAL_RELEASE + if ( ( RegModValue & SP_SET_INTR ) != 0) { DisplayError("SP_SET_INTR"); } +#endif + if ( ( RegModValue & SP_CLR_SSTEP ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SSTEP; } + if ( ( RegModValue & SP_SET_SSTEP ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SSTEP; } + if ( ( RegModValue & SP_CLR_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_INTR_BREAK; } + if ( ( RegModValue & SP_SET_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_INTR_BREAK; } + if ( ( RegModValue & SP_CLR_SIG0 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG0; } + if ( ( RegModValue & SP_SET_SIG0 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG0; } + if ( ( RegModValue & SP_CLR_SIG1 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG1; } + if ( ( RegModValue & SP_SET_SIG1 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG1; } + if ( ( RegModValue & SP_CLR_SIG2 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG2; } + if ( ( RegModValue & SP_SET_SIG2 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG2; } + if ( ( RegModValue & SP_CLR_SIG3 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG3; } + if ( ( RegModValue & SP_SET_SIG3 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG3; } + if ( ( RegModValue & SP_CLR_SIG4 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG4; } + if ( ( RegModValue & SP_SET_SIG4 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG4; } + if ( ( RegModValue & SP_CLR_SIG5 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG5; } + if ( ( RegModValue & SP_SET_SIG5 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG5; } + if ( ( RegModValue & SP_CLR_SIG6 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG6; } + if ( ( RegModValue & SP_SET_SIG6 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG6; } + if ( ( RegModValue & SP_CLR_SIG7 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG7; } + if ( ( RegModValue & SP_SET_SIG7 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG7; } + + if ( ( RegModValue & SP_SET_SIG0 ) != 0 && g_AudioSignal) + { + _Reg->MI_INTR_REG |= MI_INTR_SP; + _Reg->CheckInterrupts(); + } + //if (*( DWORD *)(DMEM + 0xFC0) == 1) { + // ChangeTimer(RspTimer,0x40000); + //} else { + RunRsp(); + //} +} + +void CMipsMemoryVM::ChangeMiIntrMask (void) { + if ( ( RegModValue & MI_INTR_MASK_CLR_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SP; } + if ( ( RegModValue & MI_INTR_MASK_SET_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SP; } + if ( ( RegModValue & MI_INTR_MASK_CLR_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SI; } + if ( ( RegModValue & MI_INTR_MASK_SET_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SI; } + if ( ( RegModValue & MI_INTR_MASK_CLR_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_AI; } + if ( ( RegModValue & MI_INTR_MASK_SET_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_AI; } + if ( ( RegModValue & MI_INTR_MASK_CLR_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_VI; } + if ( ( RegModValue & MI_INTR_MASK_SET_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_VI; } + if ( ( RegModValue & MI_INTR_MASK_CLR_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_PI; } + if ( ( RegModValue & MI_INTR_MASK_SET_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_PI; } + if ( ( RegModValue & MI_INTR_MASK_CLR_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_DP; } + if ( ( RegModValue & MI_INTR_MASK_SET_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_DP; } +} diff --git a/Source/Project64/N64 System/Mips/Memory Virtual Mem.h b/Source/Project64/N64 System/Mips/Memory Virtual Mem.h index 82b7d3fd7..1ddb2bf40 100644 --- a/Source/Project64/N64 System/Mips/Memory Virtual Mem.h +++ b/Source/Project64/N64 System/Mips/Memory Virtual Mem.h @@ -1,38 +1,11 @@ -class CCodeSection; -class CRegInfo; -class CRSP_Plugin; - class CMipsMemoryVM : public CMipsMemory, public CTransVaddr, private CRecompilerOps, private R4300iOp { - //Make sure plugins can directly access this information - friend CGfxPlugin; - friend CAudioPlugin; - friend CRSP_Plugin; - friend CControl_Plugin; - 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 _Rom2; //Current loaded ROM - CRegisters * const _Reg; -#endif CMipsMemory_CallBack * const m_CBClass; -#ifdef toremove - //Save Chips accessed by memory - /*CSram * m_Sram; - CFlashRam * m_FlashRam; - bool m_SavesReadOnly; - -*/ -#endif - //Memory Locations BYTE * m_RDRAM, * m_DMEM, * m_IMEM, m_PIF_Ram[0x40]; DWORD m_AllocatedRdramSize; @@ -44,29 +17,13 @@ class CMipsMemoryVM : bool m_RomWrittenTo; DWORD m_RomWroteValue; - // Recompiler - void ** JumpTable/*, ** DelaySlotTable*/; - BYTE * m_RecompCode; - DWORD m_RecompSize; - - enum { MaxCompileBufferSize = 0x03C00000 }; - enum { InitialCompileBufferSize = 0x00500000 }; - enum { IncreaseCompileBufferSize = 0x00100000 }; - //Current Half line void UpdateHalfLine ( void ); DWORD m_HalfLine; DWORD m_MemoryStack; DWORD m_TempValue; - //Searching memory - BYTE * m_MemoryState; - DWORD m_MemoryStateSize; - //Initilizing and reseting information about the memory system - void AllocateSystemMemory ( void ); - void InitalizeSystem ( bool PostPif ); - void FixRDramSize ( void ); void FreeMemory ( void ); public: @@ -142,58 +99,16 @@ public: // CTransVaddr interface bool TranslateVaddr ( DWORD VAddr, DWORD &PAddr) const; - bool ValidVaddr ( DWORD VAddr ) const; - - - - - - - // Recompiler Memory - bool AllocateRecompilerMemory ( bool AllocateJumpTable ); - inline void ** GetJumpTable ( void ) const { return JumpTable; } - inline BYTE * GetRecompCode ( void ) const { return m_RecompCode; } - inline DWORD GetRecompBufferSize ( void ) const { return m_RecompSize; } - - void CheckRecompMem ( BYTE * RecompPos ); - -#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 ); - - inline DWORD RomFileSize ( void ) { return m_RomFileSize; } - - //Win32 exception handler - void MemoryFilterFailed ( char * FailureType, DWORD MipsAddress, DWORD x86Address, DWORD Value); - int SystemMemoryFilter ( DWORD dwExptCode, void * lpExceptionPointer ); - DWORD GetExceptionCodeFn ( void ); - void * GetExceptionInformationFn ( void ); - - - //Searching for value - enum SearchMemChangeState - { - SearchChangeState_Reset, - SearchChangeState_Changed, - SearchChangeState_Unchanged, - SearchChangeState_Greater, - SearchChangeState_Lessthan, - }; - - bool SearchSetBaseForChanges ( void ); - bool SearchForChanges ( SearchMemChangeState SearchType, MemorySize Size, - DWORD &StartAddress, DWORD &Len, - DWORD &OldValue, DWORD &NewValue ); - bool SearchForValue (DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len); -#endif + bool ValidVaddr ( DWORD VAddr ) const; // Labels LPCTSTR LabelName ( DWORD Address ) const; private: + static void RdramChanged ( CMipsMemoryVM * _this ); + static void ChangeSpStatus ( void ); + static void ChangeMiIntrMask ( void ); + 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 ); @@ -208,5 +123,3 @@ private: DWORD * m_TLB_ReadMap; DWORD * m_TLB_WriteMap; }; - -extern void ** JumpTable; diff --git a/Source/Project64/N64 System/Mips/Memory.cpp b/Source/Project64/N64 System/Mips/Memory.cpp index f8bc3300e..1577c4e3b 100644 --- a/Source/Project64/N64 System/Mips/Memory.cpp +++ b/Source/Project64/N64 System/Mips/Memory.cpp @@ -1,5118 +1 @@ -#include "stdafx.h" - -DWORD RegModValue; - -void ChangeSpStatus (void) { - if ( ( RegModValue & SP_CLR_HALT ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_HALT; } - if ( ( RegModValue & SP_SET_HALT ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_HALT; } - if ( ( RegModValue & SP_CLR_BROKE ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_BROKE; } - if ( ( RegModValue & SP_CLR_INTR ) != 0) { - _Reg->MI_INTR_REG &= ~MI_INTR_SP; - _Reg->CheckInterrupts(); - } -#ifndef EXTERNAL_RELEASE - if ( ( RegModValue & SP_SET_INTR ) != 0) { DisplayError("SP_SET_INTR"); } -#endif - if ( ( RegModValue & SP_CLR_SSTEP ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SSTEP; } - if ( ( RegModValue & SP_SET_SSTEP ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SSTEP; } - if ( ( RegModValue & SP_CLR_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_INTR_BREAK; } - if ( ( RegModValue & SP_SET_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_INTR_BREAK; } - if ( ( RegModValue & SP_CLR_SIG0 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG0; } - if ( ( RegModValue & SP_SET_SIG0 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG0; } - if ( ( RegModValue & SP_CLR_SIG1 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG1; } - if ( ( RegModValue & SP_SET_SIG1 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG1; } - if ( ( RegModValue & SP_CLR_SIG2 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG2; } - if ( ( RegModValue & SP_SET_SIG2 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG2; } - if ( ( RegModValue & SP_CLR_SIG3 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG3; } - if ( ( RegModValue & SP_SET_SIG3 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG3; } - if ( ( RegModValue & SP_CLR_SIG4 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG4; } - if ( ( RegModValue & SP_SET_SIG4 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG4; } - if ( ( RegModValue & SP_CLR_SIG5 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG5; } - if ( ( RegModValue & SP_SET_SIG5 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG5; } - if ( ( RegModValue & SP_CLR_SIG6 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG6; } - if ( ( RegModValue & SP_SET_SIG6 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG6; } - if ( ( RegModValue & SP_CLR_SIG7 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG7; } - if ( ( RegModValue & SP_SET_SIG7 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG7; } - - if ( ( RegModValue & SP_SET_SIG0 ) != 0 && g_AudioSignal) - { - _Reg->MI_INTR_REG |= MI_INTR_SP; - _Reg->CheckInterrupts(); - } - //if (*( DWORD *)(DMEM + 0xFC0) == 1) { - // ChangeTimer(RspTimer,0x40000); - //} else { - RunRsp(); - //} -} - -void ChangeMiIntrMask (void) { - if ( ( RegModValue & MI_INTR_MASK_CLR_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SP; } - if ( ( RegModValue & MI_INTR_MASK_SET_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SP; } - if ( ( RegModValue & MI_INTR_MASK_CLR_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SI; } - if ( ( RegModValue & MI_INTR_MASK_SET_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SI; } - if ( ( RegModValue & MI_INTR_MASK_CLR_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_AI; } - if ( ( RegModValue & MI_INTR_MASK_SET_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_AI; } - if ( ( RegModValue & MI_INTR_MASK_CLR_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_VI; } - if ( ( RegModValue & MI_INTR_MASK_SET_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_VI; } - if ( ( RegModValue & MI_INTR_MASK_CLR_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_PI; } - if ( ( RegModValue & MI_INTR_MASK_SET_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_PI; } - if ( ( RegModValue & MI_INTR_MASK_CLR_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_DP; } - if ( ( RegModValue & MI_INTR_MASK_SET_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_DP; } -} - -CMipsMemoryVM::CMipsMemoryVM ( CMipsMemory_CallBack * CallBack ) : - m_CBClass(CallBack), - m_TLB_ReadMap(NULL), - m_TLB_WriteMap(NULL), - m_RomMapped(false), - m_Rom(NULL), - m_RomSize(0), - m_RomWrittenTo(false), - m_RomWroteValue(0), -#ifdef toremove - CTLB(System,m_RDRAM,RegSet), -// CPIFRam(System->_Plugins,_Reg,Notify,SavesReadOnly), - _System(System), - _Rom2(CurrentRom), - _Reg(RegSet), -#endif - m_MemoryState(NULL), - m_MemoryStateSize(0) -{ - m_RDRAM = NULL; - m_DMEM = NULL; - m_IMEM = NULL; -#ifdef toremove -// m_Sram = NULL; -// m_FlashRam = NULL; -// m_SavesReadOnly = SavesReadOnly; -// m_WrittenToRom = false; -#endif - m_HalfLine = 0; - JumpTable = NULL; -// DelaySlotTable = NULL; - m_RecompCode = NULL; - m_RecompSize = 0; - //InitalizeSystem(true); -} - -CMipsMemoryVM::~CMipsMemoryVM (void) -{ - FreeMemory(); -} - -BOOL CMipsMemoryVM::Initialize ( void ) -{ - if (m_RDRAM != NULL) - { - return true; - } - - DWORD RdramMemorySize = 0x20000000; - if ((CPU_TYPE)_Settings->LoadDword(Game_CpuType) == CPU_SyncCores) - { - RdramMemorySize = 0x18000000; - } - - m_RDRAM = (unsigned char *) VirtualAlloc( NULL, RdramMemorySize, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ); - if( m_RDRAM == NULL ) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Reserve RDRAM (Size: 0x%X)",RdramMemorySize); - FreeMemory(); - return false; - } - - m_AllocatedRdramSize = _Settings->LoadDword(Game_RDRamSize); - if(VirtualAlloc(m_RDRAM, m_AllocatedRdramSize, MEM_COMMIT, PAGE_READWRITE)==NULL) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate RDRAM (Size: 0x%X)",m_AllocatedRdramSize); - FreeMemory(); - return false; - } - - if(VirtualAlloc(m_RDRAM + 0x04000000, 0x2000, MEM_COMMIT, PAGE_READWRITE)==NULL) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate DMEM/IMEM (Size: 0x%X)",0x2000); - FreeMemory(); - return false; - } - - m_DMEM = (unsigned char *)(m_RDRAM+0x04000000); - m_IMEM = (unsigned char *)(m_RDRAM+0x04001000); - - if (_Settings->LoadBool(Game_LoadRomToMemory)) - { - m_RomMapped = true; - m_Rom = m_RDRAM + 0x10000000; - m_RomSize = _Rom->GetRomSize(); - if(VirtualAlloc(m_Rom, _Rom->GetRomSize(), MEM_COMMIT, PAGE_READWRITE)==NULL) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate Rom (Size: 0x%X)",_Rom->GetRomSize()); - FreeMemory(); - return false; - } - memcpy(m_Rom,_Rom->GetRomAddress(),_Rom->GetRomSize()); - - DWORD OldProtect; - VirtualProtect(m_Rom,_Rom->GetRomSize(),PAGE_READONLY, &OldProtect); - } else { - m_RomMapped = false; - m_Rom = _Rom->GetRomAddress(); - m_RomSize = _Rom->GetRomSize(); - } - memset(m_PIF_Ram,0,sizeof(m_PIF_Ram)); - - m_TLB_ReadMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); - if (m_TLB_ReadMap == NULL) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate m_TLB_ReadMap (Size: 0x%X)",0xFFFFF * sizeof(DWORD)); - FreeMemory(); - return false; - } - - m_TLB_WriteMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); - if (m_TLB_WriteMap == NULL) - { - WriteTraceF(TraceError,"CMipsMemoryVM::Initialize:: Failed to Allocate m_TLB_ReadMap (Size: 0x%X)",0xFFFFF * sizeof(DWORD)); - FreeMemory(); - return false; - } - - memset(m_TLB_ReadMap,0,(0xFFFFF * sizeof(DWORD))); - memset(m_TLB_WriteMap,0,(0xFFFFF * sizeof(DWORD))); - for (DWORD count = 0x80000000; count < 0xC0000000; count += 0x1000) - { - m_TLB_ReadMap[count >> 12] = ((DWORD)m_RDRAM + (count & 0x1FFFFFFF)) - count; - m_TLB_WriteMap[count >> 12] = ((DWORD)m_RDRAM + (count & 0x1FFFFFFF)) - count; - } - - if (_Settings->LoadDword(Rdb_TLB_VAddrStart) != 0) - { - 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) { - m_TLB_ReadMap[count >> 12] = ((DWORD)m_RDRAM + (count - Start + PAddr)) - count; - m_TLB_WriteMap[count >> 12] = ((DWORD)m_RDRAM + (count - Start + PAddr)) - count; - } - } - - //TLB_Reset(true); - return true; -} - -void CMipsMemoryVM::FreeMemory ( void ) -{ - if (m_RDRAM) - { - VirtualFree( m_RDRAM, 0 , MEM_RELEASE); - m_RDRAM = NULL; - m_IMEM = NULL; - m_DMEM = NULL; - } - if (m_TLB_ReadMap) - { - VirtualFree( m_TLB_ReadMap, 0 , MEM_RELEASE); - m_TLB_ReadMap = NULL; - } - if (m_TLB_WriteMap) - { - VirtualFree( m_TLB_WriteMap, 0 , MEM_RELEASE); - m_TLB_WriteMap = NULL; - } - memset(m_PIF_Ram,0,sizeof(m_PIF_Ram)); -} - -BYTE * CMipsMemoryVM::Rdram ( void ) -{ - return m_RDRAM; -} - -DWORD CMipsMemoryVM::RdramSize ( void ) -{ - return m_AllocatedRdramSize; -} - -BYTE * CMipsMemoryVM::Dmem ( void ) -{ - return m_DMEM; -} - -BYTE * CMipsMemoryVM::Imem ( void ) -{ - return m_IMEM; -} - -BYTE * CMipsMemoryVM::PifRam ( void ) -{ - return m_PIF_Ram; -} - -#ifdef toremove -void CMipsMemoryVM::InitalizeSystem ( bool PostPif ) -{ - ROM = _Rom->GetRomAddress(); - m_RomFileSize = _Rom->GetRomSize(); - - AllocateSystemMemory(); - _Reg->InitalizeR4300iRegisters(this, PostPif, _Rom->GetCountry(), _Rom->CicChipID()); - if (PostPif) { - memcpy( (DMEM+0x40), (ROM + 0x040), 0xFBC); - } -} -#endif - -void CMipsMemoryVM::AllocateSystemMemory (void) -{ - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (m_RDRAM != NULL) - { - memset(PIF_Ram,0,sizeof(PIF_Ram)); - TLB_Reset(true); - return; - } - - DWORD RdramMemorySize = 0x20000000; - if ((CPU_TYPE)_Settings->LoadDword(Game_CpuType) == CPU_SyncCores) - { - RdramMemorySize = 0x18000000; - } - m_RDRAM = (unsigned char *) VirtualAlloc( NULL, RdramMemorySize, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ); - if(m_RDRAM==NULL) { - _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); - } - - m_AllocatedRdramSize = 0x00400000; - if(VirtualAlloc(m_RDRAM, m_AllocatedRdramSize, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); - } - - if(VirtualAlloc(m_RDRAM + 0x04000000, 0x2000, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); - } - - DMEM = (unsigned char *)(m_RDRAM+0x04000000); - IMEM = (unsigned char *)(m_RDRAM+0x04001000); - - if (_Settings->LoadBool(Game_LoadRomToMemory)) - { - if(VirtualAlloc(m_RDRAM + 0x10000000, m_RomFileSize, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); - } - memcpy(m_RDRAM + 0x10000000,ROM,m_RomFileSize); - ROM = (unsigned char *)(m_RDRAM+0x10000000); - _Rom->UnallocateRomImage(); - } - memset(PIF_Ram,0,sizeof(PIF_Ram)); - - m_TLB_ReadMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); - if (m_TLB_ReadMap == NULL) { - Notify().FatalError(MSG_MEM_ALLOC_ERROR); - } - - m_TLB_WriteMap = (DWORD *)VirtualAlloc(NULL,0xFFFFF * sizeof(DWORD),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); - if (m_TLB_WriteMap == NULL) { - Notify().FatalError(MSG_MEM_ALLOC_ERROR); - } - - - TLB_Reset(true); -#endif -} - -bool CMipsMemoryVM::AllocateRecompilerMemory ( bool AllocateJumpTable ) -{ - if (JumpTable) - { - VirtualFree( JumpTable, 0 , MEM_RELEASE); - } - JumpTable = NULL; - if (AllocateJumpTable) - { - DWORD JumpTableSize = _Settings->LoadDword(Game_LoadRomToMemory) ? 0x20000000 : 0x10000000; - JumpTable = (void **)VirtualAlloc( NULL, JumpTableSize, MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE ); - if( JumpTable == NULL ) { - _Notify->DisplayError(MSG_MEM_ALLOC_ERROR); - return FALSE; - } - - /* Jump Table */ - if(VirtualAlloc(JumpTable, m_AllocatedRdramSize, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->DisplayError(MSG_MEM_ALLOC_ERROR); - return FALSE; - } - - if(VirtualAlloc((BYTE *)JumpTable + 0x04000000, 0x2000, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->DisplayError(MSG_MEM_ALLOC_ERROR); - return FALSE; - } - - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (_Settings->LoadDword(Game_LoadRomToMemory)) - { - if(VirtualAlloc((BYTE *)JumpTable + 0x10000000, m_RomFileSize, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->DisplayError(MSG_MEM_ALLOC_ERROR); - return FALSE; - } - } -#endif - } - - /* Recomp code */ - if (m_RecompCode) - { - VirtualFree( m_RecompCode, 0 , MEM_RELEASE); - m_RecompSize = 0; - } - m_RecompSize = InitialCompileBufferSize; - m_RecompCode=(BYTE *) VirtualAlloc( NULL, MaxCompileBufferSize + 4, MEM_RESERVE|MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); - m_RecompCode=(BYTE *) VirtualAlloc( m_RecompCode, m_RecompSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - if(m_RecompCode==NULL) { - _Notify->DisplayError(MSG_MEM_ALLOC_ERROR); - return FALSE; - } - return true; -} - -void CMipsMemoryVM::CheckRecompMem( BYTE * RecompPos ) -{ - int Size = (int)((BYTE *)RecompPos - (BYTE *)m_RecompCode); - if ((Size + 0x20000) < m_RecompSize) - { - return; - } - if (m_RecompSize == MaxCompileBufferSize) - { - return; - } - LPVOID MemAddr = VirtualAlloc( m_RecompCode + m_RecompSize , IncreaseCompileBufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - m_RecompSize += IncreaseCompileBufferSize; - - if (MemAddr == NULL) { - _Notify->FatalError(MSG_MEM_ALLOC_ERROR); - } -} - -void CMipsMemoryVM::FixRDramSize ( void ) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (_Settings->LoadDword(Game_RDRamSize) != m_AllocatedRdramSize) { - if (m_AllocatedRdramSize == 0x400000) { - if (VirtualAlloc(m_RDRAM + 0x400000, 0x400000, MEM_COMMIT, PAGE_READWRITE)==NULL) { - _Notify->FatalError(GS(MSG_MEM_ALLOC_ERROR)); - } - m_AllocatedRdramSize = 0x800000; - } else { - VirtualFree(m_RDRAM + 0x400000, 0x400000,MEM_DECOMMIT); - m_AllocatedRdramSize = 0x400000; - } - } -#endif -} - -BOOL CMipsMemoryVM::LB_VAddr ( DWORD VAddr, BYTE & Value ) -{ - if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } - Value = *(BYTE *)(m_TLB_ReadMap[VAddr >> 12] + (VAddr ^ 3)); - return TRUE; -} - -BOOL CMipsMemoryVM::LH_VAddr ( DWORD VAddr, WORD & Value ) -{ - if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } - Value = *(WORD *)(m_TLB_ReadMap[VAddr >> 12] + (VAddr ^ 2)); - return TRUE; -} - -BOOL CMipsMemoryVM::LW_VAddr ( DWORD VAddr, DWORD & Value ) -{ - if (VAddr >= 0xA3F00000 && VAddr < 0xC0000000) - { - if (VAddr < 0xA4000000 || VAddr >= 0xA4002000) - { - VAddr &= 0x1FFFFFFF; - LW_NonMemory(VAddr,&Value); - return true; - } - } - BYTE * BaseAddress = (BYTE *)m_TLB_ReadMap[VAddr >> 12]; - if (BaseAddress == 0) { return FALSE; } - Value = *(DWORD *)(BaseAddress + VAddr); - -// if (LookUpMode == FuncFind_ChangeMemory) -// { -// BreakPoint(__FILE__,__LINE__); -// if ( (Command.Hex >> 16) == 0x7C7C) { -// Command.Hex = OrigMem[(Command.Hex & 0xFFFF)].OriginalValue; -// } -// } - return TRUE; - return false; -} - -BOOL CMipsMemoryVM::LD_VAddr ( DWORD VAddr, QWORD & Value ) -{ - if (m_TLB_ReadMap[VAddr >> 12] == 0) { return FALSE; } - *((DWORD *)(&Value) + 1) = *(DWORD *)(m_TLB_ReadMap[VAddr >> 12] + VAddr); - *((DWORD *)(&Value)) = *(DWORD *)(m_TLB_ReadMap[VAddr >> 12] + VAddr + 4); - return TRUE; -} - -BOOL CMipsMemoryVM::SB_VAddr ( DWORD VAddr, BYTE Value ) -{ - if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } - *(BYTE *)(m_TLB_WriteMap[VAddr >> 12] + (VAddr ^ 3)) = Value; - return TRUE; -} - -BOOL CMipsMemoryVM::SH_VAddr ( DWORD VAddr, WORD Value ) -{ - if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } - *(WORD *)(m_TLB_WriteMap[VAddr >> 12] + (VAddr ^ 2)) = Value; - return TRUE; -} - -BOOL CMipsMemoryVM::SW_VAddr ( DWORD VAddr, DWORD Value ) -{ - if (VAddr >= 0xA3F00000 && VAddr < 0xC0000000) - { - if (VAddr < 0xA4000000 || VAddr >= 0xA4002000) - { - VAddr &= 0x1FFFFFFF; - return SW_NonMemory(VAddr,Value); - } - } - if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } - *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr) = Value; - return TRUE; -} - - -BOOL CMipsMemoryVM::SD_VAddr ( DWORD VAddr, QWORD Value ) -{ - if (m_TLB_WriteMap[VAddr >> 12] == 0) { return FALSE; } - *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr) = *((DWORD *)(&Value) + 1); - *(DWORD *)(m_TLB_WriteMap[VAddr >> 12] + VAddr + 4) = *((DWORD *)(&Value)); - return TRUE; -} - -bool CMipsMemoryVM::ValidVaddr ( DWORD VAddr ) const -{ - return m_TLB_ReadMap[VAddr >> 12] != 0; -} - -bool CMipsMemoryVM::TranslateVaddr ( DWORD VAddr, DWORD &PAddr) const -{ - //Change the Virtual address to a Phyiscal Address - if (m_TLB_ReadMap[VAddr >> 12] == 0) { return false; } - PAddr = (DWORD)((BYTE *)(m_TLB_ReadMap[VAddr >> 12] + VAddr) - m_RDRAM); - return true; -} - -void CMipsMemoryVM::Compile_LB ( x86Reg Reg, DWORD VAddr, BOOL SignExtend) { - DWORD PAddr; - char VarName[100]; - - if (!TranslateVaddr(VAddr,PAddr)) { - MoveConstToX86reg(0,Reg); - CPU_Message("Compile_LB\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LB\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - case 0x10000000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - if (SignExtend) { - MoveSxVariableToX86regByte(PAddr + m_RDRAM,VarName,Reg); - } else { - MoveZxVariableToX86regByte(PAddr + m_RDRAM,VarName,Reg); - } - break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LB\nFailed to compile address: %X",VAddr); } - } -} - -void CMipsMemoryVM::Compile_LH ( x86Reg Reg, DWORD VAddr, BOOL SignExtend) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - MoveConstToX86reg(0,Reg); - CPU_Message("Compile_LH\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LH\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - case 0x10000000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - if (SignExtend) { - MoveSxVariableToX86regHalf(PAddr + m_RDRAM,VarName,Reg); - } else { - MoveZxVariableToX86regHalf(PAddr + m_RDRAM,VarName,Reg); - } - break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LHU\nFailed to compile address: %X",VAddr); } - } -} - -void CMipsMemoryVM::Compile_LW (x86Reg Reg, DWORD VAddr ) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - MoveConstToX86reg(0,Reg); - CPU_Message("Compile_LW\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address %X",VAddr); } - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - case 0x10000000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); - break; - case 0x04000000: - if (PAddr < 0x04002000) { - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); - break; - } - switch (PAddr) { - case 0x04040010: MoveVariableToX86reg(&_Reg->SP_STATUS_REG,"SP_STATUS_REG",Reg); break; - case 0x04040014: MoveVariableToX86reg(&_Reg->SP_DMA_FULL_REG,"SP_DMA_FULL_REG",Reg); break; - case 0x04040018: MoveVariableToX86reg(&_Reg->SP_DMA_BUSY_REG,"SP_DMA_BUSY_REG",Reg); break; - case 0x04080000: MoveVariableToX86reg(&_Reg->SP_PC_REG,"SP_PC_REG",Reg); break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04100000: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: MoveVariableToX86reg(&_Reg->MI_MODE_REG,"MI_MODE_REG",Reg); break; - case 0x04300004: MoveVariableToX86reg(&_Reg->MI_VERSION_REG,"MI_VERSION_REG",Reg); break; - case 0x04300008: MoveVariableToX86reg(&_Reg->MI_INTR_REG,"MI_INTR_REG",Reg); break; - case 0x0430000C: MoveVariableToX86reg(&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG",Reg); break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400010: - UpdateCounters(m_RegWorkingSet,false,true); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)this,x86_ECX); - Call_Direct(AddressOf(CMipsMemoryVM::UpdateHalfLine),"CMipsMemoryVM::UpdateHalfLine"); - AfterCallDirect(); - MoveVariableToX86reg(&m_HalfLine,"m_HalfLine",Reg); - break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04500000: /* AI registers */ - switch (PAddr) { - case 0x04500004: - if (_Settings->LoadBool(Game_FixedAudio)) - { - UpdateCounters(m_RegWorkingSet,false,true); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Audio,x86_ECX); - Call_Direct(AddressOf(CAudio::AiGetLength),"CAudio::AiGetLength"); - MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); - AfterCallDirect(); - MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); - } else { - if (_Plugins->Audio()->ReadLength != NULL) { - BeforeCallDirect(); - Call_Direct(_Plugins->Audio()->ReadLength,"AiReadLength"); - MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); - AfterCallDirect(); - MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); - } else { - MoveConstToX86reg(0,Reg); - } - } - break; - case 0x0450000C: - if (_Settings->LoadBool(Game_FixedAudio)) - { - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Audio,x86_ECX); - Call_Direct(AddressOf(CAudio::AiGetStatus),"AiGetStatus"); - MoveX86regToVariable(x86_EAX,&m_TempValue,"m_TempValue"); - AfterCallDirect(); - MoveVariableToX86reg(&m_TempValue,"m_TempValue",Reg); - } else { - MoveVariableToX86reg(&_Reg->AI_STATUS_REG,"AI_STATUS_REG",Reg); - } - break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600010: MoveVariableToX86reg(&_Reg->PI_STATUS_REG,"PI_STATUS_REG",Reg); break; - case 0x04600014: MoveVariableToX86reg(&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG",Reg); break; - case 0x04600018: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG",Reg); break; - case 0x0460001C: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG",Reg); break; - case 0x04600020: MoveVariableToX86reg(&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG",Reg); break; - case 0x04600024: MoveVariableToX86reg(&_Reg->PI_DOMAIN2_REG,"PI_DOMAIN2_REG",Reg); break; - case 0x04600028: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_PWD_REG,"PI_BSD_DOM2_PWD_REG",Reg); break; - case 0x0460002C: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_PGS_REG,"PI_BSD_DOM2_PGS_REG",Reg); break; - case 0x04600030: MoveVariableToX86reg(&_Reg->PI_BSD_DOM2_RLS_REG,"PI_BSD_DOM2_RLS_REG",Reg); break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04700000: - switch (PAddr) { - case 0x0470000C: MoveVariableToX86reg(&_Reg->RI_SELECT_REG,"RI_SELECT_REG",Reg); break; - case 0x04700010: MoveVariableToX86reg(&_Reg->RI_REFRESH_REG,"RI_REFRESH_REG",Reg); break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800018: MoveVariableToX86reg(&_Reg->SI_STATUS_REG,"SI_STATUS_REG",Reg); break; - default: - MoveConstToX86reg(0,Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); } - } - break; - case 0x1FC00000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveVariableToX86reg(PAddr + m_RDRAM,VarName,Reg); - break; - default: - MoveConstToX86reg(((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF),Reg); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { - CPU_Message("Compile_LW\nFailed to translate address: %X",VAddr); - DisplayError("Compile_LW\nFailed to translate address: %X",VAddr); - } - } -} - -void CMipsMemoryVM::Compile_SB_Const ( BYTE Value, DWORD VAddr ) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SB\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstByteToVariable(Value,PAddr + m_RDRAM,VarName); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB_Const\ntrying to store %X in %X?",Value,VAddr); } - } -} - -void CMipsMemoryVM::Compile_SB_Register ( x86Reg Reg, DWORD VAddr ) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SB\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regByteToVariable(Reg,PAddr + m_RDRAM,VarName); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SB_Register\ntrying to store in %X?",VAddr); } - } -} - -void CMipsMemoryVM::Compile_SH_Const ( WORD Value, DWORD VAddr ) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SH\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstHalfToVariable(Value,PAddr + m_RDRAM,VarName); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH_Const\ntrying to store %X in %X?",Value,VAddr); } - } -} - -void CMipsMemoryVM::Compile_SH_Register ( x86Reg Reg, DWORD VAddr ) { - char VarName[100]; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SH\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regHalfToVariable(Reg,PAddr + m_RDRAM,VarName); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SH_Register\ntrying to store in %X?",PAddr); } - } -} - -void CMipsMemoryVM::Compile_SW_Const ( DWORD Value, DWORD VAddr ) { - char VarName[100]; - BYTE * Jump; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SW\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); - break; - case 0x03F00000: - switch (PAddr) { - case 0x03F00000: MoveConstToVariable(Value,&_Reg->RDRAM_CONFIG_REG,"RDRAM_CONFIG_REG"); break; - case 0x03F00004: MoveConstToVariable(Value,&_Reg->RDRAM_DEVICE_ID_REG,"RDRAM_DEVICE_ID_REG"); break; - case 0x03F00008: MoveConstToVariable(Value,&_Reg->RDRAM_DELAY_REG,"RDRAM_DELAY_REG"); break; - case 0x03F0000C: MoveConstToVariable(Value,&_Reg->RDRAM_MODE_REG,"RDRAM_MODE_REG"); break; - case 0x03F00010: MoveConstToVariable(Value,&_Reg->RDRAM_REF_INTERVAL_REG,"RDRAM_REF_INTERVAL_REG"); break; - case 0x03F00014: MoveConstToVariable(Value,&_Reg->RDRAM_REF_ROW_REG,"RDRAM_REF_ROW_REG"); break; - case 0x03F00018: MoveConstToVariable(Value,&_Reg->RDRAM_RAS_INTERVAL_REG,"RDRAM_RAS_INTERVAL_REG"); break; - case 0x03F0001C: MoveConstToVariable(Value,&_Reg->RDRAM_MIN_INTERVAL_REG,"RDRAM_MIN_INTERVAL_REG"); break; - case 0x03F00020: MoveConstToVariable(Value,&_Reg->RDRAM_ADDR_SELECT_REG,"RDRAM_ADDR_SELECT_REG"); break; - case 0x03F00024: MoveConstToVariable(Value,&_Reg->RDRAM_DEVICE_MANUF_REG,"RDRAM_DEVICE_MANUF_REG"); break; - case 0x03F04004: break; - case 0x03F08004: break; - case 0x03F80004: break; - case 0x03F80008: break; - case 0x03F8000C: break; - case 0x03F80014: break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04000000: - if (PAddr < 0x04002000) { - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); - break; - } - switch (PAddr) { - case 0x04040000: MoveConstToVariable(Value,&_Reg->SP_MEM_ADDR_REG,"SP_MEM_ADDR_REG"); break; - case 0x04040004: MoveConstToVariable(Value,&_Reg->SP_DRAM_ADDR_REG,"SP_DRAM_ADDR_REG"); break; - case 0x04040008: - MoveConstToVariable(Value,&_Reg->SP_RD_LEN_REG,"SP_RD_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&SP_DMA_READ,"SP_DMA_READ"); - AfterCallDirect(); - break; - case 0x04040010: - { - DWORD ModValue; - ModValue = 0; - if ( ( Value & SP_CLR_HALT ) != 0 ) { ModValue |= SP_STATUS_HALT; } - if ( ( Value & SP_CLR_BROKE ) != 0 ) { ModValue |= SP_STATUS_BROKE; } - if ( ( Value & SP_CLR_SSTEP ) != 0 ) { ModValue |= SP_STATUS_SSTEP; } - if ( ( Value & SP_CLR_INTR_BREAK ) != 0 ) { ModValue |= SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_CLR_SIG0 ) != 0 ) { ModValue |= SP_STATUS_SIG0; } - if ( ( Value & SP_CLR_SIG1 ) != 0 ) { ModValue |= SP_STATUS_SIG1; } - if ( ( Value & SP_CLR_SIG2 ) != 0 ) { ModValue |= SP_STATUS_SIG2; } - if ( ( Value & SP_CLR_SIG3 ) != 0 ) { ModValue |= SP_STATUS_SIG3; } - if ( ( Value & SP_CLR_SIG4 ) != 0 ) { ModValue |= SP_STATUS_SIG4; } - if ( ( Value & SP_CLR_SIG5 ) != 0 ) { ModValue |= SP_STATUS_SIG5; } - if ( ( Value & SP_CLR_SIG6 ) != 0 ) { ModValue |= SP_STATUS_SIG6; } - if ( ( Value & SP_CLR_SIG7 ) != 0 ) { ModValue |= SP_STATUS_SIG7; } - if (ModValue != 0) { - AndConstToVariable(~ModValue,&_Reg->SP_STATUS_REG,"SP_STATUS_REG"); - } - - ModValue = 0; - if ( ( Value & SP_SET_HALT ) != 0 ) { ModValue |= SP_STATUS_HALT; } - if ( ( Value & SP_SET_SSTEP ) != 0 ) { ModValue |= SP_STATUS_SSTEP; } - if ( ( Value & SP_SET_INTR_BREAK ) != 0) { ModValue |= SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_SET_SIG0 ) != 0 ) { ModValue |= SP_STATUS_SIG0; } - if ( ( Value & SP_SET_SIG1 ) != 0 ) { ModValue |= SP_STATUS_SIG1; } - if ( ( Value & SP_SET_SIG2 ) != 0 ) { ModValue |= SP_STATUS_SIG2; } - if ( ( Value & SP_SET_SIG3 ) != 0 ) { ModValue |= SP_STATUS_SIG3; } - if ( ( Value & SP_SET_SIG4 ) != 0 ) { ModValue |= SP_STATUS_SIG4; } - if ( ( Value & SP_SET_SIG5 ) != 0 ) { ModValue |= SP_STATUS_SIG5; } - if ( ( Value & SP_SET_SIG6 ) != 0 ) { ModValue |= SP_STATUS_SIG6; } - if ( ( Value & SP_SET_SIG7 ) != 0 ) { ModValue |= SP_STATUS_SIG7; } - if (ModValue != 0) { - OrConstToVariable(ModValue,&_Reg->SP_STATUS_REG,"SP_STATUS_REG"); - } - if ( ( Value & SP_SET_SIG0 ) != 0 && _Settings->LoadBool(Game_RspAudioSignal) ) - { - OrConstToVariable(MI_INTR_SP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - } - if ( ( Value & SP_CLR_INTR ) != 0) { - AndConstToVariable(~MI_INTR_SP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - Call_Direct(RunRsp,"RunRsp"); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - } else { - BeforeCallDirect(); - Call_Direct(RunRsp,"RunRsp"); - AfterCallDirect(); - } - } - break; - case 0x0404001C: MoveConstToVariable(0,&_Reg->SP_SEMAPHORE_REG,"SP_SEMAPHORE_REG"); break; - case 0x04080000: MoveConstToVariable(Value & 0xFFC,&_Reg->SP_PC_REG,"SP_PC_REG"); break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: - { - DWORD ModValue; - ModValue = 0x7F; - if ( ( Value & MI_CLR_INIT ) != 0 ) { ModValue |= MI_MODE_INIT; } - if ( ( Value & MI_CLR_EBUS ) != 0 ) { ModValue |= MI_MODE_EBUS; } - if ( ( Value & MI_CLR_RDRAM ) != 0 ) { ModValue |= MI_MODE_RDRAM; } - if (ModValue != 0) { - AndConstToVariable(~ModValue,&_Reg->MI_MODE_REG,"MI_MODE_REG"); - } - - ModValue = (Value & 0x7F); - if ( ( Value & MI_SET_INIT ) != 0 ) { ModValue |= MI_MODE_INIT; } - if ( ( Value & MI_SET_EBUS ) != 0 ) { ModValue |= MI_MODE_EBUS; } - if ( ( Value & MI_SET_RDRAM ) != 0 ) { ModValue |= MI_MODE_RDRAM; } - if (ModValue != 0) { - OrConstToVariable(ModValue,&_Reg->MI_MODE_REG,"MI_MODE_REG"); - } - if ( ( Value & MI_CLR_DP_INTR ) != 0 ) { - AndConstToVariable(~MI_INTR_DP,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - } - } - break; - case 0x0430000C: - { - DWORD ModValue; - ModValue = 0; - if ( ( Value & MI_INTR_MASK_CLR_SP ) != 0 ) { ModValue |= MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_CLR_SI ) != 0 ) { ModValue |= MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_CLR_AI ) != 0 ) { ModValue |= MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_CLR_VI ) != 0 ) { ModValue |= MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_CLR_PI ) != 0 ) { ModValue |= MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_CLR_DP ) != 0 ) { ModValue |= MI_INTR_MASK_DP; } - if (ModValue != 0) { - AndConstToVariable(~ModValue,&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG"); - } - - ModValue = 0; - if ( ( Value & MI_INTR_MASK_SET_SP ) != 0 ) { ModValue |= MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_SET_SI ) != 0 ) { ModValue |= MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_SET_AI ) != 0 ) { ModValue |= MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_SET_VI ) != 0 ) { ModValue |= MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_SET_PI ) != 0 ) { ModValue |= MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_SET_DP ) != 0 ) { ModValue |= MI_INTR_MASK_DP; } - if (ModValue != 0) { - OrConstToVariable(ModValue,&_Reg->MI_INTR_MASK_REG,"MI_INTR_MASK_REG"); - } - } - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: - if (_Plugins->Gfx()->ViStatusChanged != NULL) { - CompConstToVariable(Value,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); - JeLabel8("Continue",0); - Jump = m_RecompPos - 1; - MoveConstToVariable(Value,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); - BeforeCallDirect(); - Call_Direct(_Plugins->Gfx()->ViStatusChanged,"ViStatusChanged"); - AfterCallDirect(); - CPU_Message(""); - CPU_Message(" Continue:"); - *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); - } - break; - case 0x04400004: MoveConstToVariable((Value & 0xFFFFFF),&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); break; - case 0x04400008: - if (_Plugins->Gfx()->ViWidthChanged != NULL) { - CompConstToVariable(Value,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); - JeLabel8("Continue",0); - Jump = m_RecompPos - 1; - MoveConstToVariable(Value,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); - BeforeCallDirect(); - Call_Direct(_Plugins->Gfx()->ViWidthChanged,"ViWidthChanged"); - AfterCallDirect(); - CPU_Message(""); - CPU_Message(" Continue:"); - *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); - } - break; - case 0x0440000C: MoveConstToVariable(Value,&_Reg->VI_INTR_REG,"VI_INTR_REG"); break; - case 0x04400010: - AndConstToVariable(~MI_INTR_VI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - case 0x04400014: MoveConstToVariable(Value,&_Reg->VI_BURST_REG,"VI_BURST_REG"); break; - case 0x04400018: MoveConstToVariable(Value,&_Reg->VI_V_SYNC_REG,"VI_V_SYNC_REG"); break; - case 0x0440001C: MoveConstToVariable(Value,&_Reg->VI_H_SYNC_REG,"VI_H_SYNC_REG"); break; - case 0x04400020: MoveConstToVariable(Value,&_Reg->VI_LEAP_REG,"VI_LEAP_REG"); break; - case 0x04400024: MoveConstToVariable(Value,&_Reg->VI_H_START_REG,"VI_H_START_REG"); break; - case 0x04400028: MoveConstToVariable(Value,&_Reg->VI_V_START_REG,"VI_V_START_REG"); break; - case 0x0440002C: MoveConstToVariable(Value,&_Reg->VI_V_BURST_REG,"VI_V_BURST_REG"); break; - case 0x04400030: MoveConstToVariable(Value,&_Reg->VI_X_SCALE_REG,"VI_X_SCALE_REG"); break; - case 0x04400034: MoveConstToVariable(Value,&_Reg->VI_Y_SCALE_REG,"VI_Y_SCALE_REG"); break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04500000: /* AI registers */ - switch (PAddr) { - case 0x04500000: MoveConstToVariable(Value,&_Reg->AI_DRAM_ADDR_REG,"AI_DRAM_ADDR_REG"); break; - case 0x04500004: - MoveConstToVariable(Value,&_Reg->AI_LEN_REG,"AI_LEN_REG"); - BeforeCallDirect(); - if (_Settings->LoadBool(Game_FixedAudio)) - { - X86BreakPoint(__FILE__,__LINE__); - MoveConstToX86reg((DWORD)Value,x86_EDX); - MoveConstToX86reg((DWORD)_Audio,x86_ECX); - Call_Direct(AddressOf(CAudio::AiSetLength),"AiSetLength"); - } - Call_Direct(_Plugins->Audio()->LenChanged,"AiLenChanged"); - AfterCallDirect(); - break; - case 0x04500008: MoveConstToVariable((Value & 1),&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); break; - case 0x0450000C: - /* Clear Interrupt */; - AndConstToVariable(~MI_INTR_AI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); -#ifdef tofix - if (!_Settings->LoadBool(Game_FixedAudio)) - { - AndConstToVariable(~MI_INTR_AI,&_Reg->m_AudioIntrReg,"m_AudioIntrReg"); - } -#endif - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - case 0x04500010: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); - break; - case 0x04500014: MoveConstToVariable(Value,&_Reg->AI_BITRATE_REG,"AI_BITRATE_REG"); break; - default: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveConstToVariable(Value,PAddr + m_RDRAM,VarName); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600000: MoveConstToVariable(Value,&_Reg->PI_DRAM_ADDR_REG,"PI_DRAM_ADDR_REG"); break; - case 0x04600004: MoveConstToVariable(Value,&_Reg->PI_CART_ADDR_REG,"PI_CART_ADDR_REG"); break; - case 0x04600008: - MoveConstToVariable(Value,&_Reg->PI_RD_LEN_REG,"PI_RD_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&PI_DMA_READ,"PI_DMA_READ"); - AfterCallDirect(); - break; - case 0x0460000C: - MoveConstToVariable(Value,&_Reg->PI_WR_LEN_REG,"PI_WR_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&PI_DMA_WRITE,"PI_DMA_WRITE"); - AfterCallDirect(); - break; - case 0x04600010: - if ((Value & PI_CLR_INTR) != 0 ) { - AndConstToVariable(~MI_INTR_PI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - } - break; - case 0x04600014: MoveConstToVariable((Value & 0xFF),&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); break; - case 0x04600018: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); break; - case 0x0460001C: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); break; - case 0x04600020: MoveConstToVariable((Value & 0xFF),&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700000: MoveConstToVariable(Value,&_Reg->RI_MODE_REG,"RI_MODE_REG"); break; - case 0x04700004: MoveConstToVariable(Value,&_Reg->RI_CONFIG_REG,"RI_CONFIG_REG"); break; - case 0x04700008: MoveConstToVariable(Value,&_Reg->RI_CURRENT_LOAD_REG,"RI_CURRENT_LOAD_REG"); break; - case 0x0470000C: MoveConstToVariable(Value,&_Reg->RI_SELECT_REG,"RI_SELECT_REG"); break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800000: MoveConstToVariable(Value,&_Reg->SI_DRAM_ADDR_REG,"SI_DRAM_ADDR_REG"); break; - case 0x04800004: - MoveConstToVariable(Value,&_Reg->SI_PIF_ADDR_RD64B_REG,"SI_PIF_ADDR_RD64B_REG"); - BeforeCallDirect(); - Call_Direct(&SI_DMA_READ,"SI_DMA_READ"); - AfterCallDirect(); - break; - case 0x04800010: - MoveConstToVariable(Value,&_Reg->SI_PIF_ADDR_WR64B_REG,"SI_PIF_ADDR_WR64B_REG"); - BeforeCallDirect(); - Call_Direct(&SI_DMA_WRITE,"SI_DMA_WRITE"); - AfterCallDirect(); - break; - case 0x04800018: - AndConstToVariable(~MI_INTR_SI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - AndConstToVariable(~SI_STATUS_INTERRUPT,&_Reg->SI_STATUS_REG,"SI_STATUS_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Const\ntrying to store %X in %X?",Value,VAddr); } - } -} - -void CMipsMemoryVM::Compile_SW_Register (x86Reg Reg, DWORD VAddr ) -{ - char VarName[100]; - BYTE * Jump; - DWORD PAddr; - - if (!TranslateVaddr(VAddr, PAddr)) { - CPU_Message("Compile_SW_Register\nFailed to translate address %X",VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\nFailed to translate address %X",VAddr); } - return; - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - break; - case 0x04000000: - switch (PAddr) { - case 0x04040000: MoveX86regToVariable(Reg,&_Reg->SP_MEM_ADDR_REG,"SP_MEM_ADDR_REG"); break; - case 0x04040004: MoveX86regToVariable(Reg,&_Reg->SP_DRAM_ADDR_REG,"SP_DRAM_ADDR_REG"); break; - case 0x04040008: - MoveX86regToVariable(Reg,&_Reg->SP_RD_LEN_REG,"SP_RD_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&SP_DMA_READ,"SP_DMA_READ"); - AfterCallDirect(); - break; - case 0x0404000C: - MoveX86regToVariable(Reg,&_Reg->SP_WR_LEN_REG,"SP_WR_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&SP_DMA_WRITE,"SP_DMA_WRITE"); - AfterCallDirect(); - break; - case 0x04040010: - MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); - BeforeCallDirect(); - Call_Direct(ChangeSpStatus,"ChangeSpStatus"); - AfterCallDirect(); - break; - case 0x0404001C: MoveConstToVariable(0,&_Reg->SP_SEMAPHORE_REG,"SP_SEMAPHORE_REG"); break; - case 0x04080000: - MoveX86regToVariable(Reg,&_Reg->SP_PC_REG,"SP_PC_REG"); - AndConstToVariable(0xFFC,&_Reg->SP_PC_REG,"SP_PC_REG"); - break; - default: - if (PAddr < 0x04002000) { - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - } else { - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - } - break; - case 0x04100000: - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - case 0x04300000: - switch (PAddr) { - case 0x04300000: - MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); - BeforeCallDirect(); - Call_Direct(ChangeMiIntrMask,"ChangeMiModeReg"); - AfterCallDirect(); - break; - case 0x0430000C: - MoveX86regToVariable(Reg,&RegModValue,"RegModValue"); - BeforeCallDirect(); - Call_Direct(ChangeMiIntrMask,"ChangeMiIntrMask"); - AfterCallDirect(); - break; - default: - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: - if (_Plugins->Gfx()->ViStatusChanged != NULL) { - CompX86regToVariable(Reg,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); - JeLabel8("Continue",0); - Jump = m_RecompPos - 1; - MoveX86regToVariable(Reg,&_Reg->VI_STATUS_REG,"VI_STATUS_REG"); - BeforeCallDirect(); - Call_Direct(_Plugins->Gfx()->ViStatusChanged,"ViStatusChanged"); - AfterCallDirect(); - CPU_Message(""); - CPU_Message(" Continue:"); - *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); - } - break; - case 0x04400004: - MoveX86regToVariable(Reg,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); - AndConstToVariable(0xFFFFFF,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); - break; - case 0x04400008: - if (_Plugins->Gfx()->ViWidthChanged != NULL) { - CompX86regToVariable(Reg,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); - JeLabel8("Continue",0); - Jump = m_RecompPos - 1; - MoveX86regToVariable(Reg,&_Reg->VI_WIDTH_REG,"VI_WIDTH_REG"); - BeforeCallDirect(); - Call_Direct(_Plugins->Gfx()->ViWidthChanged,"ViWidthChanged"); - AfterCallDirect(); - CPU_Message(""); - CPU_Message(" Continue:"); - *((BYTE *)(Jump))=(BYTE)(m_RecompPos - Jump - 1); - } - break; - case 0x0440000C: MoveX86regToVariable(Reg,&_Reg->VI_INTR_REG,"VI_INTR_REG"); break; - case 0x04400010: - AndConstToVariable(~MI_INTR_VI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - case 0x04400014: MoveX86regToVariable(Reg,&_Reg->VI_BURST_REG,"VI_BURST_REG"); break; - case 0x04400018: MoveX86regToVariable(Reg,&_Reg->VI_V_SYNC_REG,"VI_V_SYNC_REG"); break; - case 0x0440001C: MoveX86regToVariable(Reg,&_Reg->VI_H_SYNC_REG,"VI_H_SYNC_REG"); break; - case 0x04400020: MoveX86regToVariable(Reg,&_Reg->VI_LEAP_REG,"VI_LEAP_REG"); break; - case 0x04400024: MoveX86regToVariable(Reg,&_Reg->VI_H_START_REG,"VI_H_START_REG"); break; - case 0x04400028: MoveX86regToVariable(Reg,&_Reg->VI_V_START_REG,"VI_V_START_REG"); break; - case 0x0440002C: MoveX86regToVariable(Reg,&_Reg->VI_V_BURST_REG,"VI_V_BURST_REG"); break; - case 0x04400030: MoveX86regToVariable(Reg,&_Reg->VI_X_SCALE_REG,"VI_X_SCALE_REG"); break; - case 0x04400034: MoveX86regToVariable(Reg,&_Reg->VI_Y_SCALE_REG,"VI_Y_SCALE_REG"); break; - default: - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - break; - case 0x04500000: /* AI registers */ - switch (PAddr) { - case 0x04500000: MoveX86regToVariable(Reg,&_Reg->AI_DRAM_ADDR_REG,"AI_DRAM_ADDR_REG"); break; - case 0x04500004: - UpdateCounters(m_RegWorkingSet,false,true); - MoveX86regToVariable(Reg,&_Reg->AI_LEN_REG,"AI_LEN_REG"); - BeforeCallDirect(); - if (_Settings->LoadBool(Game_FixedAudio)) - { - MoveConstToX86reg((DWORD)_Audio,x86_ECX); - Call_Direct(AddressOf(CAudio::AiSetLength),"AiSetLength"); - } - Call_Direct(_Plugins->Audio()->LenChanged,"AiLenChanged"); - AfterCallDirect(); - break; - case 0x04500008: - MoveX86regToVariable(Reg,&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); - AndConstToVariable(1,&_Reg->AI_CONTROL_REG,"AI_CONTROL_REG"); - case 0x0450000C: - /* Clear Interrupt */; - AndConstToVariable(~MI_INTR_AI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - AndConstToVariable(~MI_INTR_AI,&_Reg->m_AudioIntrReg,"m_AudioIntrReg"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - case 0x04500010: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - break; - case 0x04500014: MoveX86regToVariable(Reg,&_Reg->AI_BITRATE_REG,"AI_BITRATE_REG"); break; - default: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600000: MoveX86regToVariable(Reg,&_Reg->PI_DRAM_ADDR_REG,"PI_DRAM_ADDR_REG"); break; - case 0x04600004: MoveX86regToVariable(Reg,&_Reg->PI_CART_ADDR_REG,"PI_CART_ADDR_REG"); break; - case 0x04600008: - MoveX86regToVariable(Reg,&_Reg->PI_RD_LEN_REG,"PI_RD_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&PI_DMA_READ,"PI_DMA_READ"); - AfterCallDirect(); - break; - case 0x0460000C: - MoveX86regToVariable(Reg,&_Reg->PI_WR_LEN_REG,"PI_WR_LEN_REG"); - BeforeCallDirect(); - Call_Direct(&PI_DMA_WRITE,"PI_DMA_WRITE"); - AfterCallDirect(); - break; - case 0x04600010: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - AndConstToVariable(~MI_INTR_PI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - MoveX86regToVariable(Reg,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); - AndConstToVariable(0xFFFFFF,&_Reg->VI_ORIGIN_REG,"VI_ORIGIN_REG"); - case 0x04600014: - MoveX86regToVariable(Reg,&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); - AndConstToVariable(0xFF,&_Reg->PI_DOMAIN1_REG,"PI_DOMAIN1_REG"); - break; - case 0x04600018: - MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); - AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_PWD_REG,"PI_BSD_DOM1_PWD_REG"); - break; - case 0x0460001C: - MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); - AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_PGS_REG,"PI_BSD_DOM1_PGS_REG"); - break; - case 0x04600020: - MoveX86regToVariable(Reg,&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); - AndConstToVariable(0xFF,&_Reg->PI_BSD_DOM1_RLS_REG,"PI_BSD_DOM1_RLS_REG"); - break; - default: - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700010: MoveX86regToVariable(Reg,&_Reg->RI_REFRESH_REG,"RI_REFRESH_REG"); break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800000: MoveX86regToVariable(Reg,&_Reg->SI_DRAM_ADDR_REG,"SI_DRAM_ADDR_REG"); break; - case 0x04800004: - MoveX86regToVariable(Reg,&_Reg->SI_PIF_ADDR_RD64B_REG,"SI_PIF_ADDR_RD64B_REG"); - BeforeCallDirect(); - Call_Direct(&SI_DMA_READ,"SI_DMA_READ"); - AfterCallDirect(); - break; - case 0x04800010: - MoveX86regToVariable(Reg,&_Reg->SI_PIF_ADDR_WR64B_REG,"SI_PIF_ADDR_WR64B_REG"); - BeforeCallDirect(); - Call_Direct(&SI_DMA_WRITE,"SI_DMA_WRITE"); - AfterCallDirect(); - break; - case 0x04800018: - AndConstToVariable(~MI_INTR_SI,&_Reg->MI_INTR_REG,"MI_INTR_REG"); - AndConstToVariable(~SI_STATUS_INTERRUPT,&_Reg->SI_STATUS_REG,"SI_STATUS_REG"); - BeforeCallDirect(); - MoveConstToX86reg((DWORD)_Reg,x86_ECX); - Call_Direct(AddressOf(CRegisters::CheckInterrupts),"CRegisters::CheckInterrupts"); - AfterCallDirect(); - break; - default: - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store at %X?",VAddr); } - } - break; - case 0x1FC00000: - sprintf(VarName,"m_RDRAM + %X",PAddr); - MoveX86regToVariable(Reg,PAddr + m_RDRAM,VarName); - break; - default: - CPU_Message(" Should be moving %s in to %X ?!?",x86_Name(Reg),VAddr); - if (_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { DisplayError("Compile_SW_Register\ntrying to store in %X?",VAddr); } - } -} - -void CMipsMemoryVM::ResetMemoryStack ( void) -{ - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - x86Reg Reg, TempReg; - - CPU_Message(" ResetMemoryStack"); - x86reg = Map_MemoryStack(Section, x86_Any, false); - if (x86reg >= 0) { UnMap_X86reg(Section,x86reg); } - - x86reg = Map_TempReg(x86_Any, 29, FALSE); - if (_Settings->LoadBool(Game_UseTlb)) - { - TempReg = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(x86reg,TempReg); - ShiftRightUnsignImmed(TempReg,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg,TempReg,4); - AddX86RegToX86Reg(x86reg,TempReg); - } else { - AndConstToX86Reg(x86reg,0x1FFFFFFF); - AddConstToX86Reg(x86reg,(DWORD)m_RDRAM); - } - MoveX86regToVariable(x86reg, g_MemoryStack, "MemoryStack"); -#endif -} - -int CMipsMemoryVM::MemoryFilter( DWORD dwExptCode, void * lpExceptionPointer ) -{ - if (dwExptCode != EXCEPTION_ACCESS_VIOLATION) - { - return EXCEPTION_CONTINUE_SEARCH; - } - - //convert the pointer since we are not having win32 stuctures in headers - LPEXCEPTION_POINTERS lpEP = (LPEXCEPTION_POINTERS)lpExceptionPointer; - - DWORD MemAddress = (char *)lpEP->ExceptionRecord->ExceptionInformation[1] - (char *)_MMU->Rdram(); - if ((int)(MemAddress) < 0 || MemAddress > 0x1FFFFFFF) - { - return EXCEPTION_CONTINUE_SEARCH; - } - - DWORD * Reg; - - BYTE * TypePos = (unsigned char *)lpEP->ContextRecord->Eip; - EXCEPTION_RECORD exRec = *lpEP->ExceptionRecord; - - if (*TypePos == 0xF3 && *(TypePos + 1) == 0xA5) { - DWORD Start, End; - Start = (lpEP->ContextRecord->Edi - (DWORD)m_RDRAM); - End = (Start + (lpEP->ContextRecord->Ecx << 2) - 1); - if ((int)Start < 0) { -#ifndef EXTERNAL_RELEASE - DisplayError("hmmm.... where does this dma start ?"); -#endif - return EXCEPTION_CONTINUE_SEARCH; - } -#ifdef CFB_READ - DWORD count, OldProtect; - if (Start >= CFBStart && End < CFBEnd) { - for ( count = Start; count < End; count += 0x1000 ) { - VirtualProtect(m_RDRAM+count,4,PAGE_READONLY, &OldProtect); - if (FrameBufferRead) { FrameBufferRead(count & ~0xFFF); } - } - return EXCEPTION_CONTINUE_EXECUTION; - } -#endif - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if ((int)End < RdramSize) { - for ( count = Start; count < End; count += 0x1000 ) { - BreakPoint(__FILE__,__LINE__); - if (N64_Blocks.NoOfRDRamBlocks[(count >> 12)] > 0) { - N64_Blocks.NoOfRDRamBlocks[(count >> 12)] = 0; - memset(JumpTable + ((count & 0x00FFFFF0) >> 2),0,0x1000); - *(DelaySlotTable + count) = NULL; - if (VirtualProtect(m_RDRAM + count, 4, PAGE_READWRITE, &OldProtect) == 0) { -#ifndef EXTERNAL_RELEASE - DisplayError("Failed to unprotect %X\n1", count); -#endif - } - } - } - return EXCEPTION_CONTINUE_EXECUTION; - } - if (Start >= 0x04000000 && End < 0x04001000) { - BreakPoint(__FILE__,__LINE__); - N64_Blocks.NoOfDMEMBlocks = 0; - memset(JumpTable + (0x04000000 >> 2),0,0x1000); - *(DelaySlotTable + (0x04000000 >> 12)) = NULL; - if (VirtualProtect(m_RDRAM + 0x04000000, 4, PAGE_READWRITE, &OldProtect) == 0) { -#ifndef EXTERNAL_RELEASE - DisplayError("Failed to unprotect %X\n7", 0x04000000); -#endif - } - return EXCEPTION_CONTINUE_EXECUTION; - } - if (Start >= 0x04001000 && End < 0x04002000) { - BreakPoint(__FILE__,__LINE__); - N64_Blocks.NoOfIMEMBlocks = 0; - memset(JumpTable + (0x04001000 >> 2),0,0x1000); - *(DelaySlotTable + (0x04001000 >> 12)) = NULL; - if (VirtualProtect(m_RDRAM + 0x04001000, 4, PAGE_READWRITE, &OldProtect) == 0) { -#ifndef EXTERNAL_RELEASE - DisplayError("Failed to unprotect %X\n6", 0x04001000); -#endif - } - return EXCEPTION_CONTINUE_EXECUTION; - } -#ifndef EXTERNAL_RELEASE - DisplayError("hmmm.... where does this dma End ?\nstart: %X\nend:%X\nlocation %X", - Start,End,lpEP->ContextRecord->Eip); -#endif -#endif - return EXCEPTION_CONTINUE_SEARCH; - } - - BYTE * ReadPos; - if (*TypePos == 0x0F && *(TypePos + 1) == 0xB6) { - ReadPos = TypePos + 2; - } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xB7) { - ReadPos = TypePos + 2; - } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xBE) { - ReadPos = TypePos + 2; - } else if (*TypePos == 0x0F && *(TypePos + 1) == 0xBF) { - ReadPos = TypePos + 2; - } else if (*TypePos == 0x66) { - ReadPos = TypePos + 2; - } else { - ReadPos = TypePos + 1; - } - - switch ((*ReadPos & 0x38)) { - case 0x00: Reg = &lpEP->ContextRecord->Eax; break; - case 0x08: Reg = &lpEP->ContextRecord->Ecx; break; - case 0x10: Reg = &lpEP->ContextRecord->Edx; break; - case 0x18: Reg = &lpEP->ContextRecord->Ebx; break; - case 0x20: Reg = &lpEP->ContextRecord->Esp; break; - case 0x28: Reg = &lpEP->ContextRecord->Ebp; break; - case 0x30: Reg = &lpEP->ContextRecord->Esi; break; - case 0x38: Reg = &lpEP->ContextRecord->Edi; break; - } - - switch ((*ReadPos & 0xC7)) { - case 0: ReadPos += 1; break; - case 1: ReadPos += 1; break; - case 2: ReadPos += 1; break; - case 3: ReadPos += 1; break; - case 4: - ReadPos += 1; - switch ((*ReadPos & 0xC7)) { - case 0: ReadPos += 1; break; - case 1: ReadPos += 1; break; - case 2: ReadPos += 1; break; - case 3: ReadPos += 1; break; - case 6: ReadPos += 1; break; - case 7: ReadPos += 1; break; - default: - BreakPoint(__FILE__,__LINE__); - } - break; - case 5: ReadPos += 5; break; - case 6: ReadPos += 1; break; - case 7: ReadPos += 1; break; - case 0x40: ReadPos += 2; break; - case 0x41: ReadPos += 2; break; - case 0x42: ReadPos += 2; break; - case 0x43: ReadPos += 2; break; - case 0x46: ReadPos += 2; break; - case 0x47: ReadPos += 2; break; - case 0x80: ReadPos += 5; break; - case 0x81: ReadPos += 5; break; - case 0x82: ReadPos += 5; break; - case 0x83: ReadPos += 5; break; - case 0x86: ReadPos += 5; break; - case 0x87: ReadPos += 5; break; - default: - DisplayError("Unknown x86 opcode %X\nlocation %X\nloc: %X\nfgh2", - *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); - return EXCEPTION_CONTINUE_SEARCH; - } - - switch(*TypePos) { - case 0x0F: - switch(*(TypePos + 1)) { - case 0xB6: - if (!LB_NonMemory(MemAddress,(DWORD *)Reg,FALSE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xB7: - if (!LH_NonMemory(MemAddress,(DWORD *)Reg,FALSE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load half word\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xBE: - if (!LB_NonMemory(MemAddress,Reg,TRUE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xBF: - if (!LH_NonMemory(MemAddress,Reg,TRUE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load half word\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - default: - DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", - *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); - return EXCEPTION_CONTINUE_SEARCH; - } - break; - case 0x66: - switch(*(TypePos + 1)) { - case 0x8B: - if (!LH_NonMemory(MemAddress,Reg,FALSE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to half word\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0x89: - if (!SH_NonMemory(MemAddress,*(WORD *)Reg)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store half word\n\nMIPS Address: %X\nX86 Address",MemAddress, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xC7: - if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!SH_NonMemory(MemAddress,*(WORD *)ReadPos)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store half word\n\nMIPS Address: %X\nX86 Address",MemAddress, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 2); - return EXCEPTION_CONTINUE_EXECUTION; - default: - DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", - *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); - return EXCEPTION_CONTINUE_SEARCH; - } - break; - case 0x88: - if (!SB_NonMemory(MemAddress,*(BYTE *)Reg)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store byte\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0x8A: - if (!LB_NonMemory(MemAddress,Reg,FALSE)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load byte\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0x8B: - if (!LW_NonMemory(MemAddress,Reg)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to load word\n\nMIPS Address: %X\nX86 Address", - (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0x89: - if (!SW_NonMemory(MemAddress,*(DWORD *)Reg)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store word\n\nMIPS Address: %X\nX86 Address",MemAddress, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)ReadPos; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xC6: - if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!SB_NonMemory(MemAddress,*(BYTE *)ReadPos)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store byte\n\nMIPS Address: %X\nX86 Address",MemAddress, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 1); - return EXCEPTION_CONTINUE_EXECUTION; - case 0xC7: - if (Reg != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!SW_NonMemory(MemAddress,*(DWORD *)ReadPos)) { - if (_Settings->LoadDword(Debugger_ShowUnhandledMemory)) { - DisplayError("Failed to store word\n\nMIPS Address: %X\nX86 Address",MemAddress, - *(unsigned char *)lpEP->ContextRecord->Eip); - } - } - lpEP->ContextRecord->Eip = (DWORD)(ReadPos + 4); - return EXCEPTION_CONTINUE_EXECUTION; - default: - DisplayError("Unkown x86 opcode %X\nlocation %X\nloc: %X\nfhfgh2", - *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, (char *)exRec.ExceptionInformation[1] - (char *)m_RDRAM); - return EXCEPTION_CONTINUE_SEARCH; - } - return EXCEPTION_CONTINUE_SEARCH; -} - -int CMipsMemoryVM::LB_NonMemory ( DWORD PAddr, DWORD * Value, BOOL SignExtend ) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (PAddr >= 0x10000000 && PAddr < 0x16000000) { - if (WrittenToRom) { return FALSE; } - if ((PAddr & 2) == 0) { PAddr = (PAddr + 4) ^ 2; } - if ((PAddr - 0x10000000) < RomFileSize) { - if (SignExtend) { - *Value = (int)((char)ROM[PAddr - 0x10000000]); - } else { - *Value = ROM[PAddr - 0x10000000]; - } - return TRUE; - } else { - *Value = 0; - return FALSE; - } - } -#endif -// switch (PAddr & 0xFFF00000) { -// default: - * Value = 0; - return FALSE; -// break; -// } -// return TRUE; -} - -int CMipsMemoryVM::LH_NonMemory ( DWORD PAddr, DWORD * Value, int SignExtend ) { -// switch (PAddr & 0xFFF00000) { -// default: - * Value = 0; - return FALSE; -// break; -// } -// return TRUE; -} - -int CMipsMemoryVM::LW_NonMemory ( DWORD PAddr, DWORD * Value ) { -#ifdef CFB_READ - if (PAddr >= CFBStart && PAddr < CFBEnd) { - DWORD OldProtect; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READONLY, &OldProtect); - if (FrameBufferRead) { FrameBufferRead(PAddr & ~0xFFF); } - *Value = *(DWORD *)(m_RDRAM+PAddr); - return TRUE; - } -#endif - if (PAddr >= 0x10000000 && PAddr < 0x16000000) - { - if (m_RomWrittenTo) - { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - *Value = WroteToRom; - //LogMessage("%X: Read crap from Rom %X from %X",PROGRAM_COUNTER,*Value,PAddr); - WrittenToRom = FALSE; -#ifdef ROM_IN_MAPSPACE - { - DWORD OldProtect; - VirtualProtect(ROM,RomFileSize,PAGE_READONLY, &OldProtect); - } -#endif -#endif - return TRUE; - } - if ((PAddr - 0x10000000) < m_RomSize) { - *Value = *(DWORD *)&m_Rom[PAddr - 0x10000000]; - return TRUE; - } else { - *Value = PAddr & 0xFFFF; - *Value = (*Value << 16) | *Value; - return FALSE; - } - } - - switch (PAddr & 0xFFF00000) { - case 0x03F00000: - switch (PAddr) { - case 0x03F00000: * Value = _Reg->RDRAM_CONFIG_REG; break; - case 0x03F00004: * Value = _Reg->RDRAM_DEVICE_ID_REG; break; - case 0x03F00008: * Value = _Reg->RDRAM_DELAY_REG; break; - case 0x03F0000C: * Value = _Reg->RDRAM_MODE_REG; break; - case 0x03F00010: * Value = _Reg->RDRAM_REF_INTERVAL_REG; break; - case 0x03F00014: * Value = _Reg->RDRAM_REF_ROW_REG; break; - case 0x03F00018: * Value = _Reg->RDRAM_RAS_INTERVAL_REG; break; - case 0x03F0001C: * Value = _Reg->RDRAM_MIN_INTERVAL_REG; break; - case 0x03F00020: * Value = _Reg->RDRAM_ADDR_SELECT_REG; break; - case 0x03F00024: * Value = _Reg->RDRAM_DEVICE_MANUF_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04000000: - switch (PAddr) { - case 0x04040010: *Value = _Reg->SP_STATUS_REG; break; - case 0x04040014: *Value = _Reg->SP_DMA_FULL_REG; break; - case 0x04040018: *Value = _Reg->SP_DMA_BUSY_REG; break; - case 0x04080000: *Value = _Reg->SP_PC_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04100000: - switch (PAddr) { - case 0x0410000C: *Value = _Reg->DPC_STATUS_REG; break; - case 0x04100010: *Value = _Reg->DPC_CLOCK_REG; break; - case 0x04100014: *Value = _Reg->DPC_BUFBUSY_REG; break; - case 0x04100018: *Value = _Reg->DPC_PIPEBUSY_REG; break; - case 0x0410001C: *Value = _Reg->DPC_TMEM_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: * Value = _Reg->MI_MODE_REG; break; - case 0x04300004: * Value = _Reg->MI_VERSION_REG; break; - case 0x04300008: * Value = _Reg->MI_INTR_REG; break; - case 0x0430000C: * Value = _Reg->MI_INTR_MASK_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: *Value = _Reg->VI_STATUS_REG; break; - case 0x04400004: *Value = _Reg->VI_ORIGIN_REG; break; - case 0x04400008: *Value = _Reg->VI_WIDTH_REG; break; - case 0x0440000C: *Value = _Reg->VI_INTR_REG; break; - case 0x04400010: - UpdateHalfLine(); - *Value = m_HalfLine; - break; - case 0x04400014: *Value = _Reg->VI_BURST_REG; break; - case 0x04400018: *Value = _Reg->VI_V_SYNC_REG; break; - case 0x0440001C: *Value = _Reg->VI_H_SYNC_REG; break; - case 0x04400020: *Value = _Reg->VI_LEAP_REG; break; - case 0x04400024: *Value = _Reg->VI_H_START_REG; break; - case 0x04400028: *Value = _Reg->VI_V_START_REG ; break; - case 0x0440002C: *Value = _Reg->VI_V_BURST_REG; break; - case 0x04400030: *Value = _Reg->VI_X_SCALE_REG; break; - case 0x04400034: *Value = _Reg->VI_Y_SCALE_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04500000: - switch (PAddr) { - case 0x04500004: - if (_Settings->LoadBool(Game_FixedAudio)) - { - *Value = _Audio->AiGetLength(); - } else { - if (_Plugins->Audio()->ReadLength != NULL) { - *Value = _Plugins->Audio()->ReadLength(); - } else { - *Value = 0; - } - } - break; - case 0x0450000C: - if (_Settings->LoadBool(Game_FixedAudio)) - { - *Value = _Audio->AiGetStatus(); - } else { - *Value = _Reg->AI_STATUS_REG; - } - break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600010: *Value = _Reg->PI_STATUS_REG; break; - case 0x04600014: *Value = _Reg->PI_DOMAIN1_REG; break; - case 0x04600018: *Value = _Reg->PI_BSD_DOM1_PWD_REG; break; - case 0x0460001C: *Value = _Reg->PI_BSD_DOM1_PGS_REG; break; - case 0x04600020: *Value = _Reg->PI_BSD_DOM1_RLS_REG; break; - case 0x04600024: *Value = _Reg->PI_DOMAIN2_REG; break; - case 0x04600028: *Value = _Reg->PI_BSD_DOM2_PWD_REG; break; - case 0x0460002C: *Value = _Reg->PI_BSD_DOM2_PGS_REG; break; - case 0x04600030: *Value = _Reg->PI_BSD_DOM2_RLS_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700000: * Value = _Reg->RI_MODE_REG; break; - case 0x04700004: * Value = _Reg->RI_CONFIG_REG; break; - case 0x04700008: * Value = _Reg->RI_CURRENT_LOAD_REG; break; - case 0x0470000C: * Value = _Reg->RI_SELECT_REG; break; - case 0x04700010: * Value = _Reg->RI_REFRESH_REG; break; - case 0x04700014: * Value = _Reg->RI_LATENCY_REG; break; - case 0x04700018: * Value = _Reg->RI_RERROR_REG; break; - case 0x0470001C: * Value = _Reg->RI_WERROR_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800018: *Value = _Reg->SI_STATUS_REG; break; - default: - *Value = 0; - return FALSE; - } - break; - case 0x05000000: - *Value = PAddr & 0xFFFF; - *Value = (*Value << 16) | *Value; - return FALSE; - case 0x08000000: - if (g_SaveUsing == SaveChip_Auto) { g_SaveUsing = SaveChip_FlashRam; } - if (g_SaveUsing != SaveChip_FlashRam) { - *Value = PAddr & 0xFFFF; - *Value = (*Value << 16) | *Value; - return FALSE; - } - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - *Value = ReadFromFlashStatus(PAddr); -#endif - break; - case 0x1FC00000: - if (PAddr < 0x1FC007C0) { -/* DWORD ToSwap = *(DWORD *)(&PifRom[PAddr - 0x1FC00000]); - _asm { - mov eax,ToSwap - bswap eax - mov ToSwap,eax - } - * Value = ToSwap;*/ - BreakPoint(__FILE__,__LINE__); - return TRUE; - } - else if (PAddr < 0x1FC00800) - { - BYTE * PIF_Ram = _MMU->PifRam(); - DWORD ToSwap = *(DWORD *)(&PIF_Ram[PAddr - 0x1FC007C0]); - _asm { - mov eax,ToSwap - bswap eax - mov ToSwap,eax - } - * Value = ToSwap; - return TRUE; - } else { - * Value = 0; - return FALSE; - } - BreakPoint(__FILE__,__LINE__); - break; - default: - *Value = PAddr & 0xFFFF; - *Value = (*Value << 16) | *Value; - return FALSE; - break; - } - return TRUE; -} - -int CMipsMemoryVM::SB_NonMemory ( DWORD PAddr, BYTE Value ) { - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: -#ifdef CFB_READ - if (PAddr >= CFBStart && PAddr < CFBEnd) { - DWORD OldProtect; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); - *(BYTE *)(m_RDRAM+PAddr) = Value; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,OldProtect, &OldProtect); - DisplayError("FrameBufferWrite"); - if (FrameBufferWrite) { FrameBufferWrite(PAddr,1); } - break; - } -#endif - if (PAddr < RdramSize()) { - bool ProtectMem = false; - DWORD Start = PAddr & ~0xFFF; - WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); - if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } - - DWORD OldProtect; - VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect); - *(BYTE *)(m_RDRAM+PAddr) = Value; - if (ProtectMem) - { - VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READONLY, &OldProtect); - } - } - break; - default: - return FALSE; - break; - } - return TRUE; -} - -int CMipsMemoryVM::SH_NonMemory ( DWORD PAddr, WORD Value ) { - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: -#ifdef CFB_READ - if (PAddr >= CFBStart && PAddr < CFBEnd) { - DWORD OldProtect; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); - *(WORD *)(m_RDRAM+PAddr) = Value; - if (FrameBufferWrite) { FrameBufferWrite(PAddr & ~0xFFF,2); } - //*(WORD *)(m_RDRAM+PAddr) = 0xFFFF; - //VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_NOACCESS, &OldProtect); - DisplayError("PAddr = %x",PAddr); - break; - } -#endif - if (PAddr < RdramSize()) { - bool ProtectMem = false; - DWORD Start = PAddr & ~0xFFF; - WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); - if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } - - DWORD OldProtect; - VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect); - *(WORD *)(m_RDRAM+PAddr) = Value; - if (ProtectMem) - { - VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READONLY, &OldProtect); - } - } - break; - default: - return FALSE; - break; - } - return TRUE; -} - -int CMipsMemoryVM::SW_NonMemory ( DWORD PAddr, DWORD Value ) { - if (PAddr >= 0x10000000 && PAddr < 0x16000000) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if ((PAddr - 0x10000000) < RomFileSize) { - WrittenToRom = TRUE; - WroteToRom = Value; -#ifdef ROM_IN_MAPSPACE - { - DWORD OldProtect; - VirtualProtect(ROM,RomFileSize,PAGE_NOACCESS, &OldProtect); - } -#endif - //LogMessage("%X: Wrote To Rom %X from %X",PROGRAM_COUNTER,Value,PAddr); - } else { - return FALSE; - } -#endif - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: -#ifdef CFB_READ - if (PAddr >= CFBStart && PAddr < CFBEnd) { - DWORD OldProtect; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,PAGE_READWRITE, &OldProtect); - *(DWORD *)(m_RDRAM+PAddr) = Value; - VirtualProtect(m_RDRAM+(PAddr & ~0xFFF),0xFFC,OldProtect, &OldProtect); - DisplayError("FrameBufferWrite %X",PAddr); - if (FrameBufferWrite) { FrameBufferWrite(PAddr,4); } - break; - } -#endif - if (PAddr < RdramSize()) { - bool ProtectMem = false; - - DWORD Start = PAddr & ~0xFFF; - WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); - if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } - - DWORD OldProtect; - VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect); - *(DWORD *)(m_RDRAM+PAddr) = Value; - if (ProtectMem) - { - VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READONLY, &OldProtect); - } - } - break; - case 0x03F00000: - switch (PAddr) { - case 0x03F00000: _Reg->RDRAM_CONFIG_REG = Value; break; - case 0x03F00004: _Reg->RDRAM_DEVICE_ID_REG = Value; break; - case 0x03F00008: _Reg->RDRAM_DELAY_REG = Value; break; - case 0x03F0000C: _Reg->RDRAM_MODE_REG = Value; break; - case 0x03F00010: _Reg->RDRAM_REF_INTERVAL_REG = Value; break; - case 0x03F00014: _Reg->RDRAM_REF_ROW_REG = Value; break; - case 0x03F00018: _Reg->RDRAM_RAS_INTERVAL_REG = Value; break; - case 0x03F0001C: _Reg->RDRAM_MIN_INTERVAL_REG = Value; break; - case 0x03F00020: _Reg->RDRAM_ADDR_SELECT_REG = Value; break; - case 0x03F00024: _Reg->RDRAM_DEVICE_MANUF_REG = Value; break; - case 0x03F04004: break; - case 0x03F08004: break; - case 0x03F80004: break; - case 0x03F80008: break; - case 0x03F8000C: break; - case 0x03F80014: break; - default: - return FALSE; - } - break; - case 0x04000000: - if (PAddr < 0x04002000) { - bool ProtectMem = false; - - DWORD Start = PAddr & ~0xFFF; - WriteTraceF(TraceDebug,"WriteToProtectedMemory Addres: %X Len: %d",PAddr,1); - if (!ClearRecompCodeProtectMem(Start,0xFFF)) { ProtectMem = true; } - - DWORD OldProtect; - VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect); - *(DWORD *)(m_RDRAM+PAddr) = Value; - if (ProtectMem) - { - VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READONLY, &OldProtect); - } - } else { - switch (PAddr) { - case 0x04040000: _Reg->SP_MEM_ADDR_REG = Value; break; - case 0x04040004: _Reg->SP_DRAM_ADDR_REG = Value; break; - case 0x04040008: - _Reg->SP_RD_LEN_REG = Value; - SP_DMA_READ(); - break; - case 0x0404000C: - _Reg->SP_WR_LEN_REG = Value; - SP_DMA_WRITE(); - break; - case 0x04040010: - if ( ( Value & SP_CLR_HALT ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_HALT; } - if ( ( Value & SP_SET_HALT ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_HALT; } - if ( ( Value & SP_CLR_BROKE ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_BROKE; } - if ( ( Value & SP_CLR_INTR ) != 0) { - _Reg->MI_INTR_REG &= ~MI_INTR_SP; - _Reg->CheckInterrupts(); - } - #ifndef EXTERNAL_RELEASE - if ( ( Value & SP_SET_INTR ) != 0) { DisplayError("SP_SET_INTR"); } - #endif - if ( ( Value & SP_CLR_SSTEP ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SSTEP; } - if ( ( Value & SP_SET_SSTEP ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SSTEP; } - if ( ( Value & SP_CLR_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_SET_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_CLR_SIG0 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG0; } - if ( ( Value & SP_SET_SIG0 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG0; } - if ( ( Value & SP_CLR_SIG1 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG1; } - if ( ( Value & SP_SET_SIG1 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG1; } - if ( ( Value & SP_CLR_SIG2 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG2; } - if ( ( Value & SP_SET_SIG2 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG2; } - if ( ( Value & SP_CLR_SIG3 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG3; } - if ( ( Value & SP_SET_SIG3 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG3; } - if ( ( Value & SP_CLR_SIG4 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG4; } - if ( ( Value & SP_SET_SIG4 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG4; } - if ( ( Value & SP_CLR_SIG5 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG5; } - if ( ( Value & SP_SET_SIG5 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG5; } - if ( ( Value & SP_CLR_SIG6 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG6; } - if ( ( Value & SP_SET_SIG6 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG6; } - if ( ( Value & SP_CLR_SIG7 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG7; } - if ( ( Value & SP_SET_SIG7 ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SIG7; } - -#ifdef tofix - if ( ( Value & SP_SET_SIG0 ) != 0 && AudioSignal) - { - MI_INTR_REG |= MI_INTR_SP; - _Reg->CheckInterrupts(); - } -#endif - //if (*( DWORD *)(DMEM + 0xFC0) == 1) { - // ChangeTimer(RspTimer,0x30000); - //} else { - RunRsp(); - //} - break; - case 0x0404001C: _Reg->SP_SEMAPHORE_REG = 0; break; - case 0x04080000: _Reg->SP_PC_REG = Value & 0xFFC; break; - default: - return FALSE; - } - } - break; - case 0x04100000: - switch (PAddr) { - case 0x04100000: - _Reg->DPC_START_REG = Value; - _Reg->DPC_CURRENT_REG = Value; - break; - case 0x04100004: - _Reg->DPC_END_REG = Value; - if (_Plugins->Gfx()->ProcessRDPList) { _Plugins->Gfx()->ProcessRDPList(); } - break; - //case 0x04100008: _Reg->DPC_CURRENT_REG = Value; break; - case 0x0410000C: - if ( ( Value & DPC_CLR_XBUS_DMEM_DMA ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_XBUS_DMEM_DMA; } - if ( ( Value & DPC_SET_XBUS_DMEM_DMA ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_XBUS_DMEM_DMA; } - if ( ( Value & DPC_CLR_FREEZE ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_FREEZE; } - if ( ( Value & DPC_SET_FREEZE ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_FREEZE; } - if ( ( Value & DPC_CLR_FLUSH ) != 0) { _Reg->DPC_STATUS_REG &= ~DPC_STATUS_FLUSH; } - if ( ( Value & DPC_SET_FLUSH ) != 0) { _Reg->DPC_STATUS_REG |= DPC_STATUS_FLUSH; } - if ( ( Value & DPC_CLR_FREEZE ) != 0) - { - if ( ( _Reg->SP_STATUS_REG & SP_STATUS_HALT ) == 0) - { - if ( ( _Reg->SP_STATUS_REG & SP_STATUS_BROKE ) == 0 ) - { - RunRsp(); - } - } - } -#ifdef tofix - if (ShowUnhandledMemory) { - //if ( ( Value & DPC_CLR_TMEM_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_TMEM_CTR"); } - //if ( ( Value & DPC_CLR_PIPE_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR"); } - //if ( ( Value & DPC_CLR_CMD_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR"); } - //if ( ( Value & DPC_CLR_CLOCK_CTR ) != 0) { DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR"); } - } -#endif - break; - default: - return FALSE; - } - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: - _Reg->MI_MODE_REG &= ~0x7F; - _Reg->MI_MODE_REG |= (Value & 0x7F); - if ( ( Value & MI_CLR_INIT ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_INIT; } - if ( ( Value & MI_SET_INIT ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_INIT; } - if ( ( Value & MI_CLR_EBUS ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_EBUS; } - if ( ( Value & MI_SET_EBUS ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_EBUS; } - if ( ( Value & MI_CLR_DP_INTR ) != 0 ) { - _Reg->MI_INTR_REG &= ~MI_INTR_DP; - _Reg->CheckInterrupts(); - } - if ( ( Value & MI_CLR_RDRAM ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_RDRAM; } - if ( ( Value & MI_SET_RDRAM ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_RDRAM; } - break; - case 0x0430000C: - if ( ( Value & MI_INTR_MASK_CLR_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_SET_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_CLR_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_SET_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_CLR_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_SET_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_CLR_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_SET_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_CLR_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_SET_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_CLR_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_DP; } - if ( ( Value & MI_INTR_MASK_SET_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_DP; } - break; - default: - return FALSE; - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: - if (_Reg->VI_STATUS_REG != Value) { - _Reg->VI_STATUS_REG = Value; - if (_Plugins->Gfx()->ViStatusChanged != NULL ) { _Plugins->Gfx()->ViStatusChanged(); } - } - break; - case 0x04400004: -#ifdef CFB_READ - if (_Reg->VI_ORIGIN_REG > 0x280) { - SetFrameBuffer(_Reg->VI_ORIGIN_REG, (DWORD)(VI_WIDTH_REG * (VI_WIDTH_REG *.75))); - } -#endif - _Reg->VI_ORIGIN_REG = (Value & 0xFFFFFF); - //if (UpdateScreen != NULL ) { UpdateScreen(); } - break; - case 0x04400008: - if (_Reg->VI_WIDTH_REG != Value) { - _Reg->VI_WIDTH_REG = Value; - if (_Plugins->Gfx()->ViWidthChanged != NULL ) { _Plugins->Gfx()->ViWidthChanged(); } - } - break; - case 0x0440000C: _Reg->VI_INTR_REG = Value; break; - case 0x04400010: - _Reg->MI_INTR_REG &= ~MI_INTR_VI; - _Reg->CheckInterrupts(); - break; - case 0x04400014: _Reg->VI_BURST_REG = Value; break; - case 0x04400018: _Reg->VI_V_SYNC_REG = Value; break; - case 0x0440001C: _Reg->VI_H_SYNC_REG = Value; break; - case 0x04400020: _Reg->VI_LEAP_REG = Value; break; - case 0x04400024: _Reg->VI_H_START_REG = Value; break; - case 0x04400028: _Reg->VI_V_START_REG = Value; break; - case 0x0440002C: _Reg->VI_V_BURST_REG = Value; break; - case 0x04400030: _Reg->VI_X_SCALE_REG = Value; break; - case 0x04400034: _Reg->VI_Y_SCALE_REG = Value; break; - default: - return FALSE; - } - break; - case 0x04500000: - switch (PAddr) { - case 0x04500000: _Reg->AI_DRAM_ADDR_REG = Value; break; - case 0x04500004: - _Reg->AI_LEN_REG = Value; - if (g_FixedAudio) - { - _Audio->AiSetLength(); - } - if (_Plugins->Audio()->LenChanged != NULL) { _Plugins->Audio()->LenChanged(); } - break; - case 0x04500008: _Reg->AI_CONTROL_REG = (Value & 1); break; - case 0x0450000C: - /* Clear Interrupt */; - _Reg->MI_INTR_REG &= ~MI_INTR_AI; - _Reg->m_AudioIntrReg &= ~MI_INTR_AI; - _Reg->CheckInterrupts(); - break; - case 0x04500010: - _Reg->AI_DACRATE_REG = Value; - DacrateChanged(g_SystemType); - if (_Settings->LoadBool(Game_FixedAudio)) - { -#ifdef tofix - g_Audio->AiSetFrequency(Value,g_SystemType); -#endif - } - break; - case 0x04500014: _Reg->AI_BITRATE_REG = Value; break; - default: - return FALSE; - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600000: _Reg->PI_DRAM_ADDR_REG = Value; break; - case 0x04600004: _Reg->PI_CART_ADDR_REG = Value; break; - case 0x04600008: - _Reg->PI_RD_LEN_REG = Value; - PI_DMA_READ(); - break; - case 0x0460000C: - _Reg->PI_WR_LEN_REG = Value; - PI_DMA_WRITE(); - break; - case 0x04600010: - //if ((Value & PI_SET_RESET) != 0 ) { DisplayError("reset Controller"); } - if ((Value & PI_CLR_INTR) != 0 ) { - _Reg->MI_INTR_REG &= ~MI_INTR_PI; - _Reg->CheckInterrupts(); - } - break; - case 0x04600014: _Reg->PI_DOMAIN1_REG = (Value & 0xFF); break; - case 0x04600018: _Reg->PI_BSD_DOM1_PWD_REG = (Value & 0xFF); break; - case 0x0460001C: _Reg->PI_BSD_DOM1_PGS_REG = (Value & 0xFF); break; - case 0x04600020: _Reg->PI_BSD_DOM1_RLS_REG = (Value & 0xFF); break; - default: - return FALSE; - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700000: _Reg->RI_MODE_REG = Value; break; - case 0x04700004: _Reg->RI_CONFIG_REG = Value; break; - case 0x04700008: _Reg->RI_CURRENT_LOAD_REG = Value; break; - case 0x0470000C: _Reg->RI_SELECT_REG = Value; break; - case 0x04700010: _Reg->RI_REFRESH_REG = Value; break; - case 0x04700014: _Reg->RI_LATENCY_REG = Value; break; - case 0x04700018: _Reg->RI_RERROR_REG = Value; break; - case 0x0470001C: _Reg->RI_WERROR_REG = Value; break; - default: - return FALSE; - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800000: _Reg->SI_DRAM_ADDR_REG = Value; break; - case 0x04800004: - _Reg->SI_PIF_ADDR_RD64B_REG = Value; - SI_DMA_READ (); - break; - case 0x04800010: - _Reg->SI_PIF_ADDR_WR64B_REG = Value; - SI_DMA_WRITE(); - break; - case 0x04800018: - _Reg->MI_INTR_REG &= ~MI_INTR_SI; - _Reg->SI_STATUS_REG &= ~SI_STATUS_INTERRUPT; - _Reg->CheckInterrupts(); - break; - default: - return FALSE; - } - break; - case 0x08000000: - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (PAddr != 0x08010000) { return FALSE; } - if (SaveUsing == SaveChip_Auto) { SaveUsing = SaveChip_FlashRam; } - if (SaveUsing != SaveChip_FlashRam) { return TRUE; } - WriteToFlashCommand(Value); -#endif - return FALSE; - break; - case 0x1FC00000: - if (PAddr < 0x1FC007C0) { - return FALSE; - } else if (PAddr < 0x1FC00800) { - _asm { - mov eax,Value - bswap eax - mov Value,eax - } - *(DWORD *)(&m_PIF_Ram[PAddr - 0x1FC007C0]) = Value; - if (PAddr == 0x1FC007FC) { - PifRamWrite(); - } - return TRUE; - } - return FALSE; - break; - default: - return FALSE; - break; - } - return TRUE; -} - -extern DWORD g_ViRefreshRate; - -void CMipsMemoryVM::UpdateHalfLine (void) -{ - if (*_NextTimer < 0) { - m_HalfLine = 0; - return; - } - m_HalfLine = (DWORD)(*_NextTimer / g_ViRefreshRate); - m_HalfLine &= ~1; -} - -#ifdef toremove - -bool CMipsMemoryVM::Load64 ( DWORD VAddr, QWORD & Variable, MemorySize Size, bool SignExtend ) { - __try { - void * MemLoc; - - DWORD PAddr; - if (!TranslateVaddr(VAddr,PAddr)) { - return false; - } - if (PAddr > _Settings->LoadDword(Game_RDRamSize) && - (PAddr < 0x04000000 || PAddr > 0x04002000)) - { - switch (Size) { - case _8Bit: - if (!LoadByte_NonMemory(PAddr,reinterpret_cast(&Variable))) { - MemoryFilterFailed("load byte",PAddr,PROGRAM_COUNTER,0); - } - Variable = SignExtend?(__int64)((char)Variable):(BYTE)Variable; - return true; - case _16Bit: - if (!LoadHalf_NonMemory(PAddr,reinterpret_cast(&Variable))) { - MemoryFilterFailed("load half",PAddr,PROGRAM_COUNTER,0); - } - Variable = SignExtend?(__int64)((short)Variable):(WORD)Variable; - return true; - case _32Bit: - if (!LoadWord_NonMemory(PAddr,reinterpret_cast(&Variable))) { - MemoryFilterFailed("load word",PAddr,PROGRAM_COUNTER,0); - } - Variable = SignExtend?(__int64)((int)Variable):(DWORD)Variable; - return true; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - return false; - } - - switch (Size) { - case _8Bit: - if (!VAddrToRealAddr((VAddr ^ 3),MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - Variable = SignExtend?(__int64)(*(char *)MemLoc):*(BYTE *)MemLoc; - return true; - break; - case _16Bit: - if ((VAddr & 1) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr((VAddr ^ 2),MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - Variable = SignExtend?(__int64)(*(short *)MemLoc):*(WORD *)MemLoc; - return true; - break; - case _32Bit: - if ((VAddr & 3) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr(VAddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - Variable = SignExtend?(__int64)(*(int *)MemLoc):*(DWORD *)MemLoc; - return true; - break; - case _64Bit: - if ((VAddr & 7) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr(VAddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - Variable = (((__int64)(*(DWORD *)MemLoc)) << 32) | (*(((DWORD *)MemLoc) + 1)); - return true; - break; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - } __except( SystemMemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) { - _Notify->FatalError("Unknown memory action\n\nEmulation stop"); - } - return false; -} - -/* Function handles when memory is accessed that is not RDRAM/IMEM/DMEM - This includes things like rom, registers, and memory that has not been defined. -*/ -bool CMipsMemoryVM::LoadByte_NonMemory ( DWORD PAddr, BYTE * Value ) { - *Value = 0; - return false; -} - -bool CMipsMemoryVM::LoadHalf_NonMemory ( DWORD PAddr, WORD * Value ) { - *Value = 0; - return false; -} - -bool CMipsMemoryVM::LoadWord_NonMemory ( DWORD PAddr, DWORD * Value ) { - //TlbLog.Log("LW %X",PAddr); - if (PAddr >= 0x10000000 && PAddr < 0x16000000) { - if ((PAddr - 0x10000000) < RomFileSize()) { - if (m_WrittenToRom) { - *Value = m_WroteToRom; - m_WrittenToRom = false; - return true; - } - *Value = *(DWORD *)&ROM[PAddr - 0x10000000]; - return TRUE; - } else { - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - } - - switch (PAddr & 0xFFF00000) { - case 0x03F00000: - switch (PAddr) { - case 0x03F00000: * Value = _Reg->RDRAM_CONFIG_REG; break; - case 0x03F00004: * Value = _Reg->RDRAM_DEVICE_ID_REG; break; - case 0x03F00008: * Value = _Reg->RDRAM_DELAY_REG; break; - case 0x03F0000C: * Value = _Reg->RDRAM_MODE_REG; break; - case 0x03F00010: * Value = _Reg->RDRAM_REF_INTERVAL_REG; break; - case 0x03F00014: * Value = _Reg->RDRAM_REF_ROW_REG; break; - case 0x03F00018: * Value = _Reg->RDRAM_RAS_INTERVAL_REG; break; - case 0x03F0001C: * Value = _Reg->RDRAM_MIN_INTERVAL_REG; break; - case 0x03F00020: * Value = _Reg->RDRAM_ADDR_SELECT_REG; break; - case 0x03F00024: * Value = _Reg->RDRAM_DEVICE_MANUF_REG; break; - default: - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - break; - case 0x04000000: - switch (PAddr) { - case 0x04040010: * Value = _Reg->SP_STATUS_REG; break; - case 0x04040014: * Value = _Reg->SP_DMA_FULL_REG; break; - case 0x04040018: * Value = _Reg->SP_DMA_BUSY_REG; break; - case 0x04080000: * Value = _Reg->SP_PC_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04100000: - switch (PAddr) { - case 0x0410000C: *Value = _Reg->DPC_STATUS_REG; break; - case 0x04100010: *Value = _Reg->DPC_CLOCK_REG; break; - case 0x04100014: *Value = _Reg->DPC_BUFBUSY_REG; break; - case 0x04100018: *Value = _Reg->DPC_PIPEBUSY_REG; break; - case 0x0410001C: *Value = _Reg->DPC_TMEM_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: * Value = MI_MODE_REG; break; - case 0x04300004: * Value = MI_VERSION_REG; break; - case 0x04300008: * Value = MI_INTR_REG; break; - case 0x0430000C: * Value = MI_INTR_MASK_REG; break; - default: - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: *Value = VI_STATUS_REG; break; - case 0x04400004: *Value = VI_ORIGIN_REG; break; - case 0x04400008: *Value = VI_WIDTH_REG; break; - case 0x0440000C: *Value = VI_INTR_REG; break; - case 0x04400010: - UpdateHalfLine(); - *Value = m_HalfLine; - break; - case 0x04400014: *Value = VI_BURST_REG; break; - case 0x04400018: *Value = VI_V_SYNC_REG; break; - case 0x0440001C: *Value = VI_H_SYNC_REG; break; - case 0x04400020: *Value = VI_LEAP_REG; break; - case 0x04400024: *Value = VI_H_START_REG; break; - case 0x04400028: *Value = VI_V_START_REG ; break; - case 0x0440002C: *Value = VI_V_BURST_REG; break; - case 0x04400030: *Value = VI_X_SCALE_REG; break; - case 0x04400034: *Value = VI_Y_SCALE_REG; break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04500000: - switch (PAddr) { - case 0x04500004: - *Value = _Reg->GetTimer(AiTimer); - if (*Value != 0) { - *Value = (*Value / _System->_Plugins->Audio()->CountsPerByte()) + 1; - } - break; - case 0x0450000C: - *Value = AI_STATUS_REG; - break; - default: - * Value = 0; - return FALSE; - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600010: *Value = PI_STATUS_REG; break; - case 0x04600014: *Value = PI_DOMAIN1_REG; break; - case 0x04600018: *Value = PI_BSD_DOM1_PWD_REG; break; - case 0x0460001C: *Value = PI_BSD_DOM1_PGS_REG; break; - case 0x04600020: *Value = PI_BSD_DOM1_RLS_REG; break; - case 0x04600024: *Value = PI_DOMAIN2_REG; break; - case 0x04600028: *Value = PI_BSD_DOM2_PWD_REG; break; - case 0x0460002C: *Value = PI_BSD_DOM2_PGS_REG; break; - case 0x04600030: *Value = PI_BSD_DOM2_RLS_REG; break; - default: - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700000: * Value = RI_MODE_REG; break; - case 0x04700004: * Value = RI_CONFIG_REG; break; - case 0x04700008: * Value = RI_CURRENT_LOAD_REG; break; - case 0x0470000C: * Value = RI_SELECT_REG; break; - case 0x04700010: * Value = RI_REFRESH_REG; break; - case 0x04700014: * Value = RI_LATENCY_REG; break; - case 0x04700018: * Value = RI_RERROR_REG; break; - case 0x0470001C: * Value = RI_WERROR_REG; break; - default: - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800018: *Value = SI_STATUS_REG; break; - default: - *Value = 0; - return FALSE; - } - break; - case 0x08000000: - if (_Settings->LoadDword(SaveChipType) == SaveChip_Auto) { - _Settings->Save(SaveChipType,SaveChip_FlashRam); - } - if (_Settings->LoadDword(SaveChipType) != SaveChip_FlashRam) { - *Value = PAddr & 0xFFFF; - *Value = (*Value << 16) | *Value; - return FALSE; - } - if (m_FlashRam == NULL) { m_FlashRam = new CFlashRam(_Settings,_Notify,m_SavesReadOnly); } - *Value = m_FlashRam->ReadFromFlashStatus(PAddr); - break; - default: - *Value = ((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF); - return false; - } - return true; -} - -bool CMipsMemoryVM::Store64 ( DWORD VAddr, QWORD Value, MemorySize Size ) { - __try { - DWORD PAddr; - if (!TranslateVaddr(VAddr,PAddr)) { - _Notify->BreakPoint(__FILE__,__LINE__); - return false; - } - if (PAddr > _Settings->LoadDword(Game_RDRamSize) && - (PAddr < 0x04000000 || PAddr > 0x04002000)) - { - switch (Size) { - case _16Bit: - if (!StoreHalf_NonMemory(PAddr,static_cast(Value))) { - MemoryFilterFailed("Store word",PAddr,PROGRAM_COUNTER, static_cast(Value)); - } - return true; - break; - case _32Bit: - if (!StoreWord_NonMemory(PAddr,static_cast(Value))) { - MemoryFilterFailed("Store word",PAddr,PROGRAM_COUNTER, static_cast(Value)); - } - return true; - break; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - return false; - } - - void * MemLoc; - switch (Size) { - case _8Bit: - if (!VAddrToRealAddr((VAddr ^ 3),MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(BYTE *)MemLoc = (BYTE)Value; - return true; - break; - case _16Bit: - if ((VAddr & 1) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr((VAddr ^ 2),MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(WORD *)MemLoc = (WORD)Value; - return true; - break; - case _32Bit: - if ((VAddr & 3) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr(VAddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(DWORD *)MemLoc = (DWORD)Value; - return true; - break; - case _64Bit: - if ((VAddr & 7) != 0) { /*ADDRESS_ERROR_EXCEPTION(Address,TRUE);*/ _Notify->BreakPoint(__FILE__,__LINE__); } - if (!VAddrToRealAddr(VAddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - *((DWORD *)(MemLoc)) = *((DWORD *)(&Value) + 1); - *(((DWORD *)MemLoc) + 1) = *((DWORD *)(&Value)); - return true; - break; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - } __except( SystemMemoryFilter( GetExceptionCode(), GetExceptionInformation()) ) { - _Notify->FatalError("Unknown memory action\n\nEmulation stop"); - } - return false; -} - -/* Function handles when memory is accessed that is not RDRAM/IMEM/DMEM - This includes things like rom, registers, and memory that has not been defined. -*/ -bool CMipsMemoryVM::StoreByte_NonMemory ( DWORD PAddr, BYTE Value ) { - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - if (PAddr < _Settings->LoadDword(Game_RDRamSize)) { -// CRecompiler * Recomp = _System->GetRecompiler(); -// if (Recomp) { -// Recomp->ClearRecomplierCode(PAddr + 0x80000000,1); -// } - - DWORD OldProtect, NewProtect; - if (VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(BYTE *)(m_RDRAM+PAddr) = Value; - if (VirtualProtect((m_RDRAM + PAddr), 1, OldProtect, &NewProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - } - break; - default: - return false; - } - return true; -} - -bool CMipsMemoryVM::StoreHalf_NonMemory ( DWORD PAddr, WORD Value ) { - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - if (PAddr < _Settings->LoadDword(Game_RDRamSize)) { -// CRecompiler * Recomp = _System->GetRecompiler(); -// if (Recomp) { -// Recomp->ClearRecomplierCode(PAddr + 0x80000000,1); -// } - - DWORD OldProtect, NewProtect; - if (VirtualProtect((m_RDRAM + PAddr), 1, PAGE_READWRITE, &OldProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(WORD *)(m_RDRAM+PAddr) = Value; - if (VirtualProtect((m_RDRAM + PAddr), 1, OldProtect, &NewProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - } - break; - default: - return false; - } - return true; - return false; -} - -bool CMipsMemoryVM::StoreWord_NonMemory ( DWORD PAddr, DWORD Value ) { -// TlbLog.Log("SW %08X %X",PAddr,(DWORD)Value); - if (PAddr >= 0x10000000 && PAddr < 0x16000000) { - if ((PAddr - 0x10000000) < RomFileSize()) { - m_WrittenToRom = true; - m_WroteToRom = Value; - return true; - } - } - - switch (PAddr & 0xFFF00000) { - case 0x00000000: - case 0x00100000: - case 0x00200000: - case 0x00300000: - case 0x00400000: - case 0x00500000: - case 0x00600000: - case 0x00700000: - if (PAddr < _Settings->LoadDword(Game_RDRamSize)) { -// CRecompiler * Recomp = _System->GetRecompiler(); -// if (Recomp) { -// Recomp->ClearRecomplierCode(PAddr + 0x80000000,4); -// } - - DWORD OldProtect, NewProtect; - if (VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(DWORD *)(m_RDRAM+PAddr) = Value; - if (VirtualProtect((m_RDRAM + PAddr), 4, OldProtect, &NewProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - } - break; - case 0x03F00000: - switch (PAddr) { - case 0x03F00000: RDRAM_CONFIG_REG = Value; break; - case 0x03F00004: RDRAM_DEVICE_ID_REG = Value; break; - case 0x03F00008: RDRAM_DELAY_REG = Value; break; - case 0x03F0000C: RDRAM_MODE_REG = Value; break; - case 0x03F00010: RDRAM_REF_INTERVAL_REG = Value; break; - case 0x03F00014: RDRAM_REF_ROW_REG = Value; break; - case 0x03F00018: RDRAM_RAS_INTERVAL_REG = Value; break; - case 0x03F0001C: RDRAM_MIN_INTERVAL_REG = Value; break; - case 0x03F00020: RDRAM_ADDR_SELECT_REG = Value; break; - case 0x03F00024: RDRAM_DEVICE_MANUF_REG = Value; break; - case 0x03F04004: break; - case 0x03F08004: break; - case 0x03F80004: break; - case 0x03F80008: break; - case 0x03F8000C: break; - case 0x03F80014: break; - default: - return FALSE; - } - break; - case 0x04000000: - if (PAddr < 0x04002000) { -// CRecompiler * Recomp = _System->GetRecompiler(); -// if (Recomp) { -// Recomp->ClearRecomplierCode(PAddr + 0xA0000000,4); -// } - - DWORD OldProtect, NewProtect; - if (VirtualProtect((m_RDRAM + PAddr), 4, PAGE_READWRITE, &OldProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - *(DWORD *)(m_RDRAM+PAddr) = Value; - if (VirtualProtect((m_RDRAM + PAddr), 4, OldProtect, &NewProtect) == 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - break; - } - switch (PAddr) { - case 0x04040000: SP_MEM_ADDR_REG = Value; break; - case 0x04040004: SP_DRAM_ADDR_REG = Value; break; - case 0x04040008: - SP_RD_LEN_REG = Value; - SP_DMA_READ(); - break; - case 0x0404000C: - SP_WR_LEN_REG = Value; - SP_DMA_WRITE(); - break; - case 0x04040010: - if ( ( Value & SP_CLR_HALT ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_HALT; } - if ( ( Value & SP_SET_HALT ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_HALT; } - if ( ( Value & SP_CLR_BROKE ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_BROKE; } - if ( ( Value & SP_CLR_INTR ) != 0) { - MI_INTR_REG &= ~MI_INTR_SP; - _Reg->CheckInterrupts(); - } -// if ( ( Value & SP_SET_INTR ) != 0) { DisplayError("SP_SET_INTR"); } - if ( ( Value & SP_CLR_SSTEP ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SSTEP; } - if ( ( Value & SP_SET_SSTEP ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_SSTEP; } - if ( ( Value & SP_CLR_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_SET_INTR_BREAK ) != 0) { _Reg->SP_STATUS_REG |= SP_STATUS_INTR_BREAK; } - if ( ( Value & SP_CLR_SIG0 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG0; } - if ( ( Value & SP_SET_SIG0 ) != 0) { - SP_STATUS_REG |= SP_STATUS_SIG0; - MI_INTR_REG |= MI_INTR_SP; - _Reg->CheckInterrupts(); - } - if ( ( Value & SP_CLR_SIG1 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG1; } - if ( ( Value & SP_SET_SIG1 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG1; } - if ( ( Value & SP_CLR_SIG2 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG2; } - if ( ( Value & SP_SET_SIG2 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG2; } - if ( ( Value & SP_CLR_SIG3 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG3; } - if ( ( Value & SP_SET_SIG3 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG3; } - if ( ( Value & SP_CLR_SIG4 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG4; } - if ( ( Value & SP_SET_SIG4 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG4; } - if ( ( Value & SP_CLR_SIG5 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG5; } - if ( ( Value & SP_SET_SIG5 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG5; } - if ( ( Value & SP_CLR_SIG6 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG6; } - if ( ( Value & SP_SET_SIG6 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG6; } - if ( ( Value & SP_CLR_SIG7 ) != 0) { _Reg->SP_STATUS_REG &= ~SP_STATUS_SIG7; } - if ( ( Value & SP_SET_SIG7 ) != 0) { _Notify->BreakPoint(__FILE__,__LINE__); SP_STATUS_REG |= SP_STATUS_SIG7; } - if ( ( SP_STATUS_REG & SP_STATUS_HALT ) == 0) { - if ( ( SP_STATUS_REG & SP_STATUS_BROKE ) == 0 ) { - RunRsp(); - } - } - break; - case 0x0404001C: SP_SEMAPHORE_REG = 0; break; - case 0x04080000: SP_PC_REG = Value & 0xFFC; break; - default: - return FALSE; - } - break; - case 0x04100000: - switch (PAddr) { - case 0x04100000: - DPC_START_REG = Value; - DPC_CURRENT_REG = Value; - break; - case 0x04100004: - DPC_END_REG = Value; - WriteTrace(TraceGfxPlugin,"ProcessRDPList: Starting"); - _System->_Plugins->Gfx()->ProcessRDPList(); - WriteTrace(TraceGfxPlugin,"ProcessRDPList: Done"); - break; - case 0x0410000C: - if ( ( Value & DPC_CLR_XBUS_DMEM_DMA ) != 0) { DPC_STATUS_REG &= ~DPC_STATUS_XBUS_DMEM_DMA; } - if ( ( Value & DPC_SET_XBUS_DMEM_DMA ) != 0) { DPC_STATUS_REG |= DPC_STATUS_XBUS_DMEM_DMA; } - if ( ( Value & DPC_CLR_FREEZE ) != 0) { DPC_STATUS_REG &= ~DPC_STATUS_FREEZE; } - if ( ( Value & DPC_SET_FREEZE ) != 0) { DPC_STATUS_REG |= DPC_STATUS_FREEZE; } - if ( ( Value & DPC_CLR_FLUSH ) != 0) { DPC_STATUS_REG &= ~DPC_STATUS_FLUSH; } - if ( ( Value & DPC_SET_FLUSH ) != 0) { DPC_STATUS_REG |= DPC_STATUS_FLUSH; } - if ( ( Value & DPC_CLR_FREEZE ) != 0) { - if ( ( SP_STATUS_REG & SP_STATUS_HALT ) == 0) { - if ( ( SP_STATUS_REG & SP_STATUS_BROKE ) == 0 ) { - RunRsp(); - } - } - } - break; - default: - return FALSE; - } - break; - case 0x04300000: - switch (PAddr) { - case 0x04300000: - MI_MODE_REG &= ~0x7F; - MI_MODE_REG |= (Value & 0x7F); - if ( ( Value & MI_CLR_INIT ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_INIT; } - if ( ( Value & MI_SET_INIT ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_INIT; } - if ( ( Value & MI_CLR_EBUS ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_EBUS; } - if ( ( Value & MI_SET_EBUS ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_EBUS; } - if ( ( Value & MI_CLR_DP_INTR ) != 0 ) { - MI_INTR_REG &= ~MI_INTR_DP; - _Reg->CheckInterrupts(); - } - if ( ( Value & MI_CLR_RDRAM ) != 0 ) { _Reg->MI_MODE_REG &= ~MI_MODE_RDRAM; } - if ( ( Value & MI_SET_RDRAM ) != 0 ) { _Reg->MI_MODE_REG |= MI_MODE_RDRAM; } - break; - case 0x0430000C: - if ( ( Value & MI_INTR_MASK_CLR_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_SET_SP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SP; } - if ( ( Value & MI_INTR_MASK_CLR_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_SET_SI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_SI; } - if ( ( Value & MI_INTR_MASK_CLR_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_SET_AI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_AI; } - if ( ( Value & MI_INTR_MASK_CLR_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_SET_VI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_VI; } - if ( ( Value & MI_INTR_MASK_CLR_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_SET_PI ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_PI; } - if ( ( Value & MI_INTR_MASK_CLR_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG &= ~MI_INTR_MASK_DP; } - if ( ( Value & MI_INTR_MASK_SET_DP ) != 0 ) { _Reg->MI_INTR_MASK_REG |= MI_INTR_MASK_DP; } - break; - default: - return FALSE; - } - break; - case 0x04400000: - switch (PAddr) { - case 0x04400000: - if (VI_STATUS_REG != Value) { - VI_STATUS_REG = Value; - //if (ViStatusChanged != NULL ) { ViStatusChanged(); } - } - break; - case 0x04400004: - VI_ORIGIN_REG = (Value & 0xFFFFFF); - //if (UpdateScreen != NULL ) { UpdateScreen(); } - break; - case 0x04400008: - if (VI_WIDTH_REG != Value) { - VI_WIDTH_REG = Value; - //if (ViWidthChanged != NULL ) { ViWidthChanged(); } - } - break; - case 0x0440000C: VI_INTR_REG = Value; break; - case 0x04400010: - MI_INTR_REG &= ~MI_INTR_VI; - _Reg->CheckInterrupts(); - break; - case 0x04400014: VI_BURST_REG = Value; break; - case 0x04400018: VI_V_SYNC_REG = Value; break; - case 0x0440001C: VI_H_SYNC_REG = Value; break; - case 0x04400020: VI_LEAP_REG = Value; break; - case 0x04400024: VI_H_START_REG = Value; break; - case 0x04400028: VI_V_START_REG = Value; break; - case 0x0440002C: VI_V_BURST_REG = Value; break; - case 0x04400030: VI_X_SCALE_REG = Value; break; - case 0x04400034: VI_Y_SCALE_REG = Value; break; - default: - return FALSE; - } - break; - case 0x04500000: - switch (PAddr) { - case 0x04500000: AI_DRAM_ADDR_REG = Value; break; - case 0x04500004: - AI_LEN_REG = Value; - if (_Reg->GetTimer(AiTimer) == 0) { - _System->_Plugins->Audio()->LenChanged(); - _Reg->ChangeTimerFixed(AiTimer,AI_LEN_REG * _System->_Plugins->Audio()->CountsPerByte()); - AI_LEN_REG = 0; - } else { - AI_STATUS_REG |= AI_STATUS_FIFO_FULL; - _Reg->ChangeTimerFixed(AiTimerDMA,100); - } - break; - case 0x04500008: - AI_CONTROL_REG = (Value & 1); - break; - case 0x0450000C: - /* Clear Interrupt */; - MI_INTR_REG &= ~MI_INTR_AI; - _Reg->CheckInterrupts(); - break; - case 0x04500010: - AI_DACRATE_REG = Value; - _System->_Plugins->Audio()->DacrateChanged(SYSTEM_NTSC); - break; - case 0x04500014: AI_BITRATE_REG = Value; break; - default: - return FALSE; - } - break; - case 0x04600000: - switch (PAddr) { - case 0x04600000: PI_DRAM_ADDR_REG = Value; break; - case 0x04600004: PI_CART_ADDR_REG = Value; break; - case 0x04600008: - PI_RD_LEN_REG = Value; - PI_DMA_Read(); - break; - case 0x0460000C: - PI_WR_LEN_REG = Value; - PI_DMA_Write(); - break; - case 0x04600010: - if ((Value & PI_CLR_INTR) != 0 ) { - MI_INTR_REG &= ~MI_INTR_PI; - _Reg->CheckInterrupts(); - } - break; - case 0x04600014: PI_DOMAIN1_REG = (Value & 0xFF); break; - case 0x04600018: PI_BSD_DOM1_PWD_REG = (Value & 0xFF); break; - case 0x0460001C: PI_BSD_DOM1_PGS_REG = (Value & 0xFF); break; - case 0x04600020: PI_BSD_DOM1_RLS_REG = (Value & 0xFF); break; - case 0x04600024: PI_DOMAIN2_REG = (Value & 0xFF); break; - case 0x04600028: PI_BSD_DOM2_PWD_REG = (Value & 0xFF); break; - case 0x0460002C: PI_BSD_DOM2_PGS_REG = (Value & 0xFF); break; - case 0x04600030: PI_BSD_DOM2_RLS_REG = (Value & 0xFF); break; - default: - return FALSE; - } - break; - case 0x04700000: - switch (PAddr) { - case 0x04700000: RI_MODE_REG = Value; break; - case 0x04700004: RI_CONFIG_REG = Value; break; - case 0x04700008: RI_CURRENT_LOAD_REG = Value; break; - case 0x0470000C: RI_SELECT_REG = Value; break; - case 0x04700010: RI_REFRESH_REG = Value; break; - case 0x04700014: RI_LATENCY_REG = Value; break; - case 0x04700018: RI_RERROR_REG = Value; break; - case 0x0470001C: RI_WERROR_REG = Value; break; - default: - return false; - } - break; - case 0x04800000: - switch (PAddr) { - case 0x04800000: SI_DRAM_ADDR_REG = Value; break; - case 0x04800004: - SI_PIF_ADDR_RD64B_REG = Value; - SI_DMA_READ (); - break; - case 0x04800010: - SI_PIF_ADDR_WR64B_REG = Value; - SI_DMA_WRITE(); - break; - case 0x04800018: - MI_INTR_REG &= ~MI_INTR_SI; - SI_STATUS_REG &= ~SI_STATUS_INTERRUPT; - _Reg->CheckInterrupts(); - break; - default: - return FALSE; - } - break; - case 0x08000000: - if (PAddr != 0x08010000) { return FALSE; } - if (_Settings->LoadDword(SaveChipType) == SaveChip_Auto) { - _Settings->Save(SaveChipType,SaveChip_FlashRam); - } - if (_Settings->LoadDword(SaveChipType) != SaveChip_FlashRam) { - return true; - } - if (m_FlashRam == NULL) { m_FlashRam = new CFlashRam(_Settings,_Notify,m_SavesReadOnly); } - m_FlashRam->WriteToFlashCommand(Value); - break; - default: - return false; - } - return true; -} - -int CMipsMemoryVM::SystemMemoryFilter( DWORD dwExptCode, void * lpExceptionPointer ) { - //convert the pointer since we are not having win32 stuctures in headers - LPEXCEPTION_POINTERS lpEP = (LPEXCEPTION_POINTERS)lpExceptionPointer; - - //if not an access violation then do not try to handle it - if (dwExptCode != EXCEPTION_ACCESS_VIOLATION) { return EXCEPTION_CONTINUE_SEARCH; } - - //if Memory Address is greater then base memory then do not handle exception - DWORD MemAddress = (char *)lpEP->ExceptionRecord->ExceptionInformation[1] - (char *)m_RDRAM; - if ((int)(MemAddress) < 0 || MemAddress > 0x1FFFFFFF) { return EXCEPTION_CONTINUE_SEARCH; } - - //Get where the code was executing from - BYTE * ExecPos = (unsigned char *)lpEP->ContextRecord->Eip; - - //Handle if the exception occured from a DMA - if (*ExecPos == 0xF3 && *(ExecPos + 1) == 0xA5) { -// CRecompiler * Recomp = _System->GetRecompiler(); -// if (!Recomp) { _Notify->BreakPoint(__FILE__,__LINE__); } - int Start = (lpEP->ContextRecord->Edi - (DWORD)m_RDRAM); - int End = (Start + (lpEP->ContextRecord->Ecx << 2) - 1); - - if ((int)Start < 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - if ((int)End < _Settings->LoadDword(Game_RDRamSize)) { - for ( int count = Start & ~0x1000; count < End; count += 0x1000 ) { - CBClass->WriteToProtectedMemory(Start, 0xFFF); - } - return EXCEPTION_CONTINUE_EXECUTION; - } - if (Start >= 0x04000000 && End < 0x04002000) { - for ( int count = Start & ~0x1000; count < End; count += 0x1000 ) { - CBClass->WriteToProtectedMemory(Start, 0xFFF); - } - return EXCEPTION_CONTINUE_EXECUTION; - } - _Notify->BreakPoint(__FILE__,__LINE__); - return EXCEPTION_CONTINUE_SEARCH; - } - - //Set up where reading register information from - BYTE * ReadPos; - if (*ExecPos == 0x0F && *(ExecPos + 1) == 0xB6) { - ReadPos = ExecPos + 2; - } else if (*ExecPos == 0x0F && *(ExecPos + 1) == 0xB7) { - ReadPos = ExecPos + 2; - } else if (*ExecPos == 0x0F && *(ExecPos + 1) == 0xBE) { - ReadPos = ExecPos + 2; - } else if (*ExecPos == 0x0F && *(ExecPos + 1) == 0xBF) { - ReadPos = ExecPos + 2; - } else if (*ExecPos == 0x66) { - ReadPos = ExecPos + 2; - } else { - ReadPos = ExecPos + 1; - } - - //Find the target Register to store results - void * TargetRegister; - switch ((*ReadPos & 0x38)) { - case 0x00: TargetRegister = &lpEP->ContextRecord->Eax; break; - case 0x08: TargetRegister = &lpEP->ContextRecord->Ecx; break; - case 0x10: TargetRegister = &lpEP->ContextRecord->Edx; break; - case 0x18: TargetRegister = &lpEP->ContextRecord->Ebx; break; - case 0x20: TargetRegister = &lpEP->ContextRecord->Esp; break; - case 0x28: TargetRegister = &lpEP->ContextRecord->Ebp; break; - case 0x30: TargetRegister = &lpEP->ContextRecord->Esi; break; - case 0x38: TargetRegister = &lpEP->ContextRecord->Edi; break; - } - - //Calculate the length of the opcode that cause the exception -//7877086D C6 05 C2 10 DF 3A 04 mov byte ptr ds:[3ADF10C2h],4 - - BYTE * NextOp = ReadPos; - if ((*ReadPos & 7) == 4) { - switch ((*(ReadPos + 1) & 0xC7)) { - case 0: NextOp += 1; break; - case 1: NextOp += 1; break; - case 2: NextOp += 1; break; - case 3: NextOp += 1; break; - case 6: NextOp += 1; break; - case 7: NextOp += 1; break; - case 0x87: NextOp += 1; break; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - } - if ((*ReadPos & 7) == 5) - { - NextOp += 4; - } - switch ((*ReadPos & 0xC0)) { - case 0x00: NextOp += 1; break; - case 0x40: NextOp += 2; break; - case 0x80: NextOp += 5; break; - default: - _Notify->BreakPoint(__FILE__,__LINE__); - } - - //Handle the type of access -//789EDD5F 0F B7 3C 0A movzx edi,word ptr [edx+ecx] -//789E43BB 0F B7 3C 0A movzx edi,word ptr [edx+ecx] - switch(*ExecPos) { - case 0x0F: - switch(*(ExecPos + 1)) { - case 0xB6: - { - BYTE Value; - if (!LoadByte_NonMemory(MemAddress,(BYTE *)&Value)) { - MemoryFilterFailed("load half word",MemAddress,(DWORD)ExecPos,0); - } - *((DWORD *)TargetRegister) = (DWORD)Value; - } - break; - case 0xB7: - { - WORD Value; - if (!LoadHalf_NonMemory(MemAddress,(WORD *)&Value)) { - MemoryFilterFailed("load half word",MemAddress,(DWORD)ExecPos,0); - } - *((DWORD *)TargetRegister) = (DWORD)Value; - } - break; - case 0xBE: - { - BYTE Value; - if (!LoadByte_NonMemory(MemAddress,(BYTE *)&Value)) { - MemoryFilterFailed("load half word",MemAddress,(DWORD)ExecPos,0); - } - *((DWORD *)TargetRegister) = (DWORD)((long)((char)Value)); - } - break; - case 0xBF: - { - WORD Value; - if (!LoadHalf_NonMemory(MemAddress,(WORD *)&Value)) { - MemoryFilterFailed("load half word",MemAddress,(DWORD)ExecPos,0); - } - *((DWORD *)TargetRegister) = (DWORD)((long)((short)Value)); - } - break; - default: - _Notify->DisplayError("Unknown x86 opcode 0x0F 0x%X\nSystem location: %X\nlocation in n64 space: %X", - *(ExecPos + 1), lpEP->ContextRecord->Eip, MemAddress); - return EXCEPTION_CONTINUE_SEARCH; - } - break; - case 0x66: - switch(*(ExecPos + 1)) { - case 0x8B: - if (!LoadHalf_NonMemory(MemAddress,(WORD *)TargetRegister)) { - MemoryFilterFailed("load half word",MemAddress,(DWORD)ExecPos,0); - } - break; - case 0x89: - if (!StoreHalf_NonMemory(MemAddress,*(WORD *)TargetRegister)) { - MemoryFilterFailed("Store half word",MemAddress,(DWORD)ExecPos,*(WORD *)TargetRegister); - } - break; - case 0xC7: - if (TargetRegister != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!StoreHalf_NonMemory(MemAddress,*(WORD *)NextOp)) { - MemoryFilterFailed("Store half word",MemAddress,(DWORD)ExecPos,*(WORD *)TargetRegister); - } - NextOp += 2; - break; - default: - //Could Not handle the x86 opcode - _Notify->DisplayError("Unknown x86 opcode 0x66 0x%X\nSystem location: %X\nlocation in n64 space: %X", - *(ExecPos + 1), lpEP->ContextRecord->Eip, MemAddress); - return EXCEPTION_CONTINUE_SEARCH; - } - break; - case 0x88: - if (!StoreByte_NonMemory(MemAddress,*(BYTE *)TargetRegister)) { - MemoryFilterFailed("Store Byte",MemAddress,(DWORD)ExecPos,*(BYTE *)TargetRegister); - } - break; - case 0x89: - if (!StoreWord_NonMemory(MemAddress,*(DWORD *)TargetRegister)) { - MemoryFilterFailed("Store word",MemAddress,(DWORD)ExecPos,*(DWORD *)TargetRegister); - } - break; - case 0x8B: - if (!LoadWord_NonMemory(MemAddress,(DWORD *)TargetRegister)) { - MemoryFilterFailed("load word",MemAddress,(DWORD)ExecPos,0); - } - break; - case 0xC6: - if (TargetRegister != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!StoreByte_NonMemory(MemAddress,*(BYTE *)ReadPos)) { - MemoryFilterFailed("Store byte C6",MemAddress,(DWORD)ExecPos,*(DWORD *)NextOp); - } - NextOp += 1; - return EXCEPTION_CONTINUE_EXECUTION; - case 0xC7: - if (TargetRegister != &lpEP->ContextRecord->Eax) { return EXCEPTION_CONTINUE_SEARCH; } - if (!StoreWord_NonMemory(MemAddress,*(DWORD *)NextOp)) { - MemoryFilterFailed("Store word",MemAddress,(DWORD)ExecPos,*(DWORD *)NextOp); - } - NextOp += 4; - break; - default: - //Could Not handle the x86 opcode - _Notify->DisplayError("Unknown x86 opcode %X\nSystem location: %X\nlocation in n64 space: %X", - *(unsigned char *)lpEP->ContextRecord->Eip, lpEP->ContextRecord->Eip, MemAddress); - return EXCEPTION_CONTINUE_SEARCH; - } - lpEP->ContextRecord->Eip = (DWORD)NextOp; - return EXCEPTION_CONTINUE_EXECUTION; -} - -bool CMipsMemoryVM::SearchForValue (DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len ) -{ - if (Size == _32Bit) { StartAddress = ((StartAddress + 3) & ~3); } - if (Size == _16Bit) { StartAddress = ((StartAddress + 1) & ~1); } - - //search memory - if (StartAddress < RdramSize()) - { - DWORD EndMemSearchAddr = StartAddress + Len; - if (EndMemSearchAddr > RdramSize()) - { - EndMemSearchAddr = RdramSize(); - } - - DWORD pos; - switch (Size) - { - case _32Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 4) - { - if (*(DWORD *)(m_RDRAM + pos) == Value) - { - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - case _16Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 2) - { - if (*(WORD *)(m_RDRAM + (pos ^ 2)) == (WORD)Value) - { - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - case _8Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos ++) - { - if (*(BYTE *)(m_RDRAM + (pos ^ 3)) == (BYTE)Value) - { - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - default: - Notify().BreakPoint(__FILE__,__LINE__); - } - } - if (StartAddress >= 0x10000000) - { - DWORD EndMemSearchAddr = StartAddress + Len - 0x10000000; - if (EndMemSearchAddr > m_RomFileSize) - { - EndMemSearchAddr = m_RomFileSize; - } - StartAddress -= 0x10000000; - - DWORD pos; - switch (Size) - { - case _32Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 4) - { - if (*(DWORD *)(ROM + pos) == Value) - { - Len -= pos - StartAddress; - StartAddress = pos + 0x10000000; - return true; - } - } - break; - case _16Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 2) - { - if (*(WORD *)(ROM + (pos ^ 2)) == (WORD)Value) - { - Len -= pos - StartAddress; - StartAddress = pos + 0x10000000; - return true; - } - } - break; - case _8Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos ++) - { - if (*(BYTE *)(ROM + (pos ^ 3)) == (BYTE)Value) - { - Len -= pos - StartAddress; - StartAddress = pos + 0x10000000; - return true; - } - } - break; - default: - Notify().BreakPoint(__FILE__,__LINE__); - } - } - return false; -} - -bool CMipsMemoryVM::SearchSetBaseForChanges ( void ) -{ - if (m_MemoryState == NULL) - { - delete [] m_MemoryState; - } - m_MemoryStateSize = RdramSize(); - m_MemoryState = new BYTE[m_MemoryStateSize]; - memcpy(m_MemoryState,m_RDRAM,m_MemoryStateSize); - return true; -} - -bool CMipsMemoryVM::SearchForChanges(SearchMemChangeState SearchType, MemorySize Size, - DWORD &StartAddress, DWORD &Len, - DWORD &OldValue, DWORD &NewValue) -{ - if (SearchType == SearchChangeState_Reset) - { - Notify().BreakPoint(__FILE__,__LINE__); - } - if (Size == _32Bit) { StartAddress = ((StartAddress + 3) & ~3); } - if (Size == _16Bit) { StartAddress = ((StartAddress + 1) & ~1); } - - //search memory - if (StartAddress < RdramSize()) - { - DWORD EndMemSearchAddr = StartAddress + Len; - if (EndMemSearchAddr > RdramSize()) - { - EndMemSearchAddr = RdramSize(); - } - - DWORD pos; - switch (Size) - { - case _32Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 4) - { - OldValue = *(DWORD *)(m_MemoryState + pos); - NewValue = *(DWORD *)(m_RDRAM + pos); - if ((SearchType == SearchChangeState_Changed && NewValue != OldValue) || - (SearchType == SearchChangeState_Unchanged && NewValue == OldValue) || - (SearchType == SearchChangeState_Greater && NewValue > OldValue) || - (SearchType == SearchChangeState_Lessthan && NewValue < OldValue)) - { - *(DWORD *)(m_MemoryState + pos) = NewValue; - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - case _16Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos += 2) - { - OldValue = *(WORD *)(m_MemoryState + (pos ^ 2)); - NewValue = *(WORD *)(m_RDRAM + (pos ^ 2)); - if ((SearchType == SearchChangeState_Changed && NewValue != OldValue) || - (SearchType == SearchChangeState_Unchanged && NewValue == OldValue) || - (SearchType == SearchChangeState_Greater && NewValue > OldValue) || - (SearchType == SearchChangeState_Lessthan && NewValue < OldValue)) - { - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - case _8Bit: - for (pos = StartAddress; pos < EndMemSearchAddr; pos ++) - { - OldValue = *(BYTE *)(m_MemoryState + (pos ^ 3)); - NewValue = *(BYTE *)(m_RDRAM + (pos ^ 3)); - if ((SearchType == SearchChangeState_Changed && NewValue != OldValue) || - (SearchType == SearchChangeState_Unchanged && NewValue == OldValue) || - (SearchType == SearchChangeState_Greater && NewValue > OldValue) || - (SearchType == SearchChangeState_Lessthan && NewValue < OldValue)) - { - Len -= pos - StartAddress; - StartAddress = pos; - return true; - } - } - break; - default: - Notify().BreakPoint(__FILE__,__LINE__); - } - } - return false; -} -#endif - -void CMipsMemoryVM::ProtectMemory( DWORD StartVaddr, DWORD EndVaddr ) -{ - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (!CTLB::ValidVaddr(StartVaddr) || !CTLB::ValidVaddr(EndVaddr)) { return; } - - //Get Physical Addresses passed - DWORD StartPAddr, EndPAddr; - if (!TranslateVaddr(StartVaddr,StartPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } - if (!TranslateVaddr(EndVaddr,EndPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } - - //Get Length of memory being protected - int Length = (EndPAddr + 4) - StartPAddr; - if (Length < 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - - //Proect that memory address space - DWORD OldProtect; - void * MemLoc; - - if (!VAddrToRealAddr(StartVaddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - VirtualProtect(MemLoc, Length, PAGE_READONLY, &OldProtect); -#endif -} - -void CMipsMemoryVM::UnProtectMemory( DWORD StartVaddr, DWORD EndVaddr ) -{ -// _Notify->BreakPoint(__FILE__,__LINE__); - WriteTraceF(TraceError,"CMipsMemoryVM::UnProtectMemory: Not implemented startVaddr: %X EndVaddr: %X",StartVaddr,EndVaddr); -#ifdef tofix - if (!CTLB::ValidVaddr(StartVaddr) || !CTLB::ValidVaddr(EndVaddr)) { return; } - - //Get Physical Addresses passed - DWORD StartPAddr, EndPAddr; - if (!TranslateVaddr(StartVaddr,StartPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } - if (!TranslateVaddr(EndVaddr,EndPAddr)) { _Notify->BreakPoint(__FILE__,__LINE__); } - - //Get Length of memory being protected - int Length = (EndPAddr + 4) - StartPAddr; - if (Length < 0) { _Notify->BreakPoint(__FILE__,__LINE__); } - - //Proect that memory address space - DWORD OldProtect; - void * MemLoc; - - if (!VAddrToRealAddr(StartVaddr,MemLoc)) { _Notify->BreakPoint(__FILE__,__LINE__); } - VirtualProtect(MemLoc, Length, PAGE_READWRITE, &OldProtect); -#endif -} - - -void CMipsMemoryVM::Compile_LB (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; - Map_GPR_32bit(Opcode.rt,TRUE,0); - Compile_LB(cMipsRegMapLo(Opcode.rt),Address,TRUE); - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - XorConstToX86Reg(TempReg1,3); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveSxByteX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,3); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveSxN64MemToX86regByte(cMipsRegMapLo(Opcode.rt), TempReg1); - } -} - -void CMipsMemoryVM::Compile_LBU (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; - Map_GPR_32bit(Opcode.rt,FALSE,0); - Compile_LB(cMipsRegMapLo(Opcode.rt),Address,FALSE); - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - XorConstToX86Reg(TempReg1,3); - Map_GPR_32bit(Opcode.rt,FALSE,-1); - MoveZxByteX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,3); - Map_GPR_32bit(Opcode.rt,FALSE,-1); - MoveZxN64MemToX86regByte(cMipsRegMapLo(Opcode.rt), TempReg1); - } -} - -void CMipsMemoryVM::Compile_LH (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; - Map_GPR_32bit(Opcode.rt,TRUE,0); - Compile_LH(cMipsRegMapLo(Opcode.rt),Address,TRUE); - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - XorConstToX86Reg(TempReg1,2); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveSxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,2); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveSxN64MemToX86regHalf(cMipsRegMapLo(Opcode.rt), TempReg1); - } -} - -void CMipsMemoryVM::Compile_LHU (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; - Map_GPR_32bit(Opcode.rt,FALSE,0); - Compile_LH(cMipsRegMapLo(Opcode.rt),Address,FALSE); - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - XorConstToX86Reg(TempReg1,2); - Map_GPR_32bit(Opcode.rt,FALSE,-1); - MoveZxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,2); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveZxN64MemToX86regHalf(cMipsRegMapLo(Opcode.rt), TempReg1); - } -} - -void CMipsMemoryVM::Compile_LW (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - x86Reg TempReg1, TempReg2; -#ifdef tofix - if (Opcode.base == 29 && SPHack) { - char String[100]; - - Map_GPR_32bit(Opcode.rt,TRUE,-1); - TempReg1 = Map_MemoryStack(x86_Any,true); - sprintf(String,"%Xh",(short)Opcode.offset); - MoveVariableDispToX86Reg((void *)((DWORD)(short)Opcode.offset),String,cMipsRegLo(Opcode.rt),TempReg1,1); - } else { -#endif - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - Map_GPR_32bit(Opcode.rt,TRUE,-1); - Compile_LW(cMipsRegMapLo(Opcode.rt),Address); - } else { - if (g_UseTlb) { - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base) && Opcode.offset == 0) { - ProtectGPR(Opcode.base); - TempReg1 = cMipsRegMapLo(Opcode.base); - } else { - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt)); - } else { - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - Map_GPR_32bit(Opcode.rt,TRUE,-1); - LeaSourceAndOffset(cMipsRegMapLo(Opcode.rt),cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.base); - } - } else { - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.base); - AddConstToX86Reg(cMipsRegMapLo(Opcode.rt),(short)Opcode.immediate); - } - AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),0x1FFFFFFF); - MoveN64MemToX86reg(cMipsRegMapLo(Opcode.rt),cMipsRegMapLo(Opcode.rt)); - } - } -#ifdef tofix - } - if (SPHack && Opcode.rt == 29) - { - ResetX86Protection(); - _MMU->ResetMemoryStack(m_Section); - } -#endif -} - -void CMipsMemoryVM::Compile_LWC1 (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, TempReg3; - char Name[50]; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - m_Section->CompileCop1Test(); - if ((Opcode.ft & 1) != 0) { - if (RegInStack(Opcode.ft-1,CRegInfo::FPU_Double) || RegInStack(Opcode.ft-1,CRegInfo::FPU_Qword)) { - UnMap_FPR(Opcode.ft-1,TRUE); - } - } - if (RegInStack(Opcode.ft,CRegInfo::FPU_Double) || RegInStack(Opcode.ft,CRegInfo::FPU_Qword)) { - UnMap_FPR(Opcode.ft,TRUE); - } else { - UnMap_FPR(Opcode.ft,FALSE); - } - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(TempReg1,Address); - - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); - MoveX86regToX86Pointer(TempReg1,TempReg2); - return; - } - if (IsMapped(Opcode.base) && Opcode.offset == 0) { - if (g_UseTlb) { - ProtectGPR(Opcode.base); - TempReg1 = cMipsRegMapLo(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - if (Opcode.immediate == 0) { - } else if (Opcode.immediate == 1) { - IncX86reg(TempReg1); - } else if (Opcode.immediate == 0xFFFF) { - DecX86reg(TempReg1); - } else { - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - } - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - if (g_UseTlb) { - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg3); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - MoveN64MemToX86reg(TempReg3,TempReg1); - } - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); - MoveX86regToX86Pointer(TempReg3,TempReg2); -} - -void CMipsMemoryVM::Compile_LWL (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, OffsetReg, shift; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - DWORD Offset = Address & 3; - - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); - x86Reg Value = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(Value,(Address & ~3)); - AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),LWL_MASK[Offset]); - ShiftLeftSignImmed(Value,(BYTE)LWL_SHIFT[Offset]); - AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),Value); - return; - } - - shift = Map_TempReg(x86_ECX,-1,FALSE); - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - - CompileReadTLBMiss(TempReg1,TempReg2); - } - OffsetReg = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, OffsetReg); - AndConstToX86Reg(OffsetReg,3); - AndConstToX86Reg(TempReg1,~3); - - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); - AndVariableDispToX86Reg((void *)LWL_MASK,"LWL_MASK",cMipsRegMapLo(Opcode.rt),OffsetReg,Multip_x4); - MoveVariableDispToX86Reg((void *)LWL_SHIFT,"LWL_SHIFT",shift,OffsetReg,4); - if (g_UseTlb) { - MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg1); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - MoveN64MemToX86reg(TempReg1,TempReg1); - } - ShiftLeftSign(TempReg1); - AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),TempReg1); -} - -void CMipsMemoryVM::Compile_LWR (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, OffsetReg, shift; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - DWORD Offset = Address & 3; - - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); - x86Reg Value = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(Value,(Address & ~3)); - AndConstToX86Reg(cMipsRegMapLo(Opcode.rt),LWR_MASK[Offset]); - ShiftRightUnsignImmed(Value,(BYTE)LWR_SHIFT[Offset]); - AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),Value); - return; - } - - shift = Map_TempReg(x86_ECX,-1,FALSE); - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - - CompileReadTLBMiss(TempReg1,TempReg2); - } - OffsetReg = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, OffsetReg); - AndConstToX86Reg(OffsetReg,3); - AndConstToX86Reg(TempReg1,~3); - - Map_GPR_32bit(Opcode.rt,TRUE,Opcode.rt); - AndVariableDispToX86Reg((void *)LWR_MASK,"LWR_MASK",cMipsRegMapLo(Opcode.rt),OffsetReg,Multip_x4); - MoveVariableDispToX86Reg((void *)LWR_SHIFT,"LWR_SHIFT",shift,OffsetReg,4); - if (g_UseTlb) { - MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg1); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - MoveN64MemToX86reg(TempReg1,TempReg1); - } - ShiftRightUnsign(TempReg1); - AddX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),TempReg1); -} - -void CMipsMemoryVM::Compile_LWU (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset); - Map_GPR_32bit(Opcode.rt,FALSE,0); - Compile_LW(cMipsRegLo(Opcode.rt),Address); - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - Map_GPR_32bit(Opcode.rt,FALSE,-1); - MoveZxHalfX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegLo(Opcode.rt)); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - Map_GPR_32bit(Opcode.rt,TRUE,-1); - MoveZxN64MemToX86regHalf(cMipsRegLo(Opcode.rt), TempReg1); - } -#endif -} - -void CMipsMemoryVM::Compile_LD (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (Opcode.rt == 0) return; - - x86Reg TempReg1, TempReg2; - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - Map_GPR_64bit(Opcode.rt,-1); - Compile_LW(cMipsRegMapHi(Opcode.rt),Address); - Compile_LW(cMipsRegMapLo(Opcode.rt),Address + 4); -#ifdef tofix - if (SPHack && Opcode.rt == 29) { _MMU->ResetMemoryStack(m_Section); } -#endif - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base) && Opcode.offset == 0) { - if (g_UseTlb) { - ProtectGPR(Opcode.base); - TempReg1 = cMipsRegMapLo(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - Map_GPR_64bit(Opcode.rt,-1); - MoveX86regPointerToX86reg(TempReg1, TempReg2,cMipsRegMapHi(Opcode.rt)); - MoveX86regPointerToX86regDisp8(TempReg1, TempReg2,cMipsRegMapLo(Opcode.rt),4); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - Map_GPR_64bit(Opcode.rt,-1); - MoveN64MemToX86reg(cMipsRegMapHi(Opcode.rt),TempReg1); - MoveN64MemDispToX86reg(cMipsRegMapLo(Opcode.rt),TempReg1,4); - } -#ifdef tofix - if (SPHack && Opcode.rt == 29) { - ResetX86Protection(); - _MMU->ResetMemoryStack(m_Section); - } -#endif -} - -void CMipsMemoryVM::Compile_LDC1 (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, TempReg3; - char Name[50]; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - m_Section->CompileCop1Test(); - - UnMap_FPR(Opcode.ft,FALSE); - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(TempReg1,Address); - - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - AddConstToX86Reg(TempReg2,4); - MoveX86regToX86Pointer(TempReg1,TempReg2); - - Compile_LW(TempReg1,Address + 4); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - MoveX86regToX86Pointer(TempReg1,TempReg2); - return; - } - if (IsMapped(Opcode.base) && Opcode.offset == 0) { - if (g_UseTlb) { - ProtectGPR(Opcode.base); - TempReg1 = cMipsRegMapLo(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - if (Opcode.immediate == 0) { - } else if (Opcode.immediate == 1) { - IncX86reg(TempReg1); - } else if (Opcode.immediate == 0xFFFF) { - DecX86reg(TempReg1); - } else { - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - } - - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - if (g_UseTlb) { - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - CompileReadTLBMiss(TempReg1,TempReg2); - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86regPointerToX86reg(TempReg1, TempReg2,TempReg3); - Push(TempReg2); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - AddConstToX86Reg(TempReg2,4); - MoveX86regToX86Pointer(TempReg3,TempReg2); - Pop(TempReg2); - MoveX86regPointerToX86regDisp8(TempReg1, TempReg2,TempReg3,4); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - MoveX86regToX86Pointer(TempReg3,TempReg2); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - MoveN64MemToX86reg(TempReg3,TempReg1); - - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - AddConstToX86Reg(TempReg2,4); - MoveX86regToX86Pointer(TempReg3,TempReg2); - - MoveN64MemDispToX86reg(TempReg3,TempReg1,4); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg2); - MoveX86regToX86Pointer(TempReg3,TempReg2); - } -} - -void CMipsMemoryVM::Compile_LDL (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } - if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } - BeforeCallDirect(); - MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); - Call_Direct(R4300iOp::LDL, "R4300iOp::LDL"); - AfterCallDirect(); -#endif -} - -void CMipsMemoryVM::Compile_LDR (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } - if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } - BeforeCallDirect(); - MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); - Call_Direct(R4300iOp::LDR, "R4300iOp::LDR"); - AfterCallDirect(); -#endif -} - -void CMipsMemoryVM::Compile_SB (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 3; - - if (IsConst(Opcode.rt)) { - Compile_SB_Const((BYTE)cMipsRegLo(Opcode.rt), Address); - } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { - Compile_SB_Register(cMipsRegMapLo(Opcode.rt), Address); - } else { - Compile_SB_Register(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE), Address); - } - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - XorConstToX86Reg(TempReg1,3); - if (IsConst(Opcode.rt)) { - MoveConstByteToX86regPointer((BYTE)cMipsRegLo(Opcode.rt),TempReg1, TempReg2); - } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { - MoveX86regByteToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); - } else { - UnProtectGPR(Opcode.rt); - MoveX86regByteToX86regPointer(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE),TempReg1, TempReg2); - } - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,3); - if (IsConst(Opcode.rt)) { - MoveConstByteToN64Mem((BYTE)cMipsRegLo(Opcode.rt),TempReg1); - } else if (IsMapped(Opcode.rt) && Is8BitReg(cMipsRegMapLo(Opcode.rt))) { - MoveX86regByteToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); - } else { - UnProtectGPR(Opcode.rt); - MoveX86regByteToN64Mem(Map_TempReg(x86_Any8Bit,Opcode.rt,FALSE),TempReg1); - } - } -} - -void CMipsMemoryVM::Compile_SH (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (IsConst(Opcode.base)) { - DWORD Address = (cMipsRegLo(Opcode.base) + (short)Opcode.offset) ^ 2; - - if (IsConst(Opcode.rt)) { - Compile_SH_Const((WORD)cMipsRegLo(Opcode.rt), Address); - } else if (IsMapped(Opcode.rt)) { - Compile_SH_Register(cMipsRegMapLo(Opcode.rt), Address); - } else { - Compile_SH_Register(Map_TempReg(x86_Any,Opcode.rt,FALSE), Address); - } - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - XorConstToX86Reg(TempReg1,2); - if (IsConst(Opcode.rt)) { - MoveConstHalfToX86regPointer((WORD)cMipsRegLo(Opcode.rt),TempReg1, TempReg2); - } else if (IsMapped(Opcode.rt)) { - MoveX86regHalfToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); - } else { - MoveX86regHalfToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1, TempReg2); - } - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - XorConstToX86Reg(TempReg1,2); - if (IsConst(Opcode.rt)) { - MoveConstHalfToN64Mem((WORD)cMipsRegLo(Opcode.rt),TempReg1); - } else if (IsMapped(Opcode.rt)) { - MoveX86regHalfToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); - } else { - MoveX86regHalfToN64Mem(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1); - } - } -} - -void CMipsMemoryVM::Compile_SW (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - x86Reg TempReg1, TempReg2; -#ifdef tofix - if (Opcode.base == 29 && SPHack) { - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - TempReg1 = Map_MemoryStack(x86_Any,true); - - if (IsConst(Opcode.rt)) { - MoveConstToMemoryDisp (cMipsRegLo(Opcode.rt),TempReg1, (DWORD)((short)Opcode.offset)); - } else if (IsMapped(Opcode.rt)) { - MoveX86regToMemory(cMipsRegLo(Opcode.rt),TempReg1,(DWORD)((short)Opcode.offset)); - } else { - TempReg2 = Map_TempReg(x86_Any,Opcode.rt,FALSE); - MoveX86regToMemory(TempReg2,TempReg1,(DWORD)((short)Opcode.offset)); - } - } else { -#endif - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - - if (IsConst(Opcode.rt)) { - Compile_SW_Const(cMipsRegLo(Opcode.rt), Address); - } else if (IsMapped(Opcode.rt)) { - Compile_SW_Register(cMipsRegMapLo(Opcode.rt), Address); - } else { - Compile_SW_Register(Map_TempReg(x86_Any,Opcode.rt,FALSE), Address); - } - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - if (IsConst(Opcode.rt)) { - MoveConstToX86regPointer(cMipsRegLo(Opcode.rt),TempReg1, TempReg2); - } else if (IsMapped(Opcode.rt)) { - MoveX86regToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); - } else { - MoveX86regToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1, TempReg2); - } - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - if (IsConst(Opcode.rt)) { - MoveConstToN64Mem(cMipsRegLo(Opcode.rt),TempReg1); - } else if (IsMapped(Opcode.rt)) { - MoveX86regToN64Mem(cMipsRegMapLo(Opcode.rt),TempReg1); - } else { - MoveX86regToN64Mem(Map_TempReg(x86_Any,Opcode.rt,FALSE),TempReg1); - } - } -#ifdef tofix - } -#endif -} - -void CMipsMemoryVM::Compile_SWC1 (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, TempReg3; - char Name[50]; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - m_Section->CompileCop1Test(); - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - - UnMap_FPR(Opcode.ft,TRUE); - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg1); - MoveX86PointerToX86reg(TempReg1,TempReg1); - Compile_SW_Register(TempReg1, Address); - return; - } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - if (Opcode.immediate == 0) { - } else if (Opcode.immediate == 1) { - IncX86reg(TempReg1); - } else if (Opcode.immediate == 0xFFFF) { - DecX86reg(TempReg1); - } else { - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - UnMap_FPR(Opcode.ft,TRUE); - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg3); - MoveX86PointerToX86reg(TempReg3,TempReg3); - MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); - } else { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - UnMap_FPR(Opcode.ft,TRUE); - sprintf(Name,"_FPR_S[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_S[Opcode.ft],Name,TempReg2); - MoveX86PointerToX86reg(TempReg2,TempReg2); - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - MoveX86regToN64Mem(TempReg2, TempReg1); - } -} - -void CMipsMemoryVM::Compile_SWL (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, Value, shift, OffsetReg; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (IsConst(Opcode.base)) { - DWORD Address; - - Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - DWORD Offset = Address & 3; - - Value = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(Value,(Address & ~3)); - AndConstToX86Reg(Value,R4300iOp::SWL_MASK[Offset]); - TempReg1 = Map_TempReg(x86_Any,Opcode.rt,FALSE); - ShiftRightUnsignImmed(TempReg1,(BYTE)SWL_SHIFT[Offset]); - AddX86RegToX86Reg(Value,TempReg1); - Compile_SW_Register(Value, (Address & ~3)); - return; - } - shift = Map_TempReg(x86_ECX,-1,FALSE); - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - } - - OffsetReg = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, OffsetReg); - AndConstToX86Reg(OffsetReg,3); - AndConstToX86Reg(TempReg1,~3); - - Value = Map_TempReg(x86_Any,-1,FALSE); - if (g_UseTlb) { - MoveX86regPointerToX86reg(TempReg1, TempReg2,Value); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - MoveN64MemToX86reg(Value,TempReg1); - } - - AndVariableDispToX86Reg((void *)SWL_MASK,"SWL_MASK",Value,OffsetReg,Multip_x4); - if (!IsConst(Opcode.rt) || cMipsRegLo(Opcode.rt) != 0) { - MoveVariableDispToX86Reg((void *)SWL_SHIFT,"SWL_SHIFT",shift,OffsetReg,4); - if (IsConst(Opcode.rt)) { - MoveConstToX86reg(cMipsRegLo(Opcode.rt),OffsetReg); - } else if (IsMapped(Opcode.rt)) { - MoveX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),OffsetReg); - } else { - MoveVariableToX86reg(&_GPR[Opcode.rt].UW[0],CRegName::GPR_Lo[Opcode.rt],OffsetReg); - } - ShiftRightUnsign(OffsetReg); - AddX86RegToX86Reg(Value,OffsetReg); - } - - if (g_UseTlb) { - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - - MoveX86regToX86regPointer(Value,TempReg1, TempReg2); - } else { - MoveX86regToN64Mem(Value,TempReg1); - } -} - -void CMipsMemoryVM::Compile_SWR (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, Value, OffsetReg, shift; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - DWORD Offset = Address & 3; - - Value = Map_TempReg(x86_Any,-1,FALSE); - Compile_LW(Value,(Address & ~3)); - AndConstToX86Reg(Value,SWR_MASK[Offset]); - TempReg1 = Map_TempReg(x86_Any,Opcode.rt,FALSE); - ShiftLeftSignImmed(TempReg1,(BYTE)SWR_SHIFT[Offset]); - AddX86RegToX86Reg(Value,TempReg1); - Compile_SW_Register(Value, (Address & ~3)); - return; - } - shift = Map_TempReg(x86_ECX,-1,FALSE); - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - UnProtectGPR(Opcode.base); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_ReadMap,"m_TLB_ReadMap",TempReg2,TempReg2,4); - - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - } - - OffsetReg = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, OffsetReg); - AndConstToX86Reg(OffsetReg,3); - AndConstToX86Reg(TempReg1,~3); - - Value = Map_TempReg(x86_Any,-1,FALSE); - if (g_UseTlb) { - MoveX86regPointerToX86reg(TempReg1, TempReg2,Value); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - MoveN64MemToX86reg(Value,TempReg1); - } - - AndVariableDispToX86Reg((void *)SWR_MASK,"SWR_MASK",Value,OffsetReg,Multip_x4); - if (!IsConst(Opcode.rt) || cMipsRegLo(Opcode.rt) != 0) { - MoveVariableDispToX86Reg((void *)SWR_SHIFT,"SWR_SHIFT",shift,OffsetReg,4); - if (IsConst(Opcode.rt)) { - MoveConstToX86reg(cMipsRegLo(Opcode.rt),OffsetReg); - } else if (IsMapped(Opcode.rt)) { - MoveX86RegToX86Reg(cMipsRegMapLo(Opcode.rt),OffsetReg); - } else { - MoveVariableToX86reg(&_GPR[Opcode.rt].UW[0],CRegName::GPR_Lo[Opcode.rt],OffsetReg); - } - ShiftLeftSign(OffsetReg); - AddX86RegToX86Reg(Value,OffsetReg); - } - - if (g_UseTlb) { - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - - MoveX86regToX86regPointer(Value,TempReg1, TempReg2); - } else { - MoveX86regToN64Mem(Value,TempReg1); - } -} - -void CMipsMemoryVM::Compile_SD (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - - if (IsConst(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - Compile_SW_Const(MipsRegHi(Opcode.rt), Address); - } else { - Compile_SW_Const((MipsRegLo_S(Opcode.rt) >> 31), Address); - } - Compile_SW_Const(cMipsRegLo(Opcode.rt), Address + 4); - } else if (IsMapped(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - Compile_SW_Register(MipsRegMapHi(Opcode.rt), Address); - } else { - Compile_SW_Register(Map_TempReg(x86_Any,Opcode.rt,TRUE), Address); - } - Compile_SW_Register(cMipsRegMapLo(Opcode.rt), Address + 4); - } else { - Compile_SW_Register(TempReg1 = Map_TempReg(x86_Any,Opcode.rt,TRUE), Address); - Compile_SW_Register(Map_TempReg(TempReg1,Opcode.rt,FALSE), Address + 4); - } - return; - } - if (IsMapped(Opcode.rt)) { ProtectGPR(Opcode.rt); } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - if (IsConst(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - MoveConstToX86regPointer(MipsRegHi(Opcode.rt),TempReg1, TempReg2); - } else { - MoveConstToX86regPointer((MipsRegLo_S(Opcode.rt) >> 31),TempReg1, TempReg2); - } - AddConstToX86Reg(TempReg1,4); - MoveConstToX86regPointer(cMipsRegLo(Opcode.rt),TempReg1, TempReg2); - } else if (IsMapped(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - MoveX86regToX86regPointer(MipsRegMapHi(Opcode.rt),TempReg1, TempReg2); - } else { - MoveX86regToX86regPointer(Map_TempReg(x86_Any,Opcode.rt,TRUE),TempReg1, TempReg2); - } - AddConstToX86Reg(TempReg1,4); - MoveX86regToX86regPointer(cMipsRegMapLo(Opcode.rt),TempReg1, TempReg2); - } else { - x86Reg Reg = Map_TempReg(x86_Any,Opcode.rt,TRUE); - MoveX86regToX86regPointer(Reg,TempReg1, TempReg2); - AddConstToX86Reg(TempReg1,4); - MoveX86regToX86regPointer(Map_TempReg(Reg,Opcode.rt,FALSE),TempReg1, TempReg2); - } - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - if (IsConst(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - MoveConstToN64Mem(MipsRegHi(Opcode.rt),TempReg1); - } else if (IsSigned(Opcode.rt)) { - MoveConstToN64Mem((cMipsRegLo_S(Opcode.rt) >> 31),TempReg1); - } else { - MoveConstToN64Mem(0,TempReg1); - } - MoveConstToN64MemDisp(cMipsRegLo(Opcode.rt),TempReg1,4); - } else if (IsKnown(Opcode.rt) && IsMapped(Opcode.rt)) { - if (Is64Bit(Opcode.rt)) { - MoveX86regToN64Mem(MipsRegMapHi(Opcode.rt),TempReg1); - } else if (IsSigned(Opcode.rt)) { - MoveX86regToN64Mem(Map_TempReg(x86_Any,Opcode.rt,TRUE), TempReg1); - } else { - MoveConstToN64Mem(0,TempReg1); - } - MoveX86regToN64MemDisp(cMipsRegMapLo(Opcode.rt),TempReg1, 4); - } else { - x86Reg Reg; - MoveX86regToN64Mem(Reg = Map_TempReg(x86_Any,Opcode.rt,TRUE), TempReg1); - MoveX86regToN64MemDisp(Map_TempReg(Reg,Opcode.rt,FALSE), TempReg1,4); - } - } -} - -void CMipsMemoryVM::Compile_SDC1 (void) -{ - OPCODE & Opcode = CRecompilerOps::m_Opcode; - x86Reg TempReg1, TempReg2, TempReg3; - char Name[50]; - - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - - m_Section->CompileCop1Test(); - - if (IsConst(Opcode.base)) { - DWORD Address = cMipsRegLo(Opcode.base) + (short)Opcode.offset; - - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg1); - AddConstToX86Reg(TempReg1,4); - MoveX86PointerToX86reg(TempReg1,TempReg1); - Compile_SW_Register(TempReg1, Address); - - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg(&_FPR_D[Opcode.ft],Name,TempReg1); - MoveX86PointerToX86reg(TempReg1,TempReg1); - Compile_SW_Register(TempReg1, Address + 4); - return; - } - if (IsMapped(Opcode.base)) { - ProtectGPR(Opcode.base); - if (Opcode.offset != 0) { - TempReg1 = Map_TempReg(x86_Any,-1,FALSE); - LeaSourceAndOffset(TempReg1,cMipsRegMapLo(Opcode.base),(short)Opcode.offset); - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - } - } else { - TempReg1 = Map_TempReg(x86_Any,Opcode.base,FALSE); - if (Opcode.immediate == 0) { - } else if (Opcode.immediate == 1) { - IncX86reg(TempReg1); - } else if (Opcode.immediate == 0xFFFF) { - DecX86reg(TempReg1); - } else { - AddConstToX86Reg(TempReg1,(short)Opcode.immediate); - } - } - if (g_UseTlb) { - TempReg2 = Map_TempReg(x86_Any,-1,FALSE); - MoveX86RegToX86Reg(TempReg1, TempReg2); - ShiftRightUnsignImmed(TempReg2,12); - MoveVariableDispToX86Reg(m_TLB_WriteMap,"m_TLB_WriteMap",TempReg2,TempReg2,4); - //For tlb miss - //0041C522 85 C0 test eax,eax - //0041C524 75 01 jne 0041C527 - - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); - AddConstToX86Reg(TempReg3,4); - MoveX86PointerToX86reg(TempReg3,TempReg3); - MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); - AddConstToX86Reg(TempReg1,4); - - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); - MoveX86PointerToX86reg(TempReg3,TempReg3); - MoveX86regToX86regPointer(TempReg3,TempReg1, TempReg2); - } else { - AndConstToX86Reg(TempReg1,0x1FFFFFFF); - TempReg3 = Map_TempReg(x86_Any,-1,FALSE); - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); - AddConstToX86Reg(TempReg3,4); - MoveX86PointerToX86reg(TempReg3,TempReg3); - MoveX86regToN64Mem(TempReg3, TempReg1); - sprintf(Name,"_FPR_D[%d]",Opcode.ft); - MoveVariableToX86reg((BYTE *)&_FPR_D[Opcode.ft],Name,TempReg3); - MoveX86PointerToX86reg(TempReg3,TempReg3); - MoveX86regToN64MemDisp(TempReg3, TempReg1,4); - } -} - -void CMipsMemoryVM::Compile_SDL (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } - if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } - BeforeCallDirect(); - MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); - Call_Direct(R4300iOp::SDL, "R4300iOp::SDL"); - AfterCallDirect(); - -#endif -} - -void CMipsMemoryVM::Compile_SDR (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(Opcode.Hex,m_CompilePC)); - if (Opcode.base != 0) { UnMap_GPR(Opcode.base,TRUE); } - if (Opcode.rt != 0) { UnMap_GPR(Opcode.rt,TRUE); } - BeforeCallDirect(); - MoveConstToVariable(Opcode.Hex, &Opcode.Hex, "Opcode.Hex" ); - Call_Direct(R4300iOp::SDR, "R4300iOp::SDR"); - AfterCallDirect(); -#endif -} - -LPCTSTR CMipsMemoryVM::LabelName ( DWORD Address ) const -{ - //StringMap::iterator theIterator = m_LabelList.find(Address); - //if (theIterator != m_LabelList.end()) { - // return (*theIterator).second; - //} - - sprintf(m_strLabelName,"0x%08X",Address); - return m_strLabelName; -} - -void CMipsMemoryVM::TLB_Mapped( DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly ) -{ - for (DWORD count = VAddr, VEnd = VAddr + Len; count < VEnd; count += 0x1000) { - DWORD Index = count >> 12; - m_TLB_ReadMap[Index] = ((DWORD)m_RDRAM + (count - VAddr + PAddr)) - count; - if (!bReadOnly) - { - m_TLB_WriteMap[Index] = ((DWORD)m_RDRAM + (count - VAddr + PAddr)) - count; - } - } -} - -void CMipsMemoryVM::TLB_Unmaped( DWORD Vaddr, DWORD Len ) -{ - for (DWORD count = Vaddr, End = Vaddr + Len; count < End; count += 0x1000) - { - DWORD Index = count >> 12; - m_TLB_ReadMap[Index] = NULL; - m_TLB_WriteMap[Index] = NULL; - } -} \ No newline at end of file +#include "stdafx.h" \ No newline at end of file diff --git a/Source/Project64/N64 System/Mips/Register Class.cpp b/Source/Project64/N64 System/Mips/Register Class.cpp index 8bf9c2eba..deeb90e62 100644 --- a/Source/Project64/N64 System/Mips/Register Class.cpp +++ b/Source/Project64/N64 System/Mips/Register Class.cpp @@ -228,8 +228,8 @@ void CRegisters::Reset() m_LO.DW = 0; m_RoundingModel = ROUND_NEAR; - //LLBit = 0; - //LLAddr = 0; + m_LLBit = 0; + m_LLAddr = 0; //Reset System Registers memset(m_RDRAM_Interface,0,sizeof(m_RDRAM_Interface)); diff --git a/Source/Project64/N64 System/Mips/System Events.cpp b/Source/Project64/N64 System/Mips/System Events.cpp index 02c20e04f..9bc9fff69 100644 --- a/Source/Project64/N64 System/Mips/System Events.cpp +++ b/Source/Project64/N64 System/Mips/System Events.cpp @@ -49,6 +49,9 @@ void CSystemEvents::ExecuteEvents ( void ) _Reg->CheckInterrupts(); _Plugins->Gfx()->SoftReset(); break; + case SysEvent_ResetCPU_SoftDone: + _System->SoftReset(); + break; case SysEvent_Profile_GenerateLogs: GenerateProfileLog(); break; @@ -158,6 +161,9 @@ void CSystemEvents::ExecuteEvents ( void ) bPause = true; } break; + default: + _Notify->BreakPoint(__FILE__,__LINE__); + break; } } diff --git a/Source/Project64/N64 System/Mips/System Events.h b/Source/Project64/N64 System/Mips/System Events.h index 288e0f309..7bea36411 100644 --- a/Source/Project64/N64 System/Mips/System Events.h +++ b/Source/Project64/N64 System/Mips/System Events.h @@ -2,6 +2,7 @@ enum SystemEvent { SysEvent_ExecuteInterrupt, SysEvent_GSButtonPressed, SysEvent_ResetCPU_Soft, + SysEvent_ResetCPU_SoftDone, SysEvent_ResetCPU_Hard, SysEvent_CloseCPU, SysEvent_PauseCPU_FromMenu, diff --git a/Source/Project64/N64 System/Mips/System Timing.cpp b/Source/Project64/N64 System/Mips/System Timing.cpp index 92b82ff58..ba4c890a9 100644 --- a/Source/Project64/N64 System/Mips/System Timing.cpp +++ b/Source/Project64/N64 System/Mips/System Timing.cpp @@ -4,7 +4,6 @@ CSystemTimer::CSystemTimer( int & NextTimer ) : m_NextTimer(NextTimer) { Reset(); - SetTimer(ViTimer,50000,false); } void CSystemTimer::Reset ( void ) @@ -18,6 +17,8 @@ void CSystemTimer::Reset ( void ) m_Current = UnknownTimer; m_Timer = 0; m_NextTimer = 0; + + SetTimer(ViTimer,50000,false); } void CSystemTimer::SetTimer ( TimerType Type, DWORD Cycles, bool bRelative ) @@ -137,7 +138,7 @@ void CSystemTimer::TimerDone (void) break; case CSystemTimer::SoftResetTimer: _SystemTimer->StopTimer(CSystemTimer::SoftResetTimer); - _N64System->SoftReset(); + _System->ExternalEvent(SysEvent_ResetCPU_SoftDone); break; case CSystemTimer::SiTimer: _SystemTimer->StopTimer(CSystemTimer::SiTimer); @@ -154,7 +155,7 @@ void CSystemTimer::TimerDone (void) case CSystemTimer::ViTimer: try { - _N64System->RefreshScreen(); + _System->RefreshScreen(); } catch (...) { diff --git a/Source/Project64/N64 System/N64 Class.cpp b/Source/Project64/N64 System/N64 Class.cpp index 3546bc112..b8511613b 100644 --- a/Source/Project64/N64 System/N64 Class.cpp +++ b/Source/Project64/N64 System/N64 Class.cpp @@ -48,9 +48,6 @@ CN64System::CN64System ( CPlugins * Plugins, bool SavesReadOnly ) : { //InterpreterOpcode = NULL; m_hPauseEvent = CreateEvent(NULL,true,false,NULL); - - //stop CPU and destroy current MMU - Reset(); switch (_Rom->GetCountry()) { @@ -73,7 +70,6 @@ CN64System::~CN64System ( void ) { void CN64System::ExternalEvent ( SystemEvent action ) { - switch (action) { case SysEvent_Profile_GenerateLogs: case SysEvent_Profile_StartStop: @@ -84,7 +80,7 @@ void CN64System::ExternalEvent ( SystemEvent action ) case SysEvent_ChangePlugins: case SysEvent_ChangingFullScreen: case SysEvent_GSButtonPressed: - case SysEvent_ResetCPU_Soft: + case SysEvent_ResetCPU_SoftDone: case SysEvent_Interrupt_SP: case SysEvent_Interrupt_SI: case SysEvent_Interrupt_AI: @@ -93,6 +89,13 @@ void CN64System::ExternalEvent ( SystemEvent action ) case SysEvent_Interrupt_DP: QueueEvent(action); break; + case SysEvent_ResetCPU_Soft: + QueueEvent(action); + if (m_SyncCPU) + { + m_SyncCPU->QueueEvent(action); + } + break; case SysEvent_PauseCPU_FromMenu: case SysEvent_PauseCPU_AppLostFocus: case SysEvent_PauseCPU_AppLostActive: @@ -213,26 +216,26 @@ bool CN64System::EmulationStarting ( HANDLE hThread, DWORD ThreadId ) { bool bRes = true; - if (_N64System) + if (_BaseSystem) { WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Destroying old N64 system"); - delete _N64System; - _N64System = NULL; + delete _BaseSystem; + _BaseSystem = NULL; } WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Creating N64 system"); - CN64System * System = new CN64System(_Plugins,false); + _BaseSystem = new CN64System(_Plugins,false); WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Setting N64 system as active"); - if (System->SetActiveSystem(true)) + if (_BaseSystem->SetActiveSystem(true)) { - System->m_CPU_Handle = hThread; - System->m_CPU_ThreadID = ThreadId; + _BaseSystem->m_CPU_Handle = hThread; + _BaseSystem->m_CPU_ThreadID = ThreadId; WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Setting up N64 system done"); _Settings->SaveBool(GameRunning_LoadingInProgress,false); _Notify->RefreshMenu(); try { WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Game set to auto start, starting"); - System->StartEmulation2(false); + _BaseSystem->StartEmulation2(false); WriteTrace(TraceDebug,"CN64System::stLoadFileImage: Game Done"); } catch (...) @@ -242,8 +245,8 @@ bool CN64System::EmulationStarting ( HANDLE hThread, DWORD ThreadId ) sprintf(Message,"CN64System::LoadFileImage - Exception caught\nFile: %s\nLine: %d",__FILE__,__LINE__); MessageBox(NULL,Message,"Exception",MB_OK); } - System->m_CPU_Handle = NULL; - System->m_CPU_ThreadID = 0; + _BaseSystem->m_CPU_Handle = NULL; + _BaseSystem->m_CPU_ThreadID = 0; } else { WriteTrace(TraceError,"CN64System::stLoadFileImage: SetActiveSystem failed"); _Notify->DisplayError("Failed to Initialize N64 System"); @@ -252,10 +255,10 @@ bool CN64System::EmulationStarting ( HANDLE hThread, DWORD ThreadId ) bRes = false; } - if (System) + if (_BaseSystem) { - delete System; - System = NULL; + delete _BaseSystem; + _BaseSystem = NULL; } return bRes; } @@ -354,7 +357,6 @@ void CN64System::StartEmulation2 ( bool NewThread ) _Notify->MakeWindowOnTop(_Settings->LoadBool(UserInterface_AlwaysOnTop)); if (!_Settings->LoadBool(Beta_IsValidExe)) { - Reset(); return; } @@ -506,35 +508,12 @@ bool CN64System::IsDialogMsg( MSG * msg ) return false; } -void CN64System::SoftReset() -{ - if (GetRecompiler()) - { - GetRecompiler()->ResetRecompCode(); - } - //g_CPU_Action->DoSomething = TRUE; - if (_Plugins) { _Plugins->GameReset(); } - bool PostPif = true; - - InitRegisters(PostPif,m_MMU_VM); - if (PostPif) - { - memcpy((m_MMU_VM.Dmem()+0x40), (_Rom->GetRomAddress() + 0x040), 0xFBC); - } - m_SystemTimer.SetTimer(CSystemTimer::CompareTimer,m_Reg.COMPARE_REGISTER - m_Reg.COUNT_REGISTER,false); - Debug_Reset(); - CloseSaveChips(); - m_CyclesToSkip = 0; - m_AlistCount = 0; - m_DlistCount = 0; - m_UnknownCount = 0; - - m_DMAUsed = false; - //g_CPU_Action->InterruptExecuted = false; -} - void CN64System::Reset (void) { + if (m_Recomp) + { + m_Recomp->ResetRecompCode(); + } if (_Plugins) { _Plugins->GameReset(); } m_Audio.ResetAudioSettings(); Debug_Reset(); @@ -545,6 +524,23 @@ void CN64System::Reset (void) m_DlistCount = 0; m_UnknownCount = 0; m_SystemType = SYSTEM_NTSC; + m_DMAUsed = false; + + m_Reg.Reset(); + m_SystemTimer.Reset(); + m_SystemTimer.SetTimer(CSystemTimer::CompareTimer,m_Reg.COMPARE_REGISTER - m_Reg.COUNT_REGISTER,false); +} + +void CN64System::SoftReset() +{ + Reset(); + bool PostPif = true; + + InitRegisters(PostPif,m_MMU_VM); + if (PostPif) + { + memcpy((m_MMU_VM.Dmem()+0x40), (_Rom->GetRomAddress() + 0x040), 0xFBC); + } } bool CN64System::SetActiveSystem( bool bActive ) @@ -559,21 +555,14 @@ bool CN64System::SetActiveSystem( bool bActive ) { return false; } - bool PostPif = true; - - InitRegisters(PostPif,m_MMU_VM); - if (PostPif) - { - memcpy((m_MMU_VM.Dmem()+0x40), (_Rom->GetRomAddress() + 0x040), 0xFBC); - } - m_SystemTimer.SetTimer(CSystemTimer::CompareTimer,m_Reg.COMPARE_REGISTER - m_Reg.COUNT_REGISTER,false); + SoftReset(); m_bInitilized = true; bInitPlugin = true; } m_Reg.SetAsCurrentSystem(); - _N64System = this; + _System = this; _SyncSystem = m_SyncCPU; _Recompiler = m_Recomp; _MMU = &m_MMU_VM; @@ -587,9 +576,9 @@ bool CN64System::SetActiveSystem( bool bActive ) _NextTimer = &m_NextTimer; _Plugins = m_Plugins; } else { - if (_N64System == this) + if (this == _BaseSystem) { - _N64System = NULL; + _System = NULL; _SyncSystem = NULL; _Recompiler = NULL; _MMU = NULL; @@ -614,6 +603,8 @@ bool CN64System::SetActiveSystem( bool bActive ) void CN64System::InitRegisters( bool bPostPif, CMipsMemory & MMU ) { + m_Reg.Reset(); + //COP0 Registers m_Reg.RANDOM_REGISTER = 0x1F; m_Reg.COUNT_REGISTER = 0x5000; @@ -850,7 +841,6 @@ void CN64System::CpuStopped ( void ) { { _Plugins->ShutDownPlugins(); } - Reset(); if (m_hPauseEvent) { CloseHandle(m_hPauseEvent); @@ -1135,9 +1125,9 @@ bool CN64System::SaveState(void) //Open the file if (_Settings->LoadDword(Game_FuncLookupMode) == FuncFind_ChangeMemory) { - if (GetRecompiler()) + if (m_Recomp) { - GetRecompiler()->ResetRecompCode(); + m_Recomp->ResetRecompCode(); } } @@ -1332,15 +1322,11 @@ bool CN64System::LoadState(LPCSTR FileName) { MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2); if (result == IDNO) { return FALSE; } } + m_Reg.Reset(); + _MMU->UnProtectMemory(0x80000000,0x80000000 + _Settings->LoadDword(Game_RDRamSize) - 4); _MMU->UnProtectMemory(0xA4000000,0xA4001FFC); _Settings->SaveDword(Game_RDRamSize,SaveRDRAMSize); - WriteTrace(TraceError,"Make sure memory is tracking changes to Game_RDRamSize"); -#ifdef tofix - if (SaveRDRAMSize != _Settings->LoadDword(Game_RDRamSize)) { - //_MMU->FixRDramSize(); - } -#endif unzReadCurrentFile(file,&NextVITimer,sizeof(NextVITimer)); unzReadCurrentFile(file,&m_Reg.m_PROGRAM_COUNTER,sizeof(m_Reg.m_PROGRAM_COUNTER)); unzReadCurrentFile(file,m_Reg.m_GPR,sizeof(_int64)*32); @@ -1388,6 +1374,7 @@ bool CN64System::LoadState(LPCSTR FileName) { MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2); if (result == IDNO) { return FALSE; } } + m_Reg.Reset(); _Notify->BreakPoint(__FILE__,__LINE__); _MMU->UnProtectMemory(0x80000000,0x80000000 + _Settings->LoadDword(Game_RDRamSize) - 4); _MMU->UnProtectMemory(0xA4000000,0xA4001FFC); @@ -1431,11 +1418,12 @@ bool CN64System::LoadState(LPCSTR FileName) { m_Reg.RANDOM_REGISTER += 32 - m_Reg.WIRED_REGISTER; } WriteTrace(TraceDebug,"CN64System::LoadState 1"); - if (GetRecompiler()) + if (m_Recomp) { - GetRecompiler()->ResetRecompCode(); + m_Recomp->ResetRecompCode(); } + SoftReset(); //Fix up timer m_Reg.m_CP0[32] = 0; WriteTrace(TraceDebug,"CN64System::LoadState 2"); diff --git a/Source/Project64/N64 System/N64 Class.h b/Source/Project64/N64 System/N64 Class.h index bc291e346..1fb52d5f0 100644 --- a/Source/Project64/N64 System/N64 Class.h +++ b/Source/Project64/N64 System/N64 Class.h @@ -43,11 +43,7 @@ public: 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; } +// inline CPlugins * Plugins ( void ) const { return m_Plugins; } inline bool DmaUsed ( void ) const { return m_DMAUsed; } inline void SetDmaUsed ( bool DMAUsed) { m_DMAUsed = DMAUsed; } diff --git a/Source/Project64/N64 System/Recompiler/Code Section.cpp b/Source/Project64/N64 System/Recompiler/Code Section.cpp index aafa08886..6426a9566 100644 --- a/Source/Project64/N64 System/Recompiler/Code Section.cpp +++ b/Source/Project64/N64 System/Recompiler/Code Section.cpp @@ -88,7 +88,6 @@ CCodeSection::CCodeSection( CCodeBlock * CodeBlock, DWORD EnterPC, DWORD ID) : /* Test2 = 0; InLoop = false; - DelaySlotSection = false; */ if (&CodeBlock->EnterSection() == this) diff --git a/Source/Project64/N64 System/Recompiler/Delay Slot Map Class.cpp b/Source/Project64/N64 System/Recompiler/Delay Slot Map Class.cpp index 1a8fcdf9a..716dda68f 100644 --- a/Source/Project64/N64 System/Recompiler/Delay Slot Map Class.cpp +++ b/Source/Project64/N64 System/Recompiler/Delay Slot Map Class.cpp @@ -1,77 +1,2 @@ #include "stdafx.h" -CDelaySlotFunctionMap::CDelaySlotFunctionMap() -{ -} - -CDelaySlotFunctionMap::~CDelaySlotFunctionMap() -{ - Reset(); -} - -CCompiledFunc * CDelaySlotFunctionMap::AddFunctionInfo ( DWORD vAddr, DWORD pAddr ) -{ - Notify().BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (FunctionMap.find(vAddr) != FunctionMap.end()) - { - Notify().BreakPoint(__FILE__,__LINE__); - } - - CCompiledFunc * info = new CCompiledFunc(vAddr,pAddr); - FunctionMap.insert(FUNCTION_MAP::value_type(vAddr,info)); - return info; - - Notify().BreakPoint(__FILE__,__LINE__); -#endif - return NULL; -} - -CCompiledFunc * CDelaySlotFunctionMap::FindFunction ( DWORD vAddr, int Length ) -{ - DWORD Start = ((vAddr + 0xFFF) >> 0xC); - DWORD End = ((vAddr + Length) >> 0xC); - for (DWORD i = Start; i < End; i++) - { - CCompiledFunc * info = FindFunction(i << 0xC); - if (info) - { - return info; - } - } - return NULL; -} - -CCompiledFunc * CDelaySlotFunctionMap::FindFunction ( DWORD vAddr ) const -{ - FUNCTION_MAP::const_iterator iter = FunctionMap.find(vAddr); - if (iter == FunctionMap.end()) - { - return NULL; - } - return iter->second; -} - - -void CDelaySlotFunctionMap::Remove ( CCompiledFunc * info ) -{ - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - FUNCTION_MAP::iterator iter = FunctionMap.find(info->VAddrEnter()); - if (iter != FunctionMap.end()) - { - delete iter->second; - FunctionMap.erase(iter); - - } -#endif -} - -void CDelaySlotFunctionMap::Reset ( void ) -{ - for (FUNCTION_MAP::iterator iter = FunctionMap.begin(); iter != FunctionMap.end(); iter++) - { - delete iter->second; - } - FunctionMap.clear(); -} diff --git a/Source/Project64/N64 System/Recompiler/Function Map Class.cpp b/Source/Project64/N64 System/Recompiler/Function Map Class.cpp index 424d156e6..ac4a073a1 100644 --- a/Source/Project64/N64 System/Recompiler/Function Map Class.cpp +++ b/Source/Project64/N64 System/Recompiler/Function Map Class.cpp @@ -8,23 +8,7 @@ CFunctionMap::CFunctionMap() : CFunctionMap::~CFunctionMap() { - if (m_FunctionTable) - { - for (int i = 0, n = 0x100000; i < n; i++) - { - if (m_FunctionTable[i] != NULL) - { - delete m_FunctionTable[i]; - } - } - VirtualFree( m_FunctionTable, 0 , MEM_RELEASE); - m_FunctionTable = NULL; - } - if (m_DelaySlotTable) - { - VirtualFree( m_DelaySlotTable, 0 , MEM_RELEASE); - m_DelaySlotTable = NULL; - } + CleanBuffers(); } bool CFunctionMap::AllocateMemory() @@ -50,6 +34,37 @@ bool CFunctionMap::AllocateMemory() return true; } +void CFunctionMap::CleanBuffers ( void ) +{ + if (m_FunctionTable) + { + for (int i = 0, n = 0x100000; i < n; i++) + { + if (m_FunctionTable[i] != NULL) + { + delete m_FunctionTable[i]; + } + } + VirtualFree( m_FunctionTable, 0 , MEM_RELEASE); + m_FunctionTable = NULL; + } + if (m_DelaySlotTable) + { + VirtualFree( m_DelaySlotTable, 0 , MEM_RELEASE); + m_DelaySlotTable = NULL; + } +} + +void CFunctionMap::Reset ( void ) +{ + bool bAllocate = m_FunctionTable != NULL; + CleanBuffers(); + if (bAllocate) + { + AllocateMemory(); + } + +} /* CFunctionMap::~CFunctionMap() diff --git a/Source/Project64/N64 System/Recompiler/Function Map Class.h b/Source/Project64/N64 System/Recompiler/Function Map Class.h index f1dec346f..dcb6cc52d 100644 --- a/Source/Project64/N64 System/Recompiler/Function Map Class.h +++ b/Source/Project64/N64 System/Recompiler/Function Map Class.h @@ -8,6 +8,13 @@ protected: ~CFunctionMap(); bool AllocateMemory ( void ); + void Reset ( void ); + + inline PCCompiledFunc_TABLE * FunctionTable ( void ) const { return m_FunctionTable; } + inline BYTE ** DelaySlotTable ( void ) const { return m_DelaySlotTable; } + +private: + void CleanBuffers ( void ); PCCompiledFunc_TABLE * m_FunctionTable; BYTE ** m_DelaySlotTable; diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Class.cpp b/Source/Project64/N64 System/Recompiler/Recompiler Class.cpp index c3369ea19..4fd89385c 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Class.cpp +++ b/Source/Project64/N64 System/Recompiler/Recompiler Class.cpp @@ -3,10 +3,8 @@ CRecompiler::CRecompiler(CProfiling & Profile, bool & EndEmulation ) : m_Profile(Profile), PROGRAM_COUNTER(_Reg->m_PROGRAM_COUNTER), - m_EndEmulation(EndEmulation), - m_FunctionsDelaySlot() + m_EndEmulation(EndEmulation) { - } CRecompiler::~CRecompiler() @@ -30,18 +28,6 @@ void CRecompiler::Run() WriteTrace(TraceError,"CRecompiler::Run: CRecompMemory::AllocateMemory failed"); return; } - - WriteTrace(TraceError,"CRecompiler::Run Fix _MMU->AllocateRecompilerMemory"); -#ifdef tofix - if (!_MMU->AllocateRecompilerMemory(LookUpMode() != FuncFind_VirtualLookup && LookUpMode() != FuncFind_ChangeMemory)) - { - return; - } - JumpTable = _MMU->GetJumpTable(); - RecompCode = _MMU->GetRecompCode(); -#endif - - ResetRecompCode(); m_EndEmulation = false; WriteTrace(TraceError,"CRecompiler::Run Fix g_MemoryStack"); @@ -82,7 +68,7 @@ void CRecompiler::RecompilerMain_VirtualTable ( void ) { while(!m_EndEmulation) { - PCCompiledFunc_TABLE & table = m_FunctionTable[PROGRAM_COUNTER >> 0xC]; + PCCompiledFunc_TABLE & table = FunctionTable()[PROGRAM_COUNTER >> 0xC]; DWORD TableEntry = (PROGRAM_COUNTER & 0xFFF) >> 2; if (table) { @@ -461,77 +447,14 @@ void CRecompiler::RecompilerMain_Lookup( void ) void CRecompiler::ResetRecompCode() { - /* - RecompPos() = RecompCode; - - m_Functions.Reset(); - m_FunctionsDelaySlot.Reset(); - if (JumpTable) - { - memset(JumpTable,0,_MMU->RdramSize()); - memset(JumpTable + (0x04000000 >> 2),0,0x1000); - memset(JumpTable + (0x04001000 >> 2),0,0x1000); - if (bRomInMemory()) - { - memset(JumpTable + (0x10000000 >> 2),0,RomFileSize); - } - } -#ifdef to_clean - DWORD count, OldProtect; - if (SelfModCheck == ModCode_ChangeMemory) { - DWORD count, PAddr, Value; - - for (count = 0; count < TargetIndex; count++) { - PAddr = OrigMem[(WORD)(count)].PAddr; - Value = *(DWORD *)(RDRAM + PAddr); - if ( ((Value >> 16) == 0x7C7C) && ((Value & 0xFFFF) == count)) { - *(DWORD *)(RDRAM + PAddr) = OrigMem[(WORD)(count)].OriginalValue; - } - } - } - TargetIndex = 0; - - //Jump Table - for (count = 0; count < (RdramSize >> 12); count ++ ) { - if (N64_Blocks.NoOfRDRamBlocks[count] > 0) { - N64_Blocks.NoOfRDRamBlocks[count] = 0; - memset(JumpTable + (count << 10),0,0x1000); - *(DelaySlotTable + count) = NULL; - - if (VirtualProtect((RDRAM + (count << 12)), 4, PAGE_READWRITE, &OldProtect) == 0) { - DisplayError("Failed to unprotect %X\n1", (count << 12)); - } - } - } - - if (N64_Blocks.NoOfDMEMBlocks > 0) { - N64_Blocks.NoOfDMEMBlocks = 0; - memset(JumpTable + (0x04000000 >> 2),0,0x1000); - *(DelaySlotTable + (0x04000000 >> 12)) = NULL; - if (VirtualProtect((RDRAM + 0x04000000), 4, PAGE_READWRITE, &OldProtect) == 0) { - DisplayError("Failed to unprotect %X\n0", 0x04000000); - } - } - if (N64_Blocks.NoOfIMEMBlocks > 0) { - N64_Blocks.NoOfIMEMBlocks = 0; - memset(JumpTable + (0x04001000 >> 2),0,0x1000); - *(DelaySlotTable + (0x04001000 >> 12)) = NULL; - if (VirtualProtect((RDRAM + 0x04001000), 4, PAGE_READWRITE, &OldProtect) == 0) { - DisplayError("Failed to unprotect %X\n4", 0x04001000); - } - } -// if (N64_Blocks.NoOfPifRomBlocks > 0) { -// N64_Blocks.NoOfPifRomBlocks = 0; -// memset(JumpTable + (0x1FC00000 >> 2),0,0x1000); -// } -#endif - */ + CRecompMemory::Reset(); + CFunctionMap::Reset(); } BYTE * CRecompiler::CompileDelaySlot(DWORD PC) { int Index = PC >> 0xC; - BYTE * delayFunc = m_DelaySlotTable[Index]; + BYTE * delayFunc = DelaySlotTable()[Index]; if (delayFunc) { return delayFunc; @@ -553,7 +476,8 @@ BYTE * CRecompiler::CompileDelaySlot(DWORD PC) CCompiledFunc * Func = new CCompiledFunc(CodeBlock); delayFunc = (BYTE *)Func->Function(); - m_DelaySlotTable[Index] = delayFunc; + DelaySlotTable()[Index] = delayFunc; + delete Func; return delayFunc; } @@ -1889,12 +1813,19 @@ void CRecompiler::ClearRecompCode_Virt(DWORD Address, int length,REMOVE_REASON R case FuncFind_VirtualLookup: { DWORD AddressIndex = Address >> 0xC; + BYTE ** DelaySlotFuncs = DelaySlotTable(); + + if ((Address & 0xFFC) == 0 && DelaySlotFuncs[AddressIndex] != NULL) + { + DelaySlotFuncs[AddressIndex] = NULL; + } + DWORD WriteStart = (Address & 0xFFC); DWORD DataInBlock = 0x1000 - WriteStart; int DataToWrite = length < DataInBlock ? length : DataInBlock; int DataLeft = length - DataToWrite; - PCCompiledFunc_TABLE & table = m_FunctionTable[AddressIndex]; + PCCompiledFunc_TABLE & table = FunctionTable()[AddressIndex]; if (table) { memset(((BYTE *)table) + WriteStart,0,DataToWrite); diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Class.h b/Source/Project64/N64 System/Recompiler/Recompiler Class.h index dddfbf03e..1df992c87 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Class.h +++ b/Source/Project64/N64 System/Recompiler/Recompiler Class.h @@ -38,10 +38,6 @@ private: //Quick access to registers DWORD & PROGRAM_COUNTER; - - //Functions - CDelaySlotFunctionMap m_FunctionsDelaySlot; - //CFunctionMap m_Functions; CCompiledFunc * CompilerCode ( void ); bool Compiler4300iBlock ( CCompiledFunc * info ); @@ -54,7 +50,6 @@ private: bool FixConstants ( CCodeSection * Section, DWORD Test ); bool InheritParentInfo ( CCodeSection * Section ); void InheritConstants ( CCodeSection * Section ); -// bool IsAllParentLoops ( CCodeSection * Section, CCodeSection * Parent, bool IgnoreIfCompiled, DWORD Test ); bool FillSectionInfo ( CCodeSection * Section, STEP_TYPE StartStepType ); void SyncRegState ( CCodeSection * Section, CRegInfo * SyncTo ); CCodeSection * ExistingSection( CCodeSection * StartSection, DWORD Addr, DWORD Test); diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Memory.cpp b/Source/Project64/N64 System/Recompiler/Recompiler Memory.cpp index 479719a50..f550a303f 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Memory.cpp +++ b/Source/Project64/N64 System/Recompiler/Recompiler Memory.cpp @@ -35,6 +35,7 @@ bool CRecompMemory::AllocateMemory() } m_RecompSize = InitialCompileBufferSize; m_RecompPos = m_RecompCode; + memset(m_RecompCode,0,InitialCompileBufferSize); return true; } @@ -57,3 +58,8 @@ void CRecompMemory::CheckRecompMem ( void ) _Notify->FatalError(MSG_MEM_ALLOC_ERROR); } } + +void CRecompMemory::Reset() +{ + m_RecompPos = m_RecompCode; +} \ No newline at end of file diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Memory.h b/Source/Project64/N64 System/Recompiler/Recompiler Memory.h index 27e2ab768..2d6f87324 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Memory.h +++ b/Source/Project64/N64 System/Recompiler/Recompiler Memory.h @@ -7,6 +7,7 @@ protected: bool AllocateMemory ( void ); void CheckRecompMem ( void ); + void Reset ( void ); inline BYTE * RecompPos ( void ) const { return m_RecompPos; } diff --git a/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp b/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp index a62671bc9..40b1e4513 100644 --- a/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp +++ b/Source/Project64/N64 System/Recompiler/Recompiler Ops.cpp @@ -151,12 +151,8 @@ void CRecompilerOps::Compile_Branch (CRecompilerOps::BranchFunction CompareFunc, } if (FallInfo->TargetPC <= m_CompilePC) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - UpdateCounters(&(FallInfo->RegSet.BlockCycleCount()),&(FallInfo->RegSet.BlockRandomModifier()),true); - m_Section->CompileSystemCheck(FallInfo->TargetPC,FallInfo->RegSet); + UpdateCounters(m_RegWorkingSet,true,true); ResetX86Protection(); -#endif } } else { if (m_Section->m_ContinueSection != NULL) { @@ -1427,7 +1423,7 @@ void CRecompilerOps::CACHE (void){ AddConstToX86Reg(x86_EAX,(short)m_Opcode.offset); Push(x86_EAX); } - MoveConstToX86reg((DWORD)_N64System->GetRecompiler(),x86_ECX); + MoveConstToX86reg((DWORD)_Recompiler,x86_ECX); Call_Direct(AddressOf(CRecompiler::ClearRecompCode_Virt), "CRecompiler::ClearRecompCode_Virt"); AfterCallDirect(); break; @@ -1748,21 +1744,13 @@ void CRecompilerOps::SPECIAL_JR (void) { } } if ((m_CompilePC & 0xFFC) == 0xFFC) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix - if (IsMapped(m_Opcode.rs)) { - MoveX86regToVariable(cMipsRegLo(m_Opcode.rs),&JumpToLocation, "JumpToLocation"); + if (IsMapped(m_Opcode.rs)) { + Push(cMipsRegMapLo(m_Opcode.rs)); } else { - MoveX86regToVariable(Map_TempReg(x86_Any,m_Opcode.rs,FALSE),&JumpToLocation, "JumpToLocation"); + Push(Map_TempReg(x86_Any,m_Opcode.rs,FALSE)); } - MoveConstToVariable(m_CompilePC + 4,_PROGRAM_COUNTER,"PROGRAM_COUNTER"); - UpdateCounters(&m_RegWorkingSet.BlockCycleCount(),&m_RegWorkingSet.BlockRandomModifier(),FALSE); - m_RegWorkingSet.WriteBackRegisters(); - if (CPU_Type == CPU_SyncCores) { Call_Direct(SyncToPC, "SyncToPC"); } - MoveConstToVariable(DELAY_SLOT,&m_NextInstruction,"m_NextInstruction"); - Ret(); + m_Section->GenerateSectionLinkage(); m_NextInstruction = END_BLOCK; -#endif return; } if (DelaySlotEffectsCompare(m_CompilePC,m_Opcode.rs,0)) { @@ -1979,8 +1967,6 @@ void CRecompilerOps::SPECIAL_DSLLV (void) { } void CRecompilerOps::SPECIAL_DSRLV (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix BYTE * Jump[2]; CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); @@ -2004,34 +1990,33 @@ void CRecompilerOps::SPECIAL_DSRLV (void) { //if (Shift < 0x20) { //} else { //} - //CRecompilerOps::UnknownOpcode(); - //return; - } - Map_TempReg(x86_ECX,m_Opcode.rs,FALSE); - AndConstToX86Reg(x86_ECX,0x3F); - Map_GPR_64bit(m_Opcode.rd,m_Opcode.rt); - CompConstToX86reg(x86_ECX,0x20); - JaeLabel8("MORE32", 0); - Jump[0] = m_RecompPos - 1; - ShiftRightDouble(cMipsRegLo(m_Opcode.rd),MipsRegHi(m_Opcode.rd)); - ShiftRightUnsign(MipsRegHi(m_Opcode.rd)); - JmpLabel8("continue", 0); - Jump[1] = m_RecompPos - 1; - - //MORE32: - CPU_Message(""); - CPU_Message(" MORE32:"); - *((BYTE *)(Jump[0]))=(BYTE)(m_RecompPos - Jump[0] - 1); - MoveX86RegToX86Reg(MipsRegHi(m_Opcode.rd),cMipsRegLo(m_Opcode.rd)); - XorX86RegToX86Reg(MipsRegHi(m_Opcode.rd),MipsRegHi(m_Opcode.rd)); - AndConstToX86Reg(x86_ECX,0x1F); - ShiftRightUnsign(cMipsRegLo(m_Opcode.rd)); + CRecompilerOps::UnknownOpcode(); + } else { + Map_TempReg(x86_ECX,m_Opcode.rs,FALSE); + AndConstToX86Reg(x86_ECX,0x3F); + Map_GPR_64bit(m_Opcode.rd,m_Opcode.rt); + CompConstToX86reg(x86_ECX,0x20); + JaeLabel8("MORE32", 0); + Jump[0] = m_RecompPos - 1; + ShiftRightDouble(cMipsRegMapLo(m_Opcode.rd),cMipsRegMapHi(m_Opcode.rd)); + ShiftRightUnsign(cMipsRegMapHi(m_Opcode.rd)); + JmpLabel8("continue", 0); + Jump[1] = m_RecompPos - 1; + + //MORE32: + CPU_Message(""); + CPU_Message(" MORE32:"); + *((BYTE *)(Jump[0]))=(BYTE)(m_RecompPos - Jump[0] - 1); + MoveX86RegToX86Reg(cMipsRegMapHi(m_Opcode.rd),cMipsRegMapLo(m_Opcode.rd)); + XorX86RegToX86Reg(cMipsRegMapHi(m_Opcode.rd),cMipsRegMapHi(m_Opcode.rd)); + AndConstToX86Reg(x86_ECX,0x1F); + ShiftRightUnsign(cMipsRegMapLo(m_Opcode.rd)); - //continue: - CPU_Message(""); - CPU_Message(" continue:"); - *((BYTE *)(Jump[1]))=(BYTE)(m_RecompPos - Jump[1] - 1); -#endif + //continue: + CPU_Message(""); + CPU_Message(" continue:"); + *((BYTE *)(Jump[1]))=(BYTE)(m_RecompPos - Jump[1] - 1); + } } void CRecompilerOps::SPECIAL_DSRAV (void) { @@ -2075,13 +2060,11 @@ void CRecompilerOps::SPECIAL_DSRAV (void) { } void CRecompilerOps::SPECIAL_MULT ( void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); - cX86Protected(x86_EDX) = TRUE; + X86Protected(x86_EDX) = TRUE; Map_TempReg(x86_EAX,m_Opcode.rs,FALSE); - cX86Protected(x86_EDX) = FALSE; + X86Protected(x86_EDX) = FALSE; Map_TempReg(x86_EDX,m_Opcode.rt,FALSE); imulX86reg(x86_EDX); @@ -2092,7 +2075,6 @@ void CRecompilerOps::SPECIAL_MULT ( void) { ShiftRightSignImmed(x86_EDX,31); MoveX86regToVariable(x86_EAX,&_RegLO->UW[1],"_RegLO->UW[1]"); MoveX86regToVariable(x86_EDX,&_RegHI->UW[1],"_RegHI->UW[1]"); -#endif } void CRecompilerOps::SPECIAL_MULTU (void) { @@ -3867,9 +3849,8 @@ void CRecompilerOps::COP1_MF (void) { } void CRecompilerOps::COP1_DMF (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix x86Reg TempReg; + char Name[50]; CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); m_Section->CompileCop1Test(); @@ -3880,11 +3861,10 @@ void CRecompilerOps::COP1_DMF (void) { sprintf(Name,"_FPR_D[%d]",m_Opcode.fs); MoveVariableToX86reg((BYTE *)&_FPR_D[m_Opcode.fs],Name,TempReg); AddConstToX86Reg(TempReg,4); - MoveX86PointerToX86reg(MipsRegHi(m_Opcode.rt),TempReg); + MoveX86PointerToX86reg(cMipsRegMapHi(m_Opcode.rt),TempReg); sprintf(Name,"_FPR_D[%d]",m_Opcode.fs); MoveVariableToX86reg((BYTE *)&_FPR_D[m_Opcode.fs],Name,TempReg); - MoveX86PointerToX86reg(cMipsRegLo(m_Opcode.rt),TempReg); -#endif + MoveX86PointerToX86reg(cMipsRegMapLo(m_Opcode.rt),TempReg); } void CRecompilerOps::COP1_CF(void) { @@ -3924,8 +3904,6 @@ void CRecompilerOps::COP1_MT( void) { } void CRecompilerOps::COP1_DMT( void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix x86Reg TempReg; CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); @@ -3938,22 +3916,23 @@ void CRecompilerOps::COP1_DMT( void) { } UnMap_FPR(m_Opcode.fs,TRUE); TempReg = Map_TempReg(x86_Any,-1,FALSE); + char Name[50]; sprintf(Name,"_FPR_D[%d]",m_Opcode.fs); MoveVariableToX86reg((BYTE *)&_FPR_D[m_Opcode.fs],Name,TempReg); if (IsConst(m_Opcode.rt)) { MoveConstToX86Pointer(cMipsRegLo(m_Opcode.rt),TempReg); AddConstToX86Reg(TempReg,4); - if (Section->Is64Bit(m_Opcode.rt)) { + if (Is64Bit(m_Opcode.rt)) { MoveConstToX86Pointer(MipsRegHi(m_Opcode.rt),TempReg); } else { - MoveConstToX86Pointer(Section->MipsRegLo_S(m_Opcode.rt) >> 31,TempReg); + MoveConstToX86Pointer(MipsRegLo_S(m_Opcode.rt) >> 31,TempReg); } } else if (IsMapped(m_Opcode.rt)) { MoveX86regToX86Pointer(cMipsRegMapLo(m_Opcode.rt),TempReg); AddConstToX86Reg(TempReg,4); - if (Section->Is64Bit(m_Opcode.rt)) { - MoveX86regToX86Pointer(MipsRegHi(m_Opcode.rt),TempReg); + if (Is64Bit(m_Opcode.rt)) { + MoveX86regToX86Pointer(cMipsRegMapHi(m_Opcode.rt),TempReg); } else { MoveX86regToX86Pointer(Map_TempReg(x86_Any, m_Opcode.rt, TRUE),TempReg); } @@ -3963,7 +3942,6 @@ void CRecompilerOps::COP1_DMT( void) { AddConstToX86Reg(TempReg,4); MoveX86regToX86Pointer(Map_TempReg(Reg, m_Opcode.rt, TRUE),TempReg); } -#endif } @@ -4149,8 +4127,6 @@ void CRecompilerOps::COP1_S_MOV (void) { } void CRecompilerOps::COP1_S_TRUNC_L (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); m_Section->CompileCop1Test(); @@ -4158,7 +4134,6 @@ void CRecompilerOps::COP1_S_TRUNC_L (void) { Load_FPR_ToTop(m_Opcode.fd,m_Opcode.fs,CRegInfo::FPU_Float); } ChangeFPURegFormat(m_Opcode.fd,CRegInfo::FPU_Float,CRegInfo::FPU_Qword,CRegInfo::RoundTruncate); -#endif } void CRecompilerOps::COP1_S_CEIL_L (void) { //added by Witten @@ -4447,12 +4422,9 @@ void CRecompilerOps::COP1_D_ABS (void) { } void CRecompilerOps::COP1_D_NEG (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); Load_FPR_ToTop(m_Opcode.fd,m_Opcode.fs,CRegInfo::FPU_Double); fpuNeg(); -#endif } void CRecompilerOps::COP1_D_SQRT (void) { @@ -4700,8 +4672,6 @@ void CRecompilerOps::COP1_W_CVT_D (void) { /************************** COP1: L functions ************************/ void CRecompilerOps::COP1_L_CVT_S (void) { - _Notify->BreakPoint(__FILE__,__LINE__); -#ifdef tofix CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC)); m_Section->CompileCop1Test(); @@ -4709,7 +4679,6 @@ void CRecompilerOps::COP1_L_CVT_S (void) { Load_FPR_ToTop(m_Opcode.fd,m_Opcode.fs,CRegInfo::FPU_Qword); } ChangeFPURegFormat(m_Opcode.fd,CRegInfo::FPU_Qword,CRegInfo::FPU_Float,CRegInfo::RoundDefault); -#endif } void CRecompilerOps::COP1_L_CVT_D (void) { @@ -4783,7 +4752,7 @@ void CRecompilerOps::UpdateCounters ( CRegInfo & RegSet, bool CheckTimer, bool C BeforeCallDirect(); PushImm32(stdstr_f("%d",RegSet.GetBlockCycleCount()).c_str(),RegSet.GetBlockCycleCount()); PushImm32("_SyncSystem",(DWORD)_SyncSystem); - MoveConstToX86reg((DWORD)_N64System,x86_ECX); + MoveConstToX86reg((DWORD)_System,x86_ECX); Call_Direct(AddressOf(CN64System::UpdateSyncCPU),"CN64System::UpdateSyncCPU"); AfterCallDirect(); } diff --git a/Source/Project64/N64 System/System Globals.cpp b/Source/Project64/N64 System/System Globals.cpp index 1b87107e5..73fd52f8c 100644 --- a/Source/Project64/N64 System/System Globals.cpp +++ b/Source/Project64/N64 System/System Globals.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" -CN64System * _N64System = NULL; +CN64System * _System = NULL; +CN64System * _BaseSystem = NULL; CN64System * _SyncSystem = NULL; CRecompiler * _Recompiler = NULL; CMipsMemory * _MMU = NULL; //Memory of the n64 diff --git a/Source/Project64/N64 System/System Globals.h b/Source/Project64/N64 System/System Globals.h index 01f419134..ab4703aa7 100644 --- a/Source/Project64/N64 System/System Globals.h +++ b/Source/Project64/N64 System/System Globals.h @@ -1,7 +1,8 @@ extern CNotification * _Notify; extern CSettings * _Settings; -extern CN64System * _N64System; +extern CN64System * _System; +extern CN64System * _BaseSystem; extern CN64System * _SyncSystem; extern CRecompiler * _Recompiler; extern CMipsMemory * _MMU; //Memory of the n64 diff --git a/Source/Project64/Plugins/Plugin Class.cpp b/Source/Project64/Plugins/Plugin Class.cpp index cf52864ec..b5febb810 100644 --- a/Source/Project64/Plugins/Plugin Class.cpp +++ b/Source/Project64/Plugins/Plugin Class.cpp @@ -43,7 +43,7 @@ void CPlugins::PluginChanged ( CPlugins * _this ) { if (_Settings->LoadBool(GameRunning_CPU_Running) != 0) { - if (_N64System) { _N64System->ExternalEvent(SysEvent_ChangePlugins); } + if (_BaseSystem) { _BaseSystem->ExternalEvent(SysEvent_ChangePlugins); } } else { _this->Reset(); _Notify->RefreshMenu(); @@ -160,14 +160,14 @@ bool CPlugins::InitiateMainThread( void ) WriteTrace(TraceDebug,"CPlugins::Initiate 6"); WriteTrace(TraceGfxPlugin,"Initiate: Starting"); - if (!m_Gfx->Initiate(_N64System,_RenderWindow)) { return false; } + if (!m_Gfx->Initiate(_System,_RenderWindow)) { return false; } WriteTrace(TraceGfxPlugin,"Initiate: Done"); WriteTrace(TraceDebug,"CPlugins::Initiate 7"); - if (!m_Audio->Initiate(_N64System,_RenderWindow)) { return false; } + if (!m_Audio->Initiate(_System,_RenderWindow)) { return false; } WriteTrace(TraceDebug,"CPlugins::Initiate 8"); - if (!m_Control->Initiate(_N64System,_RenderWindow)) { return false; } + if (!m_Control->Initiate(_System,_RenderWindow)) { return false; } WriteTrace(TraceRSP ,"Initiate: Starting"); - if (!m_RSP->Initiate(this,_N64System)) { return false; } + if (!m_RSP->Initiate(this,_System)) { return false; } WriteTrace(TraceRSP,"Initiate: Done"); WriteTrace(TraceDebug,"CPlugins::Initiate 10"); diff --git a/Source/Project64/Project64.dsp b/Source/Project64/Project64.dsp index e2cb0d183..4ff7a291e 100644 --- a/Source/Project64/Project64.dsp +++ b/Source/Project64/Project64.dsp @@ -586,6 +586,8 @@ SOURCE="3rd Party\zlib\UNZIP.C" !IF "$(CFG)" == "Project64 - Win32 Release" +# SUBTRACT CPP /YX /Yc /Yu + !ELSEIF "$(CFG)" == "Project64 - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu @@ -601,6 +603,8 @@ SOURCE="3rd Party\zlib\zip.c" !IF "$(CFG)" == "Project64 - Win32 Release" +# SUBTRACT CPP /YX /Yc /Yu + !ELSEIF "$(CFG)" == "Project64 - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu @@ -617,6 +621,8 @@ SOURCE="3rd Party\7zip.cpp" !IF "$(CFG)" == "Project64 - Win32 Release" +# SUBTRACT CPP /YX /Yc /Yu + !ELSEIF "$(CFG)" == "Project64 - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu @@ -632,6 +638,8 @@ SOURCE="3rd Party\Processor Info.cpp" !IF "$(CFG)" == "Project64 - Win32 Release" +# SUBTRACT CPP /YX /Yc /Yu + !ELSEIF "$(CFG)" == "Project64 - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu diff --git a/Source/Project64/Settings/Settings Class.cpp b/Source/Project64/Settings/Settings Class.cpp index 109c39919..78c20c1d5 100644 --- a/Source/Project64/Settings/Settings Class.cpp +++ b/Source/Project64/Settings/Settings Class.cpp @@ -430,23 +430,6 @@ void CSettings::RegisterSetting ( CSettings * _this, SettingID ID, SettingID Def } } -/*#include - -*/ - -/*CSettings::CSettings() : - RomIniFile(NULL), - CheatIniFile(NULL), - SettingsIniFile(NULL), - UnknownSetting_RSP(NULL), - UnknownSetting_GFX(NULL), - UnknownSetting_AUDIO(NULL), - UnknownSetting_CTRL(NULL) -{ -} - -*/ - bool CSettings::Initilize( const char * AppName ) { AddHowToHandleSetting(); @@ -964,709 +947,6 @@ void CSettings::UnknownSetting (SettingID Type) #endif } -/*CSettings::~CSettings() { - if (RomIniFile) { - delete RomIniFile; - RomIniFile = NULL; - } - if (CheatIniFile) { - delete CheatIniFile; - CheatIniFile = NULL; - } - if (SettingsIniFile) - { - delete SettingsIniFile; - SettingsIniFile = NULL; - } -} - -void CSettings::Load(SettingID Type, char * Buffer, int BufferSize) { - if (Type != IsValidExe) - { - WriteTraceF(TraceSettings,"CSettings::Load 1 - %d",Type); - } - - //Find out the information for handling the setting type from the list - SETTING_MAP::iterator FindInfo = SettingInfo.find(Type); - if (FindInfo == SettingInfo.end()) - { //if not found do nothing - UnknownSetting(Type); - return; - } - CSettingInfo * Info = &FindInfo->second; - - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,Buffer, BufferSize); - } - //Copy Default String - - if (Info->Location == ConstString) { - strncpy(Buffer,Info->Name.c_str(),BufferSize); - } else if (Info->Location == RelativePath) { - char path_buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR]; - char fname[_MAX_FNAME],ext[_MAX_EXT]; - - GetModuleFileName(NULL,path_buffer,sizeof(path_buffer)); - _splitpath( path_buffer, drive, dir, fname, ext ); - sprintf(path_buffer,"%s%s",drive,dir); - if (Info->SubNode.size() > 0) { - strncat(path_buffer,Info->SubNode.c_str(),sizeof(path_buffer)); - strncat(path_buffer,"\\",sizeof(path_buffer)); - } - if (Info->Name.size() > 0) { - strncat(path_buffer,Info->Name.c_str(),sizeof(path_buffer)); - } - strncpy(Buffer,path_buffer,BufferSize); - } else if (Info->Location == TemporarySetting) { - CGuard Guard(m_CS); - - TEMP_SETTING_MAP::iterator TempInfo = TempKeys.find(Type); - if (TempInfo != TempKeys.end()) { - CTempInfo * temp = &TempInfo->second; - if (temp->DataType == Data_String) { - strncpy(Buffer,temp->String,BufferSize); - } - } - } else if (Info->Location == LocalSettings) { - if (SettingsIniFile == NULL) { return; } - if (Info->DataType == Data_String) - { - stdstr_f Ident("%s",Info->SubNode.c_str()); - if (Ident.empty()) - { - Ident = "default"; - } - Ident.replace("\\","-"); - SettingsIniFile->GetString(Ident.c_str(),Info->Name.c_str(),Buffer,Buffer,BufferSize); - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - } else if (Info->Location == InRegistry) { - char String[255]; - - //Get the location in the registry we are writing to - strncpy(String,Registrylocation,sizeof(String)); - if (Info->SubNode.size() > 0) { - strncat(String,"\\",sizeof(String)); - strncat(String,Info->SubNode.c_str(),sizeof(String)); - } - - //Open the registry key - long lResult; - HKEY hKeyResults = 0; - lResult = RegOpenKeyEx( (HKEY)RegistryKey,String,0, KEY_ALL_ACCESS,&hKeyResults); - - if (lResult == ERROR_SUCCESS) { - //Get the value from the registry - DWORD RegType, Bytes = BufferSize; - - lResult = RegQueryValueEx(hKeyResults,Info->Name.c_str(),0,&RegType,(LPBYTE)(Buffer),&Bytes); - if (RegType != REG_SZ || lResult != ERROR_SUCCESS) { - //Reload Defaults just in case data has changed - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,Buffer, BufferSize); - } - } - RegCloseKey(hKeyResults); - } - } else if (Info->Location == RomSetting) { - if (RomIniFile == NULL) { return; } - if (Info->DataType == Data_String) { - RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Buffer,Buffer,BufferSize); - } - } else if (Info->Location == CheatSetting) { - if (CheatIniFile == NULL) { return; } - if (Info->DataType == Data_String) { - CheatIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Buffer,Buffer,BufferSize); - } - } else if (Info->Location == GameSetting) { - if (SettingsIniFile == NULL) { return; } - if (Info->DataType == Data_String) - { - char Ident[400]; - //Get the location in the registry we are writing to - sprintf(Ident,"%s%s%s",LoadString(ROM_IniKey).c_str(),Info->SubNode.empty()?"":"-",Info->SubNode.c_str()); - - int len = strlen(Ident); - for (int i = 0; i < len; i++) - { - if (Ident[i] == '\\') - { - Ident[i] = '-'; - } - } - SettingsIniFile->GetString(Ident,Info->Name.c_str(),Buffer,Buffer,BufferSize); - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - } else { - //unknown ?? -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } -} - -DWORD CSettings::LoadDword(SettingID Type ) { - if (Type != IsValidExe) - { - WriteTraceF(TraceSettings,"CSettings::Load 2 - %d",Type); - } - DWORD Value = 0; - Load(Type,Value); - return Value; -} - -stdstr CSettings::LoadString ( SettingID Type ) { - if (Type != IsValidExe) - { - WriteTraceF(TraceSettings,"CSettings::Load 3 - %d",Type); - } - - char Buffer[8000] = ""; - Load(Type,Buffer,sizeof(Buffer)); - return stdstr_f("%s",Buffer); -} - -void CSettings::UnknownSetting (SettingID Type) -{ - if (UnknownSetting_RSP) - { - if (Type >= FirstRSPDefaultSet && Type < LastRSPDefaultSet) - { - UnknownSetting_RSP(Type - FirstRSPDefaultSet); - return; - } - if (Type >= FirstRSPSettings && Type < LastRSPSettings) - { - UnknownSetting_RSP(Type - FirstRSPSettings); - return; - } - } - if (UnknownSetting_GFX) - { - if (Type >= FirstGfxDefaultSet && Type < LastGfxDefaultSet) - { - UnknownSetting_GFX(Type - FirstGfxDefaultSet); - return; - } - if (Type >= FirstGfxSettings && Type < LastGfxSettings) - { - UnknownSetting_GFX(Type - FirstGfxSettings); - return; - } - } - if (UnknownSetting_AUDIO) - { - if (Type >= FirstAudioDefaultSet && Type < LastAudioDefaultSet) - { - UnknownSetting_AUDIO(Type - FirstAudioDefaultSet); - return; - } - if (Type >= FirstAudioSettings && Type < LastAudioSettings) - { - UnknownSetting_AUDIO(Type - FirstAudioSettings); - return; - } - } - if (UnknownSetting_CTRL) - { - if (Type >= FirstCtrlDefaultSet && Type < LastCtrlDefaultSet) - { - UnknownSetting_CTRL(Type - FirstCtrlDefaultSet); - return; - } - if (Type >= FirstCtrlSettings && Type < LastCtrlSettings) - { - UnknownSetting_CTRL(Type - FirstCtrlSettings); - return; - } - } -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif -} - -void CSettings::Load(SettingID Type, DWORD & Value) -{ - if (Type == Default_False || Type == Default_True) - { - Value = (Type == Default_True); - return; - } - if (Type != IsValidExe) - { - WriteTraceF(TraceSettings,"CSettings::Load 4 - %d",Type); - } - - //Find out the information for handling the setting type from the list - SETTING_MAP::iterator FindInfo = SettingInfo.find(Type); - if (FindInfo == SettingInfo.end()) - { - //if not found do nothing - UnknownSetting(Type); - return; - } - CSettingInfo * Info = &FindInfo->second; - - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,Value); - } - if (Info->Location == ConstValue) { - Value = Info->Value; - } - else if (Info->Location == TemporarySetting) - { - CGuard Guard(m_CS); - - TEMP_SETTING_MAP::iterator TempInfo = TempKeys.find(Type); - if (TempInfo != TempKeys.end()) { - CTempInfo * temp = &TempInfo->second; - if (temp->DataType == Data_DWORD) { - Value = temp->Value; - } - } - } - else if (Info->Location == InRegistry) - { - char String[255]; - - //Get the location in the registry we are writing to - strncpy(String,Registrylocation,sizeof(String)); - if (Info->SubNode.size() > 0) { - strncat(String,"\\",sizeof(String)); - strncat(String,Info->SubNode.c_str(),sizeof(String)); - } - - //Open the registry key - long lResult; - HKEY hKeyResults = 0; - lResult = RegOpenKeyEx( (HKEY)RegistryKey,String,0, KEY_ALL_ACCESS,&hKeyResults); - - if (lResult == ERROR_SUCCESS) { - //Get the value from the registry - DWORD RegValue, RegType, Bytes = 4; - - lResult = RegQueryValueEx(hKeyResults,Info->Name.c_str(),0,&RegType,(LPBYTE)(&RegValue),&Bytes); - if (RegType == REG_DWORD && lResult == ERROR_SUCCESS) { - Value = RegValue; - } - RegCloseKey(hKeyResults); - } - } - else if (Info->Location == RomSetting) - { - if (RomIniFile == NULL) { return; } - if (Info->DataType == Data_DWORD) { - Value = RomIniFile->GetNumber(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Value); - } else if (Info->DataType == Data_CPUTYPE) { - char String [100]; - strcpy(String,""); - RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String,String,sizeof(String)); - if (strcmp(String,"Interpreter") == 0) { Value = CPU_Interpreter; } - else if (strcmp(String,"Recompiler") == 0) { Value = CPU_Recompiler; } - else if (strcmp(String,"SyncCores") == 0) { Value = CPU_SyncCores; } - else { Value = CPU_Default; } -// } else if (Info->DataType == Data_SelfMod) { -// char String [100]; -// strcpy(String,""); -// RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String,String,sizeof(String)); -// if (strcmp(String,"None") == 0) { *Value = ModCode_None; } -// else if (strcmp(String,"Cache") == 0) { *Value = ModCode_Cache; } -// else if (strcmp(String,"Protected Memory") == 0) { *Value = ModCode_ProtectedMemory; } -// else if (strcmp(String,"Check Memory") == 0) { *Value = ModCode_CheckMemoryCache; } -// else if (strcmp(String,"Check Memory & cache") == 0) { *Value = ModCode_CheckMemoryCache; } -// else if (strcmp(String,"Check Memory Advance") == 0) { *Value = ModCode_CheckMemory2; } -// else if (strcmp(String,"Change Memory") == 0) { *Value = ModCode_ChangeMemory; } - } else if (Info->DataType == Data_SaveChip) { - char String [100]; - strcpy(String,""); - RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String,String,sizeof(String)); - if (strcmp(String,"4kbit Eeprom") == 0) { Value = SaveChip_Eeprom_4K; } - else if (strcmp(String,"16kbit Eeprom") == 0) { Value = SaveChip_Eeprom_16K; } - else if (strcmp(String,"Sram") == 0) { Value = SaveChip_Sram; } - else if (strcmp(String,"FlashRam") == 0) { Value = SaveChip_FlashRam; } - } else if (Info->DataType == Data_OnOff) { - char String [100]; - strcpy(String,""); - RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String,String,sizeof(String)); - if (strcmp(String,"On") == 0) { Value = 1; } - if (strcmp(String,"Off") == 0) { Value = 0; } - } else if (Info->DataType == Data_YesNo) { - char String [100]; - strcpy(String,""); - RomIniFile->GetString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String,String,sizeof(String)); - if (strcmp(String,"Yes") == 0) { Value = true; } - if (strcmp(String,"No") == 0) { Value = false; } - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - - } - else if (Info->Location == GameSetting) - { - char Ident[400]; - //Get the location in the registry we are writing to - sprintf(Ident,"%s%s%s",LoadString(ROM_IniKey).c_str(),Info->SubNode.empty()?"":"-",Info->SubNode.c_str()); - - int len = strlen(Ident); - for (int i = 0; i < len; i++) - { - if (Ident[i] == '\\') - { - Ident[i] = '-'; - } - } - - if (Info->DataType == Data_DWORD) - { - Value = SettingsIniFile->GetNumber(Ident,Info->Name.c_str(),Value); - } - else - { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - - } - else if (Info->Location == LocalSettings) - { - if (SettingsIniFile == NULL) { return; } - stdstr_f Ident("%s",Info->SubNode.c_str()); - if (Ident.empty()) - { - Ident = "default"; - } - Ident.replace("\\","-"); - if (Info->DataType == Data_DWORD) - { - Value = SettingsIniFile->GetNumber(Ident.c_str(),Info->Name.c_str(),Value); - } - else - { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } -} - -void CSettings::SaveString(SettingID Type, const char * Buffer) { - //Find out the information for handling the setting type from the list - SETTING_MAP::iterator FindInfo = SettingInfo.find(Type); - if (FindInfo == SettingInfo.end()) - { //if not found do nothing - UnknownSetting(Type); - return; - } - CSettingInfo * Info = &FindInfo->second; - - //make sure the setting type is a string - if (Info->DataType != Data_String) - { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - return; - } - - //create an entry in the temporary settings - if (Info->Location == TemporarySetting) { - CGuard Guard(m_CS); - - TEMP_SETTING_MAP::iterator TempInfo = TempKeys.find(Type); - if (TempInfo != TempKeys.end()) { TempKeys.erase(TempInfo); } //free the previous memory - - TempKeys.insert(TEMP_SETTING_MAP::value_type(Type,CTempInfo(Type,Buffer))); - } - - //Save data to the registry - else if (Info->Location == InRegistry) { - char String[255]; - - //Get the location in the registry we are writing to - strncpy(String,Registrylocation,sizeof(String)); - if (Info->SubNode.size() > 0) { - strncat(String,"\\",sizeof(String)); - strncat(String,Info->SubNode.c_str(),sizeof(String)); - } - - //Create the target Key - DWORD Disposition = 0; - HKEY hKeyResults = 0; - long lResult; - - lResult = RegCreateKeyEx( (HKEY)RegistryKey, String,0,"", REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS,NULL, &hKeyResults,&Disposition); - if (lResult == ERROR_SUCCESS) { - RegSetValueEx(hKeyResults,Info->Name.c_str(),0, REG_SZ,(CONST BYTE *)(Buffer),strlen(Buffer)); - } - RegCloseKey(hKeyResults); - } - else if (Info->Location == RomSetting) { - if (RomIniFile == NULL) { return; } - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Buffer); - } - else if (Info->Location == CheatSetting) { - if (CheatIniFile == NULL) { return; } - if (Info->DataType == Data_String) { - stdstr DefaultValue; - if (Info->DefaultValue != Default_None) { - DefaultValue = LoadString(Info->DefaultValue); - } - if (DefaultValue == Buffer) { - CheatIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),NULL); - } else { - CheatIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Buffer); - } - } else { - Notify().BreakPoint(__FILE__,__LINE__); - } - } - else if (Info->Location == GameSetting) { - char Ident[400]; - //Get the location in the registry we are writing to - sprintf(Ident,"%s%s%s",LoadString(ROM_IniKey).c_str(),Info->SubNode.empty()?"":"-",Info->SubNode.c_str()); - - int len = strlen(Ident); - for (int i = 0; i < len; i++) - { - if (Ident[i] == '\\') - { - Ident[i] = '-'; - } - } - - stdstr DefaultValue; - if (Info->DefaultValue != Default_None) { - DefaultValue = LoadString(Info->DefaultValue); - } - - if (Info->DataType == Data_String) - { - if (DefaultValue == Buffer) { - SettingsIniFile->SaveString(Ident,Info->Name.c_str(),NULL); - } else { - SettingsIniFile->SaveString(Ident,Info->Name.c_str(),Buffer); - } - } - else - { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - } else if (Info->Location == LocalSettings) { - if (SettingsIniFile == NULL) { return; } - stdstr DefaultValue; - if (Info->DefaultValue != Default_None) { - DefaultValue = LoadString(Info->DefaultValue); - } - stdstr_f Ident("%s",Info->SubNode.c_str()); - Ident.replace("\\","-"); - if (Ident.empty()) - { - Ident = "default"; - } - - if (DefaultValue == Buffer) { - SettingsIniFile->SaveString(Ident.c_str(),Info->Name.c_str(),NULL); - } else { - SettingsIniFile->SaveString(Ident.c_str(),Info->Name.c_str(),Buffer); - } - } - else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } -} - -void CSettings::SaveDword(SettingID Type, DWORD Value) { - //Find out the information for handling the setting type from the list - SETTING_MAP::iterator FindInfo = SettingInfo.find(Type); - if (FindInfo == SettingInfo.end()) - { //if not found do nothing - UnknownSetting(Type); - return; - } - CSettingInfo * Info = &FindInfo->second; - - //create an entry in the temporary settings - if (Info->Location == TemporarySetting) { - CGuard Guard(m_CS); - - TEMP_SETTING_MAP::iterator TempInfo = TempKeys.find(Type); - if (TempInfo != TempKeys.end()) { TempKeys.erase(TempInfo); } //free the previous memory - TempKeys.insert(TEMP_SETTING_MAP::value_type(Type,CTempInfo(Type,Value))); - } else if (Info->Location == LocalSettings) { - if (SettingsIniFile == NULL) { return; } - - DWORD DefaultValue = 0; - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,DefaultValue); - } - stdstr_f Ident("%s",Info->SubNode.c_str()); - if (Ident.empty()) - { - Ident = "default"; - } - Ident.replace("\\","-"); - - if (Info->DefaultValue != Default_None && Value == DefaultValue) { - SettingsIniFile->SaveString(Ident.c_str(),Info->Name.c_str(),NULL); - } else { - SettingsIniFile->SaveNumber(Ident.c_str(),Info->Name.c_str(),Value); - } - } else if (Info->Location == InRegistry) { - char String[255]; - - //Get the location in the registry we are writing to - strncpy(String,Registrylocation,sizeof(String)); - if (Info->SubNode.size() > 0) { - strncat(String,"\\",sizeof(String)); - strncat(String,Info->SubNode.c_str(),sizeof(String)); - } - - //Create the target Key - DWORD Disposition = 0; - HKEY hKeyResults = 0; - long lResult; - - lResult = RegCreateKeyEx( (HKEY)RegistryKey, String,0,"", REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS,NULL, &hKeyResults,&Disposition); - if (lResult == ERROR_SUCCESS) { - RegSetValueEx(hKeyResults,Info->Name.c_str(),0, REG_DWORD,(CONST BYTE *)(&Value),sizeof(DWORD)); - } - RegCloseKey(hKeyResults); - } else if (Info->Location == RomSetting) { - if (RomIniFile == NULL) { return; } - if (Info->DataType == Data_DWORD) { - DWORD DefaultValue = 0; - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,DefaultValue); - } - if (Info->DefaultValue != Default_None && Value == DefaultValue) { - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),NULL); - } else { - RomIniFile->SaveNumber(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Value); - } - } else if (Info->DataType == Data_CPUTYPE) { - const char * String; - switch (Value) { - case CPU_Interpreter: String = "Interpreter"; break; - case CPU_Recompiler: String = "Recompiler"; break; - case CPU_SyncCores: String = "SyncCores"; break; - default: String = NULL; break; - } - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String); - } else if (Info->DataType == Data_SaveChip) { - const char * String; - switch (Value) { - case SaveChip_Eeprom_4K: String = "4kbit Eeprom"; break; - case SaveChip_Eeprom_16K: String = "16kbit Eeprom"; break; - case SaveChip_Sram: String = "Sram"; break; - case SaveChip_FlashRam: String = "FlashRam"; break; - default: String = NULL; break; - } - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String); -// } else if (Info->DataType == Data_SelfMod) { -// const char * String; -// switch (Value) { -// case ModCode_None: String = "None"; break; -// case ModCode_Cache: String = "Cache"; break; -// case ModCode_ProtectedMemory: String = "Protected Memory"; break; -// case ModCode_CheckMemoryCache: String = "Check Memory & cache"; break; -// case ModCode_CheckMemory2: String = "Check Memory Advance"; break; -// case ModCode_ChangeMemory: String = "Change Memory"; break; -// default: String = NULL; break; -// } -// RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String); - } else if (Info->DataType == Data_YesNo) { - DWORD DefaultValue = 0; - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,DefaultValue); - } - if (Info->DefaultValue != Default_None && Value == DefaultValue) { - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),NULL); - } else { - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),Value ? "Yes" : "No"); - } - } else if (Info->DataType == Data_OnOff) { - const char * String; - switch (Value) { - case 0: String = "Off"; break; - case 1: String = "On"; break; - default: String = NULL; break; - } - RomIniFile->SaveString(LoadString(ROM_IniKey).c_str(),Info->Name.c_str(),String); - - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - } else if (Info->Location == GameSetting) { - if (SettingsIniFile == NULL) { return; } - if (Info->DataType == Data_DWORD) - { - char Ident[400]; - //Get the location in the registry we are writing to - sprintf(Ident,"%s%s%s",LoadString(ROM_IniKey).c_str(),Info->SubNode.empty()?"":"-",Info->SubNode.c_str()); - - int len = strlen(Ident); - for (int i = 0; i < len; i++) - { - if (Ident[i] == '\\') - { - Ident[i] = '-'; - } - } - - DWORD DefaultValue = 0; - if (Info->DefaultValue != Default_None) { - Load(Info->DefaultValue,DefaultValue); - } - - if (Info->DefaultValue != Default_None && Value == DefaultValue) { - SettingsIniFile->SaveString(Ident,Info->Name.c_str(),NULL); - } else { - SettingsIniFile->SaveNumber(Ident,Info->Name.c_str(),Value); - } - } else{ -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - - - } else { -#ifdef _DEBUG - Notify().BreakPoint(__FILE__,__LINE__); -#endif - } - - for (SETTING_CHANGED_CB_LIST::iterator iter = m_CBDwordList.begin(); iter != m_CBDwordList.end(); iter ++) - { - SETTING_CHANGED_CB & item = *iter; - if (item.Type != Type) { continue; } - item.Func(item.Data); - } - -} -*/ - void CSettings::NotifyCallBacks( SettingID Type ) { SETTING_CALLBACK::iterator Callback = m_Callback.find(Type); diff --git a/Source/Project64/User Interface/Gui Class.cpp b/Source/Project64/User Interface/Gui Class.cpp index ad8ca31a7..9f3774ef7 100644 --- a/Source/Project64/User Interface/Gui Class.cpp +++ b/Source/Project64/User Interface/Gui Class.cpp @@ -298,7 +298,7 @@ int CMainGui::ProcessAllMessages (void) { MSG msg; while (GetMessage(&msg,NULL,0,0)) { - if (_N64System && _N64System->IsDialogMsg(&msg)) + if (_BaseSystem && _BaseSystem->IsDialogMsg(&msg)) { continue; } @@ -518,11 +518,10 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam } } } - if (CGuiSettings::bCPURunning() && _N64System) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins->Gfx() && Plugins->Gfx()->MoveScreen) { + if (CGuiSettings::bCPURunning() && _BaseSystem) { + if (_Plugins->Gfx() && _Plugins->Gfx()->MoveScreen) { WriteTrace(TraceGfxPlugin,"MoveScreen: Starting"); - Plugins->Gfx()->MoveScreen((int)(short) LOWORD(lParam), (int)(short) HIWORD(lParam)); + _Plugins->Gfx()->MoveScreen((int)(short) LOWORD(lParam), (int)(short) HIWORD(lParam)); WriteTrace(TraceGfxPlugin,"MoveScreen: Done"); } } @@ -612,11 +611,10 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (_this->m_bMainWindow && bCPURunning()) { - if (_N64System) + if (_BaseSystem) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins && Plugins->Control()->WM_KeyUp) { - Plugins->Control()->WM_KeyUp(wParam, lParam); + if (_Plugins && _Plugins->Control()->WM_KeyUp) { + _Plugins->Control()->WM_KeyUp(wParam, lParam); } } } @@ -628,12 +626,11 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (_this->m_bMainWindow && bCPURunning()) { - if (_N64System) + if (_BaseSystem) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins && Plugins->Control()->WM_KeyDown) + if (_Plugins && _Plugins->Control()->WM_KeyDown) { - Plugins->Control()->WM_KeyDown(wParam, lParam); + _Plugins->Control()->WM_KeyDown(wParam, lParam); } } } @@ -650,9 +647,9 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (_this->m_bMainWindow && bCPURunning() && bAutoSleep()) { - if (_N64System) + if (_BaseSystem) { - _N64System->ExternalEvent( SysEvent_ResumeCPU_AppGainedFocus ); + _BaseSystem->ExternalEvent( SysEvent_ResumeCPU_AppGainedFocus ); } } } @@ -667,9 +664,9 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (_this->m_bMainWindow && bCPURunning() && bAutoSleep()) { - if (_N64System) + if (_BaseSystem) { - _N64System->ExternalEvent( SysEvent_PauseCPU_AppLostFocus ); + _BaseSystem->ExternalEvent( SysEvent_PauseCPU_AppLostFocus ); } } } @@ -687,7 +684,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (!fActive && _Settings->LoadBool(UserInterface_InFullScreen)) { _Notify->WindowMode(); - if (bAutoSleep() && _N64System) + if (bAutoSleep() && _BaseSystem) { //System->ExternalEvent(PauseCPU_AppLostActiveDelayed ); } @@ -695,9 +692,9 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam } if (bAutoSleep()) { - if (_N64System) + if (_BaseSystem) { - _N64System->ExternalEvent(fActive ? SysEvent_ResumeCPU_AppGainedActive : SysEvent_PauseCPU_AppLostActive ); + _BaseSystem->ExternalEvent(fActive ? SysEvent_ResumeCPU_AppGainedActive : SysEvent_PauseCPU_AppLostActive ); } } } @@ -729,7 +726,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam if (_this == NULL) { break; } switch (LOWORD(wParam)) { - case ID_POPUPMENU_PLAYGAME: _N64System->RunFileImage(_this->CurrentedSelectedRom()); break; + case ID_POPUPMENU_PLAYGAME: _BaseSystem->RunFileImage(_this->CurrentedSelectedRom()); break; case ID_POPUPMENU_ROMDIRECTORY: _this->SelectRomDir(); break; case ID_POPUPMENU_REFRESHROMLIST: _this->RefreshRomBrowser(); break; case ID_POPUPMENU_ROMINFORMATION: @@ -771,20 +768,17 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam default: if (_this->m_Menu) { if (LOWORD(wParam) > 5000 && LOWORD(wParam) <= 5100 ) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins->RSP() && Plugins->RSP()->ProcessMenuItem != NULL) { - Plugins->RSP()->ProcessMenuItem(LOWORD(wParam)); + if (_Plugins->RSP() && _Plugins->RSP()->ProcessMenuItem != NULL) { + _Plugins->RSP()->ProcessMenuItem(LOWORD(wParam)); } } else if (LOWORD(wParam) > 5100 && LOWORD(wParam) <= 5200 ) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins->Gfx() && Plugins->Gfx()->ProcessMenuItem != NULL) { + if (_Plugins->Gfx() && _Plugins->Gfx()->ProcessMenuItem != NULL) { WriteTrace(TraceGfxPlugin,"ProcessMenuItem: Starting"); - Plugins->Gfx()->ProcessMenuItem(LOWORD(wParam)); + _Plugins->Gfx()->ProcessMenuItem(LOWORD(wParam)); WriteTrace(TraceGfxPlugin,"ProcessMenuItem: Done"); } } else if (LOWORD(wParam) > 5200 && LOWORD(wParam) <= 5300 ) { - CPlugins * Plugins = _N64System->Plugins(); - if (Plugins->Gfx() && Plugins->Gfx()->OnRomBrowserMenuItem != NULL) + if (_Plugins->Gfx() && _Plugins->Gfx()->OnRomBrowserMenuItem != NULL) { CN64Rom Rom; if (!Rom.LoadN64Image(_this->CurrentedSelectedRom(),true)) @@ -795,7 +789,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam _Notify->DisplayMessage(0,""); BYTE * RomHeader = Rom.GetRomAddress(); WriteTrace(TraceGfxPlugin,"OnRomBrowserMenuItem: Starting"); - Plugins->Gfx()->OnRomBrowserMenuItem(LOWORD(wParam),hWnd,RomHeader); + _Plugins->Gfx()->OnRomBrowserMenuItem(LOWORD(wParam),hWnd,RomHeader); WriteTrace(TraceGfxPlugin,"OnRomBrowserMenuItem: Done"); if (_Rom) { _Rom->SaveRomSettingID(); @@ -840,7 +834,7 @@ DWORD CALLBACK CMainGui::MainGui_Proc (WND_HANDLE hWnd, DWORD uMsg, DWORD wParam { if (uMsg == _this->m_InvalidExeMsg) { - _N64System->CloseCpu(); + _BaseSystem->CloseCpu(); MessageBox((HWND)hWnd,GS(MSG_INVALID_EXE),GS(MSG_INVALID_EXE_TITLE),MB_OK|MB_ICONERROR); PostQuitMessage(0); } diff --git a/Source/Project64/User Interface/Main Menu Class.cpp b/Source/Project64/User Interface/Main Menu Class.cpp index 115e42f80..7d104bc35 100644 --- a/Source/Project64/User Interface/Main Menu Class.cpp +++ b/Source/Project64/User Interface/Main Menu Class.cpp @@ -63,24 +63,24 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men switch (MenuID) { case ID_FILE_OPEN_ROM: { - stdstr File = _N64System->ChooseFileToOpen(hWnd); + stdstr File = _BaseSystem->ChooseFileToOpen(hWnd); if (File.length() > 0) { - _N64System->RunFileImage(File.c_str()); + _BaseSystem->RunFileImage(File.c_str()); } } break; case ID_FILE_ROM_INFO: { - _N64System->DisplayRomInfo(hWnd); + _BaseSystem->DisplayRomInfo(hWnd); } break; case ID_FILE_STARTEMULATION: _Gui->SaveWindowLoc(); - _N64System->StartEmulation(true); + _BaseSystem->StartEmulation(true); break; case ID_FILE_ENDEMULATION: WriteTrace(TraceDebug,"ID_FILE_ENDEMULATION"); - _N64System->CloseCpu(); + _BaseSystem->CloseCpu(); _Gui->SaveWindowLoc(); break; case ID_FILE_ROMDIRECTORY: @@ -94,20 +94,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"); - _N64System->ExternalEvent(SysEvent_ResetCPU_Soft); + _BaseSystem->ExternalEvent(SysEvent_ResetCPU_Soft); break; case ID_SYSTEM_RESET_HARD: WriteTrace(TraceDebug,"ID_SYSTEM_RESET_HARD"); - _N64System->ExternalEvent(SysEvent_ResetCPU_Hard); + _BaseSystem->ExternalEvent(SysEvent_ResetCPU_Hard); break; case ID_SYSTEM_PAUSE: _Gui->SaveWindowLoc(); WriteTrace(TraceDebug,"ID_SYSTEM_PAUSE"); if (_Settings->LoadBool(GameRunning_CPU_Paused)) { - _N64System->ExternalEvent(SysEvent_ResumeCPU_FromMenu); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_FromMenu); } else { - _N64System->ExternalEvent(SysEvent_PauseCPU_FromMenu); + _BaseSystem->ExternalEvent(SysEvent_PauseCPU_FromMenu); } WriteTrace(TraceDebug,"ID_SYSTEM_PAUSE 1"); break; @@ -124,7 +124,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"); _N64System->ExternalEvent(SysEvent_SaveMachineState); break; + case ID_SYSTEM_SAVE: WriteTrace(TraceDebug,"ID_SYSTEM_SAVE"); _BaseSystem->ExternalEvent(SysEvent_SaveMachineState); break; case ID_SYSTEM_SAVEAS: { char drive[_MAX_DRIVE] ,dir[_MAX_DIR], fname[_MAX_FNAME],ext[_MAX_EXT]; @@ -144,7 +144,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men openfilename.nMaxFile = MAX_PATH; openfilename.Flags = OFN_HIDEREADONLY; - _N64System->ExternalEvent(SysEvent_PauseCPU_SaveGame); + _BaseSystem->ExternalEvent(SysEvent_PauseCPU_SaveGame); if (GetSaveFileName (&openfilename)) { @@ -164,13 +164,13 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men _makepath( SaveDir, drive, dir, NULL, NULL ); _Settings->SaveString(Directory_LastSave,SaveDir); - _N64System->ExternalEvent(SysEvent_SaveMachineState); + _BaseSystem->ExternalEvent(SysEvent_SaveMachineState); } - _N64System->ExternalEvent(SysEvent_ResumeCPU_SaveGame); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_SaveGame); } break; - case ID_SYSTEM_RESTORE: WriteTrace(TraceDebug,"ID_SYSTEM_RESTORE"); _N64System->ExternalEvent(SysEvent_LoadMachineState); break; + case ID_SYSTEM_RESTORE: WriteTrace(TraceDebug,"ID_SYSTEM_RESTORE"); _BaseSystem->ExternalEvent(SysEvent_LoadMachineState); break; case ID_SYSTEM_LOAD: { char Directory[255], SaveFile[255]; @@ -189,7 +189,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men openfilename.nMaxFile = MAX_PATH; openfilename.Flags = OFN_HIDEREADONLY; - _N64System->ExternalEvent(SysEvent_PauseCPU_LoadGame); + _BaseSystem->ExternalEvent(SysEvent_PauseCPU_LoadGame); if (GetOpenFileName (&openfilename)) { _Settings->SaveString(GameRunning_InstantSaveFile,SaveFile); @@ -199,18 +199,18 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men _makepath( SaveDir, drive, dir, NULL, NULL ); _Settings->SaveString(Directory_LastSave,SaveDir); - _N64System->ExternalEvent(SysEvent_LoadMachineState); + _BaseSystem->ExternalEvent(SysEvent_LoadMachineState); } - _N64System->ExternalEvent(SysEvent_ResumeCPU_LoadGame); + _BaseSystem->ExternalEvent(SysEvent_ResumeCPU_LoadGame); } break; case ID_SYSTEM_CHEAT: { - _N64System->SelectCheats(hWnd); + _BaseSystem->SelectCheats(hWnd); } break; case ID_SYSTEM_GSBUTTON: - _N64System->ExternalEvent(SysEvent_GSButtonPressed); + _BaseSystem->ExternalEvent(SysEvent_GSButtonPressed); break; case ID_OPTIONS_DISPLAY_FR: _Settings->SaveBool(UserInterface_DisplayFrameRate,!_Settings->LoadBool(UserInterface_DisplayFrameRate)); @@ -229,13 +229,13 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men } break; case ID_OPTIONS_INCREASE_SPEED: - _N64System->IncreaseSpeed(); + _BaseSystem->IncreaseSpeed(); break; case ID_OPTIONS_DECREASE_SPEED: - _N64System->DecreaeSpeed(); + _BaseSystem->DecreaeSpeed(); break; case ID_OPTIONS_FULLSCREEN: - _N64System->ExternalEvent(SysEvent_ChangingFullScreen); + _BaseSystem->ExternalEvent(SysEvent_ChangingFullScreen); break; case ID_OPTIONS_FULLSCREEN2: if (_Settings->LoadBool(UserInterface_InFullScreen)) @@ -300,7 +300,7 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men } else { _Settings->SaveBool(UserInterface_ShowCPUPer,true); } - _N64System->ExternalEvent(SysEvent_CPUUsageTimerChanged); + _BaseSystem->ExternalEvent(SysEvent_CPUUsageTimerChanged); break; case ID_OPTIONS_SETTINGS: { @@ -310,10 +310,10 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men break; case ID_PROFILE_PROFILE: _Settings->SaveBool(Debugger_ProfileCode,!_Settings->LoadBool(Debugger_ProfileCode)); - _N64System->ExternalEvent(SysEvent_Profile_StartStop); + _BaseSystem->ExternalEvent(SysEvent_Profile_StartStop); break; - case ID_PROFILE_RESETCOUNTER: _N64System->ExternalEvent(SysEvent_Profile_ResetLogs); break; - case ID_PROFILE_GENERATELOG: _N64System->ExternalEvent(SysEvent_Profile_GenerateLogs); break; + case ID_PROFILE_RESETCOUNTER: _BaseSystem->ExternalEvent(SysEvent_Profile_ResetLogs); break; + case ID_PROFILE_GENERATELOG: _BaseSystem->ExternalEvent(SysEvent_Profile_GenerateLogs); break; case ID_DEBUG_SHOW_UNHANDLED_MEM: _Settings->SaveBool(Debugger_ShowUnhandledMemory,!_Settings->LoadBool(Debugger_ShowUnhandledMemory)); break; @@ -435,17 +435,17 @@ bool CMainMenu::ProcessMessage(WND_HANDLE hWnd, DWORD FromAccelerator, DWORD Men _Settings->SaveBool(Debugger_GenerateDebugLog,!_Settings->LoadBool(Debugger_GenerateDebugLog)); break; case ID_DEBUGGER_DUMPMEMORY: - _N64System->Debug_ShowMemoryDump(); + _BaseSystem->Debug_ShowMemoryDump(); 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(SysEvent_Interrupt_SP); break; - case ID_DEBUGGER_INTERRUPT_SI: _N64System->ExternalEvent(SysEvent_Interrupt_SI); break; - case ID_DEBUGGER_INTERRUPT_AI: _N64System->ExternalEvent(SysEvent_Interrupt_AI); break; - case ID_DEBUGGER_INTERRUPT_VI: _N64System->ExternalEvent(SysEvent_Interrupt_VI); break; - case ID_DEBUGGER_INTERRUPT_PI: _N64System->ExternalEvent(SysEvent_Interrupt_PI); break; - case ID_DEBUGGER_INTERRUPT_DP: _N64System->ExternalEvent(SysEvent_Interrupt_DP); break; + case ID_DEBUGGER_SEARCHMEMORY: _BaseSystem->Debug_ShowMemorySearch(); break; + case ID_DEBUGGER_MEMORY: _BaseSystem->Debug_ShowMemoryWindow(); break; + case ID_DEBUGGER_TLBENTRIES: _BaseSystem->Debug_ShowTLBWindow(); break; + case ID_DEBUGGER_INTERRUPT_SP: _BaseSystem->ExternalEvent(SysEvent_Interrupt_SP); break; + case ID_DEBUGGER_INTERRUPT_SI: _BaseSystem->ExternalEvent(SysEvent_Interrupt_SI); break; + case ID_DEBUGGER_INTERRUPT_AI: _BaseSystem->ExternalEvent(SysEvent_Interrupt_AI); break; + case ID_DEBUGGER_INTERRUPT_VI: _BaseSystem->ExternalEvent(SysEvent_Interrupt_VI); break; + case ID_DEBUGGER_INTERRUPT_PI: _BaseSystem->ExternalEvent(SysEvent_Interrupt_PI); break; + case ID_DEBUGGER_INTERRUPT_DP: _BaseSystem->ExternalEvent(SysEvent_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)); @@ -503,7 +503,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) { - _N64System->RunFileImage(FileName.c_str()); + _BaseSystem->RunFileImage(FileName.c_str()); } } if (MenuID >= ID_RECENT_DIR_START && MenuID < ID_RECENT_DIR_END) { @@ -653,6 +653,8 @@ stdstr CMainMenu::GetSaveSlotString (int Slot) } void CMainMenu::FillOutMenu ( MENU_HANDLE hMenu ) { + CGuard Guard(m_CS); + MENU_ITEM Item; //Get all flags @@ -1142,6 +1144,8 @@ void CMainMenu::FillOutMenu ( MENU_HANDLE hMenu ) { } void CMainMenu::RebuildAccelerators(void) { + CGuard Guard(m_CS); + //Delete the old accel list WriteTrace(TraceDebug,"CMainMenu::RebuildAccelerators - Start"); @@ -1154,6 +1158,7 @@ void CMainMenu::RebuildAccelerators(void) { } void CMainMenu::ResetMenu(void) { + CGuard Guard(m_CS); WriteTrace(TraceDebug,"CMainMenu::ResetMenu - Start"); m_ShortCuts.Load(); diff --git a/Source/Project64/User Interface/Main Menu Class.h b/Source/Project64/User Interface/Main Menu Class.h index 9ad4ba599..12da278ef 100644 --- a/Source/Project64/User Interface/Main Menu Class.h +++ b/Source/Project64/User Interface/Main Menu Class.h @@ -60,6 +60,7 @@ class CMainMenu:public CBaseMenu bool m_ResetAccelerators; CShortCuts m_ShortCuts; SettingList m_ChangeSettingList; + CriticalSection m_CS; void FillOutMenu ( MENU_HANDLE hMenu ); //stdstr ShortCutString(MSC_MAP & ShortCuts, int MenuID, CMenuShortCutKey::ACCESS_MODE AccessLevel); diff --git a/Source/Project64/User Interface/Rom Browser Class.cpp b/Source/Project64/User Interface/Rom Browser Class.cpp index c72908f0b..20cf03acb 100644 --- a/Source/Project64/User Interface/Rom Browser Class.cpp +++ b/Source/Project64/User Interface/Rom Browser Class.cpp @@ -1332,7 +1332,7 @@ void CRomBrowser::RomList_OpenRom(DWORD pnmh) { if (!pRomInfo) { return; } m_StopRefresh = true; - _N64System->RunFileImage(pRomInfo->szFullFileName); + _BaseSystem->RunFileImage(pRomInfo->szFullFileName); } void CRomBrowser::RomList_PopupMenu(DWORD pnmh) { diff --git a/Source/Project64/main.cpp b/Source/Project64/main.cpp index 6359d69c9..77454c11f 100644 --- a/Source/Project64/main.cpp +++ b/Source/Project64/main.cpp @@ -317,11 +317,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, MainWindow.ProcessAllMessages(); WriteTrace(TraceDebug,"WinMain - Message Loop Finished"); - if (_N64System) + if (_BaseSystem) { - _N64System->CloseCpu(); - delete _N64System; - _N64System = NULL; + _BaseSystem->CloseCpu(); + delete _BaseSystem; + _BaseSystem = NULL; } WriteTrace(TraceDebug,"WinMain - System Closed"); diff --git a/Source/Project64/stdafx.h b/Source/Project64/stdafx.h index 69e83abaf..aa13173bc 100644 --- a/Source/Project64/stdafx.h +++ b/Source/Project64/stdafx.h @@ -1,6 +1,8 @@ #pragma warning(disable:4247) #pragma warning(disable:4786) +#include +#include #include "Multilanguage.h" #include "User Interface.h" #include "N64 System.h"