Rsp: Move Recompiler in to rsp-core
This commit is contained in:
parent
1f0151e067
commit
6b30c1ae6a
|
@ -41,23 +41,44 @@
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="cpu\RSPCpu.cpp" />
|
<ClCompile Include="cpu\RSPCpu.cpp" />
|
||||||
|
<ClCompile Include="cpu\RspDma.cpp" />
|
||||||
<ClCompile Include="cpu\RSPiInstruction.cpp" />
|
<ClCompile Include="cpu\RSPiInstruction.cpp" />
|
||||||
<ClCompile Include="cpu\RSPInterpreterCPU.cpp" />
|
<ClCompile Include="cpu\RSPInterpreterCPU.cpp" />
|
||||||
<ClCompile Include="cpu\RSPInterpreterOps.cpp" />
|
<ClCompile Include="cpu\RSPInterpreterOps.cpp" />
|
||||||
|
<ClCompile Include="cpu\RspLog.cpp" />
|
||||||
|
<ClCompile Include="cpu\RspMemory.cpp" />
|
||||||
<ClCompile Include="cpu\RSPRegister.cpp" />
|
<ClCompile Include="cpu\RSPRegister.cpp" />
|
||||||
<ClCompile Include="cpu\RspTypes.cpp" />
|
<ClCompile Include="cpu\RspTypes.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\Mmx.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\RspProfiling.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerAnalysis.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerCPU.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerOps.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerSections.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\Sse.cpp" />
|
||||||
|
<ClCompile Include="Recompiler\X86.cpp" />
|
||||||
<ClCompile Include="RSPDebugger.cpp" />
|
<ClCompile Include="RSPDebugger.cpp" />
|
||||||
<ClCompile Include="RSPInfo.cpp" />
|
<ClCompile Include="RSPInfo.cpp" />
|
||||||
|
<ClCompile Include="Settings\RspSettings.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="cpu\RSPCpu.h" />
|
<ClInclude Include="cpu\RSPCpu.h" />
|
||||||
|
<ClInclude Include="cpu\RspDma.h" />
|
||||||
<ClInclude Include="cpu\RSPInstruction.h" />
|
<ClInclude Include="cpu\RSPInstruction.h" />
|
||||||
<ClInclude Include="cpu\RSPInterpreterCPU.h" />
|
<ClInclude Include="cpu\RSPInterpreterCPU.h" />
|
||||||
<ClInclude Include="cpu\RSPInterpreterOps.h" />
|
<ClInclude Include="cpu\RSPInterpreterOps.h" />
|
||||||
|
<ClInclude Include="cpu\RspLog.h" />
|
||||||
|
<ClInclude Include="cpu\RspMemory.h" />
|
||||||
<ClInclude Include="cpu\RSPOpcode.h" />
|
<ClInclude Include="cpu\RSPOpcode.h" />
|
||||||
<ClInclude Include="cpu\RSPRegisters.h" />
|
<ClInclude Include="cpu\RSPRegisters.h" />
|
||||||
<ClInclude Include="cpu\RspTypes.h" />
|
<ClInclude Include="cpu\RspTypes.h" />
|
||||||
|
<ClInclude Include="Recompiler\RspProfiling.h" />
|
||||||
|
<ClInclude Include="Recompiler\RspRecompilerCPU.h" />
|
||||||
|
<ClInclude Include="Recompiler\RspRecompilerOps.h" />
|
||||||
|
<ClInclude Include="Recompiler\X86.h" />
|
||||||
<ClInclude Include="RSPDebugger.h" />
|
<ClInclude Include="RSPDebugger.h" />
|
||||||
<ClInclude Include="RSPInfo.h" />
|
<ClInclude Include="RSPInfo.h" />
|
||||||
|
<ClInclude Include="Settings\RspSettings.h" />
|
||||||
|
<ClInclude Include="Settings\RspSettingsID.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -19,6 +19,18 @@
|
||||||
<Filter Include="Header Files\cpu">
|
<Filter Include="Header Files\cpu">
|
||||||
<UniqueIdentifier>{68f5d9a3-7e1b-4209-95c4-7daf0d469394}</UniqueIdentifier>
|
<UniqueIdentifier>{68f5d9a3-7e1b-4209-95c4-7daf0d469394}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Settings">
|
||||||
|
<UniqueIdentifier>{77da0581-67c2-4483-9b3d-7a92f0e99d39}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\Settings">
|
||||||
|
<UniqueIdentifier>{0868624c-a8c2-4e74-b90b-d0b3bc5e0938}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Recompiler">
|
||||||
|
<UniqueIdentifier>{2bca7ea6-354a-456b-976d-dc015b9a110f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\Recompiler">
|
||||||
|
<UniqueIdentifier>{bb961984-d173-4bd2-8a8b-f9a0416188f4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="cpu\RSPiInstruction.cpp">
|
<ClCompile Include="cpu\RSPiInstruction.cpp">
|
||||||
|
@ -45,6 +57,42 @@
|
||||||
<ClCompile Include="RSPDebugger.cpp">
|
<ClCompile Include="RSPDebugger.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Settings\RspSettings.cpp">
|
||||||
|
<Filter>Source Files\Settings</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerAnalysis.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerCPU.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerOps.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\RspRecompilerSections.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="cpu\RspMemory.cpp">
|
||||||
|
<Filter>Source Files\cpu</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="cpu\RspLog.cpp">
|
||||||
|
<Filter>Source Files\cpu</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\Mmx.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\Sse.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\X86.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Recompiler\RspProfiling.cpp">
|
||||||
|
<Filter>Source Files\Recompiler</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="cpu\RspDma.cpp">
|
||||||
|
<Filter>Source Files\cpu</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="cpu\RSPInstruction.h">
|
<ClInclude Include="cpu\RSPInstruction.h">
|
||||||
|
@ -74,5 +122,32 @@
|
||||||
<ClInclude Include="RSPInfo.h">
|
<ClInclude Include="RSPInfo.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Settings\RspSettingsID.h">
|
||||||
|
<Filter>Header Files\Settings</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Settings\RspSettings.h">
|
||||||
|
<Filter>Header Files\Settings</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Recompiler\RspRecompilerCPU.h">
|
||||||
|
<Filter>Header Files\Recompiler</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Recompiler\RspRecompilerOps.h">
|
||||||
|
<Filter>Header Files\Recompiler</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="cpu\RspMemory.h">
|
||||||
|
<Filter>Header Files\cpu</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="cpu\RspLog.h">
|
||||||
|
<Filter>Header Files\cpu</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Recompiler\X86.h">
|
||||||
|
<Filter>Header Files\Recompiler</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Recompiler\RspProfiling.h">
|
||||||
|
<Filter>Header Files\Recompiler</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="cpu\RspDma.h">
|
||||||
|
<Filter>Header Files\cpu</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -1,19 +1,16 @@
|
||||||
#include "Rsp.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
#include <stdio.h>
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
#include <windows.h>
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
|
|
||||||
#define PUTDST8(dest, value) \
|
#define PUTDST8(dest, value) \
|
||||||
(*((BYTE *)(dest)) = (BYTE)(value)); \
|
(*((uint8_t *)(dest)) = (uint8_t)(value)); \
|
||||||
dest += 1;
|
dest += 1;
|
||||||
#define PUTDST16(dest, value) \
|
#define PUTDST16(dest, value) \
|
||||||
(*((WORD *)(dest)) = (WORD)(value)); \
|
(*((uint16_t *)(dest)) = (uint16_t)(value)); \
|
||||||
dest += 2;
|
dest += 2;
|
||||||
#define PUTDST32(dest, value) \
|
#define PUTDST32(dest, value) \
|
||||||
(*((DWORD *)(dest)) = (DWORD)(value)); \
|
(*((uint32_t *)(dest)) = (uint32_t)(value)); \
|
||||||
dest += 4;
|
dest += 4;
|
||||||
#define PUTDSTPTR(dest, value) \
|
#define PUTDSTPTR(dest, value) \
|
||||||
*(void **)(dest) = (void *)(value); \
|
*(void **)(dest) = (void *)(value); \
|
||||||
|
@ -33,7 +30,7 @@ void MmxEmptyMultimediaState(void)
|
||||||
|
|
||||||
void MmxMoveRegToReg(int Dest, int Source)
|
void MmxMoveRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" movq %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -65,7 +62,7 @@ void MmxMoveRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxMoveQwordVariableToReg(int Dest, void * Variable, char * VariableName)
|
void MmxMoveQwordVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" movq %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -88,7 +85,7 @@ void MmxMoveQwordVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
|
||||||
void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName)
|
void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq qword ptr [%s], %s", VariableName, mmx_Name(Dest));
|
CPU_Message(" movq qword ptr [%s], %s", VariableName, mmx_Name(Dest));
|
||||||
|
|
||||||
|
@ -111,7 +108,7 @@ void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
|
|
||||||
void MmxPorRegToReg(int Dest, int Source)
|
void MmxPorRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" por %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" por %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -143,7 +140,7 @@ void MmxPorRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest)
|
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" por %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" por %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -166,7 +163,7 @@ void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
|
|
||||||
void MmxPandRegToReg(int Dest, int Source)
|
void MmxPandRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pand %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pand %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -198,7 +195,7 @@ void MmxPandRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest)
|
void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pand %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" pand %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -221,7 +218,7 @@ void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
|
|
||||||
void MmxPandnRegToReg(int Dest, int Source)
|
void MmxPandnRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pandn %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pandn %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -253,7 +250,7 @@ void MmxPandnRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxXorRegToReg(int Dest, int Source)
|
void MmxXorRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pxor %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pxor %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -283,9 +280,9 @@ void MmxXorRegToReg(int Dest, int Source)
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, BYTE Immed)
|
void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, uint8_t Immed)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pshufw %s, [%s], %02X", mmx_Name(Dest), VariableName, Immed);
|
CPU_Message(" pshufw %s, [%s], %02X", mmx_Name(Dest), VariableName, Immed);
|
||||||
|
|
||||||
|
@ -309,7 +306,7 @@ void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, BYTE
|
||||||
|
|
||||||
void MmxPcmpeqwRegToReg(int Dest, int Source)
|
void MmxPcmpeqwRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pcmpeqw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pcmpeqw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -341,7 +338,7 @@ void MmxPcmpeqwRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPmullwRegToReg(int Dest, int Source)
|
void MmxPmullwRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmullw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmullw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -373,7 +370,7 @@ void MmxPmullwRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName)
|
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmullw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" pmullw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -395,7 +392,7 @@ void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
|
||||||
void MmxPmulhuwRegToReg(int Dest, int Source)
|
void MmxPmulhuwRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhuw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmulhuw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -427,7 +424,7 @@ void MmxPmulhuwRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPmulhwRegToReg(int Dest, int Source)
|
void MmxPmulhwRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmulhw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -459,7 +456,7 @@ void MmxPmulhwRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName)
|
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" pmulhw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -479,9 +476,9 @@ void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsrlwImmed(int Dest, BYTE Immed)
|
void MmxPsrlwImmed(int Dest, uint8_t Immed)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psrlw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psrlw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
|
@ -502,9 +499,9 @@ void MmxPsrlwImmed(int Dest, BYTE Immed)
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsrawImmed(int Dest, BYTE Immed)
|
void MmxPsrawImmed(int Dest, uint8_t Immed)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psraw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psraw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
|
@ -525,9 +522,9 @@ void MmxPsrawImmed(int Dest, BYTE Immed)
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsllwImmed(int Dest, BYTE Immed)
|
void MmxPsllwImmed(int Dest, uint8_t Immed)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psllw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psllw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
|
@ -550,7 +547,7 @@ void MmxPsllwImmed(int Dest, BYTE Immed)
|
||||||
|
|
||||||
void MmxPaddswRegToReg(int Dest, int Source)
|
void MmxPaddswRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" paddsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -582,7 +579,7 @@ void MmxPaddswRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPsubswRegToReg(int Dest, int Source)
|
void MmxPsubswRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psubsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" psubsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -614,7 +611,7 @@ void MmxPsubswRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName)
|
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddsw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" paddsw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -637,7 +634,7 @@ void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
|
||||||
void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName)
|
void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psubsw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" psubsw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
|
@ -660,7 +657,7 @@ void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
|
||||||
void MmxPaddwRegToReg(int Dest, int Source)
|
void MmxPaddwRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" paddw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -692,7 +689,7 @@ void MmxPaddwRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void MmxPackSignedDwords(int Dest, int Source)
|
void MmxPackSignedDwords(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" packssdw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" packssdw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -724,7 +721,7 @@ void MmxPackSignedDwords(int Dest, int Source)
|
||||||
|
|
||||||
void MmxUnpackLowWord(int Dest, int Source)
|
void MmxUnpackLowWord(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" punpcklwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" punpcklwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -756,7 +753,7 @@ void MmxUnpackLowWord(int Dest, int Source)
|
||||||
|
|
||||||
void MmxUnpackHighWord(int Dest, int Source)
|
void MmxUnpackHighWord(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" punpckhwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" punpckhwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
|
@ -788,7 +785,7 @@ void MmxUnpackHighWord(int Dest, int Source)
|
||||||
|
|
||||||
void MmxCompareGreaterWordRegToReg(int Dest, int Source)
|
void MmxCompareGreaterWordRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pcmpgtw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pcmpgtw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <shellapi.h>
|
#include "RspProfiling.h"
|
||||||
|
|
||||||
#include "profiling.h"
|
|
||||||
#pragma warning(disable : 4786)
|
#pragma warning(disable : 4786)
|
||||||
#include <Common/File.h>
|
#include <Common/File.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
|
@ -167,8 +164,6 @@ public:
|
||||||
Log.LogF("%s\t%2.2f", Buffer, CpuUsage);
|
Log.LogF("%s\t%2.2f", Buffer, CpuUsage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ShellExecuteA(NULL, "open", LogFileName.c_str(), NULL, NULL, SW_SHOW);
|
|
||||||
ResetCounters();
|
ResetCounters();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -197,141 +192,4 @@ void StopTimer(void)
|
||||||
void GenerateTimerResults(void)
|
void GenerateTimerResults(void)
|
||||||
{
|
{
|
||||||
GetProfiler().GenerateLog();
|
GetProfiler().GenerateLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef todelete
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char Label[100];
|
|
||||||
__int64 TimeTotal;
|
|
||||||
} TIME_STAMP_ENTRY;
|
|
||||||
|
|
||||||
uint32_t StartTimeHi, StartTimeLo, StopTimeHi, StopTimeLo, TSE_Count, TSE_Max;
|
|
||||||
TIME_STAMP_ENTRY * TS_Entries = NULL;
|
|
||||||
char LastLabel[100];
|
|
||||||
|
|
||||||
void ResetTimerList(void)
|
|
||||||
{
|
|
||||||
if (TS_Entries)
|
|
||||||
{
|
|
||||||
free(TS_Entries);
|
|
||||||
}
|
|
||||||
TS_Entries = NULL;
|
|
||||||
TSE_Count = 0;
|
|
||||||
TSE_Max = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartTimer(char * Label)
|
|
||||||
{
|
|
||||||
strcpy(LastLabel, Label);
|
|
||||||
_asm {
|
|
||||||
pushad
|
|
||||||
rdtsc
|
|
||||||
mov StartTimeHi, edx
|
|
||||||
mov StartTimeLo, eax
|
|
||||||
popad
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void StopTimer(void)
|
|
||||||
{
|
|
||||||
_asm {
|
|
||||||
pushad
|
|
||||||
rdtsc
|
|
||||||
mov StopTimeHi, edx
|
|
||||||
mov StopTimeLo, eax
|
|
||||||
popad
|
|
||||||
}
|
|
||||||
if (strlen(LastLabel) == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
uint32_t count;
|
|
||||||
|
|
||||||
for (count = 0; count < TSE_Count; count++)
|
|
||||||
{
|
|
||||||
if (strcmp(LastLabel, TS_Entries[count].Label) == 0)
|
|
||||||
{
|
|
||||||
__int64 Time = ((unsigned __int64)StopTimeHi << 32) + (unsigned __int64)StopTimeLo;
|
|
||||||
Time -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
|
||||||
TS_Entries[count].TimeTotal += Time;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TSE_Count == 0)
|
|
||||||
{
|
|
||||||
TS_Entries = (TIME_STAMP_ENTRY *)malloc(sizeof(TIME_STAMP_ENTRY) * 100);
|
|
||||||
if (TS_Entries == NULL)
|
|
||||||
{
|
|
||||||
MessageBox(NULL, "TIME_STAMP_ENTRY == NULL ??", "ERROR", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
|
||||||
}
|
|
||||||
TSE_Max = 100;
|
|
||||||
}
|
|
||||||
else if (TSE_Count == TSE_Max)
|
|
||||||
{
|
|
||||||
TSE_Max += 100;
|
|
||||||
TS_Entries = (TIME_STAMP_ENTRY *)realloc(TS_Entries, sizeof(TIME_STAMP_ENTRY) * TSE_Max);
|
|
||||||
if (TS_Entries == NULL)
|
|
||||||
{
|
|
||||||
MessageBox(NULL, "TIME_STAMP_ENTRY == NULL ??", "ERROR", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strcpy(TS_Entries[TSE_Count].Label, LastLabel);
|
|
||||||
TS_Entries[TSE_Count].TimeTotal = ((unsigned __int64)StopTimeHi << 32) + (unsigned __int64)StopTimeLo;
|
|
||||||
TS_Entries[TSE_Count].TimeTotal -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
|
||||||
TSE_Count += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GenerateTimerResults(void)
|
|
||||||
{
|
|
||||||
char buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
|
||||||
char fname[_MAX_FNAME], ext[_MAX_EXT], LogFileName[_MAX_PATH];
|
|
||||||
uint32_t dwWritten, count, count2;
|
|
||||||
HANDLE hLogFile = NULL;
|
|
||||||
__int64 TotalTime;
|
|
||||||
|
|
||||||
StopTimer();
|
|
||||||
|
|
||||||
GetModuleFileName(NULL, buffer, sizeof(buffer));
|
|
||||||
_splitpath(buffer, drive, dir, fname, ext);
|
|
||||||
_makepath(LogFileName, drive, dir, "RSP Profiling", "log");
|
|
||||||
|
|
||||||
hLogFile = CreateFile(LogFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
|
|
||||||
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
|
||||||
SetFilePointer(hLogFile, 0, NULL, FILE_BEGIN);
|
|
||||||
|
|
||||||
for (count = 0; count < TSE_Count; count++)
|
|
||||||
{
|
|
||||||
for (count2 = 0; count2 < (TSE_Count - 1); count2++)
|
|
||||||
{
|
|
||||||
if (TS_Entries[count2].TimeTotal < TS_Entries[count2 + 1].TimeTotal)
|
|
||||||
{
|
|
||||||
TIME_STAMP_ENTRY Temp;
|
|
||||||
memcpy(&Temp, &TS_Entries[count2], sizeof(TIME_STAMP_ENTRY));
|
|
||||||
memcpy(&TS_Entries[count2], &TS_Entries[count2 + 1], sizeof(TIME_STAMP_ENTRY));
|
|
||||||
memcpy(&TS_Entries[count2 + 1], &Temp, sizeof(TIME_STAMP_ENTRY));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TotalTime = 0;
|
|
||||||
for (count = 0; count < TSE_Count; count++)
|
|
||||||
{
|
|
||||||
TotalTime += TS_Entries[count].TimeTotal;
|
|
||||||
}
|
|
||||||
for (count = 0; count < (TSE_Count < 50 ? TSE_Count : 50); count++)
|
|
||||||
{
|
|
||||||
sprintf(buffer, "%s - %0.2f%c\r\n",
|
|
||||||
TS_Entries[count].Label,
|
|
||||||
(((double)TS_Entries[count].TimeTotal / (double)TotalTime) * 100), '%');
|
|
||||||
WriteFile(hLogFile, buffer, strlen(buffer), &dwWritten, NULL);
|
|
||||||
}
|
|
||||||
CloseHandle(hLogFile);
|
|
||||||
ResetTimerList();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,15 +1,13 @@
|
||||||
#include "RSP Command.h"
|
#include "RspRecompilerCPU.h"
|
||||||
#include "Recompiler CPU.h"
|
#include <Common/StdString.h>
|
||||||
#include "Rsp.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
//#define COMPARE_INSTRUCTIONS_VERBOSE
|
//#define COMPARE_INSTRUCTIONS_VERBOSE
|
||||||
|
|
||||||
|
@ -160,7 +158,7 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -194,7 +192,7 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -323,7 +321,7 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
case RSP_VECTOR_VSAW:
|
case RSP_VECTOR_VSAW:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -337,7 +335,7 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
case RSP_COP2_MF:
|
case RSP_COP2_MF:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -366,7 +364,7 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
case RSP_LSC2_HV:
|
case RSP_LSC2_HV:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -387,12 +385,12 @@ uint32_t WriteToAccum2(int Location, int PC, bool RecursiveCall)
|
||||||
case RSP_LSC2_TV:
|
case RSP_LSC2_TV:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToAccum\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
switch (Instruction_State)
|
switch (Instruction_State)
|
||||||
|
@ -517,7 +515,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -551,7 +549,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -686,7 +684,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -707,7 +705,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -743,7 +741,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -780,7 +778,7 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
int length = 32 - RspOp.rt, count, del = RspOp.del >> 1, vect = RspOp.rt;
|
int length = 32 - RspOp.rt, count, del = RspOp.del >> 1, vect = RspOp.rt;
|
||||||
for (count = 0; count < length; count++)
|
for (count = 0; count < length; count++)
|
||||||
{
|
{
|
||||||
if (DestReg == vect + del)
|
if (DestReg == (uint32_t)(vect + del))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -790,12 +788,12 @@ bool WriteToVectorDest2(uint32_t DestReg, int PC, bool RecursiveCall)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
switch (Instruction_State)
|
switch (Instruction_State)
|
||||||
|
@ -920,7 +918,7 @@ bool UseRspFlags(int PC)
|
||||||
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
Instruction_State = RSPPIPELINE_DO_DELAY_SLOT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -951,7 +949,7 @@ bool UseRspFlags(int PC)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in WriteToVectorDest\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1030,7 +1028,7 @@ bool UseRspFlags(int PC)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1044,7 @@ bool UseRspFlags(int PC)
|
||||||
case RSP_COP2_MF:
|
case RSP_COP2_MF:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1075,7 +1073,7 @@ bool UseRspFlags(int PC)
|
||||||
case RSP_LSC2_HV:
|
case RSP_LSC2_HV:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1096,12 +1094,12 @@ bool UseRspFlags(int PC)
|
||||||
case RSP_LSC2_TV:
|
case RSP_LSC2_TV:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in UseRspFlags\n%s", RSPInstruction(PC, RspOp.Value).NameAndParam().c_str()).c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
switch (Instruction_State)
|
switch (Instruction_State)
|
||||||
|
@ -1183,7 +1181,7 @@ bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// CompilerWarning("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
// CompilerWarning(stdstr_f("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
// return false;
|
// return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1225,7 +1223,7 @@ bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Const = (WORD)RspOp.immediate;
|
Const = (uint16_t)RspOp.immediate;
|
||||||
References++;
|
References++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1286,7 +1284,7 @@ bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// CompilerWarning("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
// CompilerWarning(stdstr_f("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
// return false;
|
// return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1313,7 +1311,7 @@ bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant)
|
||||||
case RSP_SC2:
|
case RSP_SC2:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// CompilerWarning("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
// CompilerWarning(stdstr_f("Unknown opcode in IsRegisterConstant\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
// return false;
|
// return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1354,7 +1352,7 @@ bool IsOpcodeBranch(uint32_t PC, RSPOpcode RspOp)
|
||||||
case RSP_REGIMM_BGEZAL:
|
case RSP_REGIMM_BGEZAL:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
//CompilerWarning("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
//CompilerWarning(stdstr_f(stdstr_f("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1385,7 +1383,7 @@ bool IsOpcodeBranch(uint32_t PC, RSPOpcode RspOp)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//CompilerWarning("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
//CompilerWarning(stdstr_f("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1425,7 +1423,7 @@ bool IsOpcodeBranch(uint32_t PC, RSPOpcode RspOp)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//CompilerWarning("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC));
|
//CompilerWarning(stdstr_f("Unknown opcode in IsOpcodeBranch\n%s",RSPOpcodeName(RspOp.Hex,PC)).c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1500,7 +1498,7 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1549,7 +1547,7 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1705,7 +1703,7 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1741,7 +1739,7 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
info->flags = VEC_Instruction | GPR_Instruction | Store_Operation;
|
info->flags = VEC_Instruction | GPR_Instruction | Store_Operation;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1786,7 +1784,7 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1814,13 +1812,13 @@ void GetInstructionInfo(uint32_t PC, RSPOpcode * RspOp, OPCODE_INFO * info)
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str());
|
CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s", RSPInstruction(PC, RspOp->Value).NameAndParam().c_str()).c_str());
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* CompilerWarning("Unknown opcode in GetInstructionInfo\n%s",RSPOpcodeName(RspOp->Hex,PC));
|
/* CompilerWarning(stdstr_f("Unknown opcode in GetInstructionInfo\n%s",RSPOpcodeName(RspOp->Hex,PC)).c_str());
|
||||||
*/
|
*/
|
||||||
info->flags = InvalidOpcode;
|
info->flags = InvalidOpcode;
|
||||||
break;
|
break;
|
||||||
|
@ -2156,7 +2154,7 @@ bool CompareInstructions(uint32_t PC, RSPOpcode * Top, RSPOpcode * Bottom)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CompilerWarning("Reorder: Unhandled instruction type: %i", InstructionType);
|
CompilerWarning(stdstr_f("Reorder: Unhandled instruction type: %i", InstructionType).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
|
@ -1,23 +1,18 @@
|
||||||
#include <float.h>
|
#include "RspRecompilerCPU.h"
|
||||||
#include <stdio.h>
|
#include "RspProfiling.h"
|
||||||
#include <stdlib.h>
|
#include "RspRecompilerOps.h"
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "Profiling.h"
|
|
||||||
#include "RSP Command.h"
|
|
||||||
#include "Recompiler CPU.h"
|
|
||||||
#include "Recompiler Ops.h"
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
#include <Common/StdString.h>
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
||||||
|
|
||||||
|
@ -33,7 +28,7 @@ bool ChangedPC;
|
||||||
RSP_BLOCK CurrentBlock;
|
RSP_BLOCK CurrentBlock;
|
||||||
RSP_CODE RspCode;
|
RSP_CODE RspCode;
|
||||||
|
|
||||||
BYTE *pLastSecondary = NULL, *pLastPrimary = NULL;
|
uint8_t *pLastSecondary = NULL, *pLastPrimary = NULL;
|
||||||
|
|
||||||
void BuildRecompilerCPU(void)
|
void BuildRecompilerCPU(void)
|
||||||
{
|
{
|
||||||
|
@ -617,7 +612,7 @@ void CompilerToggleBuffer(void)
|
||||||
void ClearAllx86Code(void)
|
void ClearAllx86Code(void)
|
||||||
{
|
{
|
||||||
extern uint32_t NoOfMaps, MapsCRC[32];
|
extern uint32_t NoOfMaps, MapsCRC[32];
|
||||||
extern BYTE * JumpTables;
|
extern uint8_t * JumpTables;
|
||||||
|
|
||||||
memset(&MapsCRC, 0, sizeof(uint32_t) * 0x20);
|
memset(&MapsCRC, 0, sizeof(uint32_t) * 0x20);
|
||||||
NoOfMaps = 0;
|
NoOfMaps = 0;
|
||||||
|
@ -640,7 +635,7 @@ void LinkBranches(RSP_BLOCK * Block)
|
||||||
uint32_t OrigPrgCount = *PrgCount;
|
uint32_t OrigPrgCount = *PrgCount;
|
||||||
uint32_t Count, Target;
|
uint32_t Count, Target;
|
||||||
uint32_t * JumpWord;
|
uint32_t * JumpWord;
|
||||||
BYTE * X86Code;
|
uint8_t * X86Code;
|
||||||
RSP_BLOCK Save;
|
RSP_BLOCK Save;
|
||||||
|
|
||||||
if (!CurrentBlock.ResolveCount)
|
if (!CurrentBlock.ResolveCount)
|
||||||
|
@ -652,7 +647,7 @@ void LinkBranches(RSP_BLOCK * Block)
|
||||||
for (Count = 0; Count < CurrentBlock.ResolveCount; Count++)
|
for (Count = 0; Count < CurrentBlock.ResolveCount; Count++)
|
||||||
{
|
{
|
||||||
Target = CurrentBlock.BranchesToResolve[Count].TargetPC;
|
Target = CurrentBlock.BranchesToResolve[Count].TargetPC;
|
||||||
X86Code = (BYTE *)*(JumpTable + (Target >> 2));
|
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
||||||
|
|
||||||
if (!X86Code)
|
if (!X86Code)
|
||||||
{
|
{
|
||||||
|
@ -668,7 +663,7 @@ void LinkBranches(RSP_BLOCK * Block)
|
||||||
*Block = Save;
|
*Block = Save;
|
||||||
CPU_Message("===== (End generate code: %04X) =====", Target);
|
CPU_Message("===== (End generate code: %04X) =====", Target);
|
||||||
CPU_Message("");
|
CPU_Message("");
|
||||||
X86Code = (BYTE *)*(JumpTable + (Target >> 2));
|
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
JumpWord = CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
JumpWord = CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
||||||
|
@ -770,7 +765,7 @@ bool IsJumpLabel(uint32_t PC)
|
||||||
|
|
||||||
void CompilerLinkBlocks(void)
|
void CompilerLinkBlocks(void)
|
||||||
{
|
{
|
||||||
BYTE * KnownCode = (BYTE *)*(JumpTable + (CompilePC >> 2));
|
uint8_t * KnownCode = (uint8_t *)*(JumpTable + (CompilePC >> 2));
|
||||||
|
|
||||||
CPU_Message("***** Linking block to X86: %08X *****", KnownCode);
|
CPU_Message("***** Linking block to X86: %08X *****", KnownCode);
|
||||||
NextInstruction = RSPPIPELINE_FINISH_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_BLOCK;
|
||||||
|
@ -782,7 +777,7 @@ void CompilerLinkBlocks(void)
|
||||||
|
|
||||||
void CompilerRSPBlock(void)
|
void CompilerRSPBlock(void)
|
||||||
{
|
{
|
||||||
BYTE * IMEM_SAVE = (BYTE *)malloc(0x1000);
|
uint8_t * IMEM_SAVE = (uint8_t *)malloc(0x1000);
|
||||||
const size_t X86BaseAddress = (size_t)RecompPos;
|
const size_t X86BaseAddress = (size_t)RecompPos;
|
||||||
|
|
||||||
NextInstruction = RSPPIPELINE_NORMAL;
|
NextInstruction = RSPPIPELINE_NORMAL;
|
||||||
|
@ -924,7 +919,7 @@ void CompilerRSPBlock(void)
|
||||||
|
|
||||||
case RSPPIPELINE_FINISH_BLOCK: break;
|
case RSPPIPELINE_FINISH_BLOCK: break;
|
||||||
default:
|
default:
|
||||||
DisplayError("RSP main loop\n\nWTF NextInstruction = %d", NextInstruction);
|
g_Notify->DisplayError(stdstr_f("RSP main loop\n\nWTF NextInstruction = %d", NextInstruction).c_str());
|
||||||
CompilePC += 4;
|
CompilePC += 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -940,14 +935,18 @@ void CompilerRSPBlock(void)
|
||||||
|
|
||||||
uint32_t RunRecompilerCPU(uint32_t Cycles)
|
uint32_t RunRecompilerCPU(uint32_t Cycles)
|
||||||
{
|
{
|
||||||
BYTE * Block;
|
#ifndef EXCEPTION_EXECUTE_HANDLER
|
||||||
|
#define EXCEPTION_EXECUTE_HANDLER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint8_t * Block;
|
||||||
|
|
||||||
RSP_Running = true;
|
RSP_Running = true;
|
||||||
SetJumpTable(JumpTableSize);
|
SetJumpTable(JumpTableSize);
|
||||||
|
|
||||||
while (RSP_Running)
|
while (RSP_Running)
|
||||||
{
|
{
|
||||||
Block = (BYTE *)*(JumpTable + (*PrgCount >> 2));
|
Block = (uint8_t *)*(JumpTable + (*PrgCount >> 2));
|
||||||
|
|
||||||
if (Block == NULL)
|
if (Block == NULL)
|
||||||
{
|
{
|
||||||
|
@ -966,7 +965,9 @@ uint32_t RunRecompilerCPU(uint32_t Cycles)
|
||||||
}
|
}
|
||||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
DisplayError("Error CompilePC = %08X", CompilePC);
|
char ErrorMessage[400];
|
||||||
|
sprintf(ErrorMessage, "Error CompilePC = %08X", CompilePC);
|
||||||
|
g_Notify->DisplayError(ErrorMessage);
|
||||||
ClearAllx86Code();
|
ClearAllx86Code();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -976,7 +977,7 @@ uint32_t RunRecompilerCPU(uint32_t Cycles)
|
||||||
CompilerRSPBlock();
|
CompilerRSPBlock();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Block = (BYTE *)*(JumpTable + (*PrgCount >> 2));
|
Block = (uint8_t *)*(JumpTable + (*PrgCount >> 2));
|
||||||
|
|
||||||
// We are done compiling, but we may have references
|
// We are done compiling, but we may have references
|
||||||
// to fill in still either from this block, or jumps
|
// to fill in still either from this block, or jumps
|
|
@ -1,11 +1,15 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
#include <Settings/Settings.h>
|
||||||
|
|
||||||
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
||||||
extern bool ChangedPC;
|
extern bool ChangedPC;
|
||||||
|
|
||||||
#define CompilerWarning \
|
#define CompilerWarning \
|
||||||
if (ShowErrors) DisplayError
|
if (ShowErrors) g_Notify->DisplayError
|
||||||
|
|
||||||
#define High16BitAccum 1
|
#define High16BitAccum 1
|
||||||
#define Middle16BitAccum 2
|
#define Middle16BitAccum 2
|
|
@ -1,20 +1,18 @@
|
||||||
#include "Profiling.h"
|
#include "Project64-rsp-core/Recompiler/RspRecompilerCPU.h"
|
||||||
#include "RSP Command.h"
|
#include "RspProfiling.h"
|
||||||
#include "Recompiler CPU.h"
|
#include "RspRecompilerCPU.h"
|
||||||
#include "Rsp.h"
|
|
||||||
#include "dma.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
|
#include <Common/StdString.h>
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterCPU.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspDma.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
||||||
|
|
||||||
|
@ -98,7 +96,7 @@ void Branch_AddRef(uint32_t Target, uint32_t * X86Loc)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BYTE * KnownCode = (BYTE *)(*(JumpTable + (Target >> 2)));
|
uint8_t * KnownCode = (uint8_t *)(*(JumpTable + (Target >> 2)));
|
||||||
|
|
||||||
if (KnownCode == NULL)
|
if (KnownCode == NULL)
|
||||||
{
|
{
|
||||||
|
@ -131,14 +129,13 @@ void Cheat_r4300iOpcodeNoMessage(p_func FunctAddress, char * FunctName)
|
||||||
void x86_SetBranch8b(void * JumpByte, void * Destination)
|
void x86_SetBranch8b(void * JumpByte, void * Destination)
|
||||||
{
|
{
|
||||||
// Calculate 32-bit relative offset
|
// Calculate 32-bit relative offset
|
||||||
size_t n = (BYTE *)Destination - ((BYTE *)JumpByte + 1);
|
size_t n = (uint8_t *)Destination - ((uint8_t *)JumpByte + 1);
|
||||||
SSIZE_T signed_n = (SSIZE_T)n;
|
intptr_t signed_n = (intptr_t)n;
|
||||||
|
|
||||||
// Check limits, no pun intended
|
// Check limits, no pun intended
|
||||||
if (signed_n > +128 || signed_n < -127)
|
if (signed_n > +128 || signed_n < -127)
|
||||||
{
|
{
|
||||||
CompilerWarning(
|
CompilerWarning(stdstr_f("FATAL: Jump out of 8b range %i (PC = %04X)", n, CompilePC).c_str());
|
||||||
"FATAL: Jump out of 8b range %i (PC = %04X)", n, CompilePC);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -148,7 +145,7 @@ void x86_SetBranch8b(void * JumpByte, void * Destination)
|
||||||
|
|
||||||
void x86_SetBranch32b(void * JumpByte, void * Destination)
|
void x86_SetBranch32b(void * JumpByte, void * Destination)
|
||||||
{
|
{
|
||||||
*(uint32_t *)(JumpByte) = (uint32_t)((BYTE *)Destination - (BYTE *)((uint32_t *)JumpByte + 1));
|
*(uint32_t *)(JumpByte) = (uint32_t)((uint8_t *)Destination - (uint8_t *)((uint32_t *)JumpByte + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakPoint()
|
void BreakPoint()
|
||||||
|
@ -207,7 +204,7 @@ void Compile_J(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("J error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("J error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -245,7 +242,7 @@ void Compile_JAL(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("J error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("J error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,7 +325,7 @@ void Compile_BEQ(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BEQ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BEQ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -411,7 +408,7 @@ void Compile_BNE(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BNE error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BNE error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -471,7 +468,7 @@ void Compile_BLEZ(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BLEZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BLEZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -528,7 +525,7 @@ void Compile_BGTZ(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BGTZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BGTZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -811,7 +808,7 @@ void Compile_LB(void)
|
||||||
void Compile_LH(void)
|
void Compile_LH(void)
|
||||||
{
|
{
|
||||||
int Offset = (short)RSPOpC.offset;
|
int Offset = (short)RSPOpC.offset;
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
if (RSPOpC.rt == 0)
|
if (RSPOpC.rt == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -831,7 +828,7 @@ void Compile_LH(void)
|
||||||
{
|
{
|
||||||
if ((Addr & 2) == 0)
|
if ((Addr & 2) == 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned LH at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned LH at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LH, "RSP_Opcode_LH");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LH, "RSP_Opcode_LH");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -884,7 +881,7 @@ void Compile_LH(void)
|
||||||
void Compile_LW(void)
|
void Compile_LW(void)
|
||||||
{
|
{
|
||||||
int Offset = (short)RSPOpC.offset;
|
int Offset = (short)RSPOpC.offset;
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
if (RSPOpC.rt == 0)
|
if (RSPOpC.rt == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -901,7 +898,7 @@ void Compile_LW(void)
|
||||||
|
|
||||||
if ((Addr & 1) != 0)
|
if ((Addr & 1) != 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned LW at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned LW at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LW, "RSP_Opcode_LW");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LW, "RSP_Opcode_LW");
|
||||||
}
|
}
|
||||||
else if ((Addr & 2) != 0)
|
else if ((Addr & 2) != 0)
|
||||||
|
@ -1006,7 +1003,7 @@ void Compile_LBU(void)
|
||||||
void Compile_LHU(void)
|
void Compile_LHU(void)
|
||||||
{
|
{
|
||||||
int Offset = (short)RSPOpC.offset;
|
int Offset = (short)RSPOpC.offset;
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
if (RSPOpC.rt == 0)
|
if (RSPOpC.rt == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -1026,7 +1023,7 @@ void Compile_LHU(void)
|
||||||
{
|
{
|
||||||
if ((Addr & 2) == 0)
|
if ((Addr & 2) == 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned LHU at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned LHU at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LHU, "RSP_Opcode_LHU");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LHU, "RSP_Opcode_LHU");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1096,7 +1093,7 @@ void Compile_SB(void)
|
||||||
|
|
||||||
if (IsRegConst(RSPOpC.rt))
|
if (IsRegConst(RSPOpC.rt))
|
||||||
{
|
{
|
||||||
MoveConstByteToVariable(MipsRegConst(RSPOpC.rt), RSPInfo.DMEM + Addr, Address);
|
MoveConstByteToVariable((uint8_t)MipsRegConst(RSPOpC.rt), RSPInfo.DMEM + Addr, Address);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1115,7 +1112,7 @@ void Compile_SB(void)
|
||||||
XorConstToX86Reg(x86_EBX, 3);
|
XorConstToX86Reg(x86_EBX, 3);
|
||||||
AndConstToX86Reg(x86_EBX, 0x0fff);
|
AndConstToX86Reg(x86_EBX, 0x0fff);
|
||||||
|
|
||||||
MoveConstByteToN64Mem(MipsRegConst(RSPOpC.rt), x86_EBX);
|
MoveConstByteToN64Mem((uint8_t)MipsRegConst(RSPOpC.rt), x86_EBX);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1133,7 +1130,7 @@ void Compile_SB(void)
|
||||||
void Compile_SH(void)
|
void Compile_SH(void)
|
||||||
{
|
{
|
||||||
int Offset = (short)RSPOpC.offset;
|
int Offset = (short)RSPOpC.offset;
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef Compile_GPRStores
|
#ifndef Compile_GPRStores
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_SH, "RSP_Opcode_SH");
|
Cheat_r4300iOpcode(RSP_Opcode_SH, "RSP_Opcode_SH");
|
||||||
|
@ -1149,7 +1146,7 @@ void Compile_SH(void)
|
||||||
|
|
||||||
if ((Offset & 1) != 0)
|
if ((Offset & 1) != 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned SH at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned SH at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SH, "RSP_Opcode_SH");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SH, "RSP_Opcode_SH");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1159,7 +1156,7 @@ void Compile_SH(void)
|
||||||
sprintf(Address, "DMEM + %Xh", Addr);
|
sprintf(Address, "DMEM + %Xh", Addr);
|
||||||
if (IsRegConst(RSPOpC.rt))
|
if (IsRegConst(RSPOpC.rt))
|
||||||
{
|
{
|
||||||
MoveConstHalfToVariable(MipsRegConst(RSPOpC.rt), RSPInfo.DMEM + Addr, Address);
|
MoveConstHalfToVariable((uint16_t)MipsRegConst(RSPOpC.rt), RSPInfo.DMEM + Addr, Address);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1193,7 +1190,7 @@ void Compile_SH(void)
|
||||||
|
|
||||||
if (IsRegConst(RSPOpC.rt))
|
if (IsRegConst(RSPOpC.rt))
|
||||||
{
|
{
|
||||||
MoveConstHalfToN64Mem(MipsRegConst(RSPOpC.rt), x86_EBX);
|
MoveConstHalfToN64Mem((uint16_t)MipsRegConst(RSPOpC.rt), x86_EBX);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1208,7 +1205,7 @@ void Compile_SH(void)
|
||||||
void Compile_SW(void)
|
void Compile_SW(void)
|
||||||
{
|
{
|
||||||
int Offset = (short)RSPOpC.offset;
|
int Offset = (short)RSPOpC.offset;
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef Compile_GPRStores
|
#ifndef Compile_GPRStores
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_SW, "RSP_Opcode_SW");
|
Cheat_r4300iOpcode(RSP_Opcode_SW, "RSP_Opcode_SW");
|
||||||
|
@ -1226,7 +1223,7 @@ void Compile_SW(void)
|
||||||
{
|
{
|
||||||
if (Addr > 0xFFC)
|
if (Addr > 0xFFC)
|
||||||
{
|
{
|
||||||
DisplayError("There is a problem with:\nRSP_SW_DMEM");
|
g_Notify->DisplayError("There is a problem with:\nRSP_SW_DMEM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (IsRegConst(RSPOpC.rt))
|
if (IsRegConst(RSPOpC.rt))
|
||||||
|
@ -1243,7 +1240,7 @@ void Compile_SW(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned SW at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned SW at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SW, "RSP_Opcode_SW");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SW, "RSP_Opcode_SW");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1345,12 +1342,12 @@ void Compile_Special_SLL(void)
|
||||||
|
|
||||||
if (RSPOpC.rd == RSPOpC.rt)
|
if (RSPOpC.rd == RSPOpC.rt)
|
||||||
{
|
{
|
||||||
ShiftLeftSignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (BYTE)RSPOpC.sa);
|
ShiftLeftSignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (uint8_t)RSPOpC.sa);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
||||||
ShiftLeftSignImmed(x86_EAX, (BYTE)RSPOpC.sa);
|
ShiftLeftSignImmed(x86_EAX, (uint8_t)RSPOpC.sa);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1367,12 +1364,12 @@ void Compile_Special_SRL(void)
|
||||||
|
|
||||||
if (RSPOpC.rd == RSPOpC.rt)
|
if (RSPOpC.rd == RSPOpC.rt)
|
||||||
{
|
{
|
||||||
ShiftRightUnsignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (BYTE)RSPOpC.sa);
|
ShiftRightUnsignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (uint8_t)RSPOpC.sa);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
||||||
ShiftRightUnsignImmed(x86_EAX, (BYTE)RSPOpC.sa);
|
ShiftRightUnsignImmed(x86_EAX, (uint8_t)RSPOpC.sa);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1389,12 +1386,12 @@ void Compile_Special_SRA(void)
|
||||||
|
|
||||||
if (RSPOpC.rd == RSPOpC.rt)
|
if (RSPOpC.rd == RSPOpC.rt)
|
||||||
{
|
{
|
||||||
ShiftRightSignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (BYTE)RSPOpC.sa);
|
ShiftRightSignVariableImmed(&RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd), (uint8_t)RSPOpC.sa);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
MoveVariableToX86reg(&RSP_GPR[RSPOpC.rt].W, GPR_Name(RSPOpC.rt), x86_EAX);
|
||||||
ShiftRightSignImmed(x86_EAX, (BYTE)RSPOpC.sa);
|
ShiftRightSignImmed(x86_EAX, (uint8_t)RSPOpC.sa);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
MoveX86regToVariable(x86_EAX, &RSP_GPR[RSPOpC.rd].W, GPR_Name(RSPOpC.rd));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1435,7 +1432,7 @@ void UpdateAudioTimer()
|
||||||
|
|
||||||
void Compile_Special_JR(void)
|
void Compile_Special_JR(void)
|
||||||
{
|
{
|
||||||
BYTE * Jump;
|
uint8_t * Jump;
|
||||||
|
|
||||||
if (NextInstruction == RSPPIPELINE_NORMAL)
|
if (NextInstruction == RSPPIPELINE_NORMAL)
|
||||||
{
|
{
|
||||||
|
@ -1486,14 +1483,14 @@ void Compile_Special_JR(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("WTF\n\nJR\nNextInstruction = %X", NextInstruction);
|
CompilerWarning(stdstr_f("WTF\n\nJR\nNextInstruction = %X", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Compile_Special_JALR(void)
|
void Compile_Special_JALR(void)
|
||||||
{
|
{
|
||||||
BYTE * Jump;
|
uint8_t * Jump;
|
||||||
uint32_t Const = (CompilePC + 8) & 0xFFC;
|
uint32_t Const = (CompilePC + 8) & 0xFFC;
|
||||||
|
|
||||||
if (NextInstruction == RSPPIPELINE_NORMAL)
|
if (NextInstruction == RSPPIPELINE_NORMAL)
|
||||||
|
@ -1528,7 +1525,7 @@ void Compile_Special_JALR(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("WTF\n\nJALR\nNextInstruction = %X", NextInstruction);
|
CompilerWarning(stdstr_f("WTF\n\nJALR\nNextInstruction = %X", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1544,7 +1541,7 @@ void Compile_Special_BREAK(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("WTF\n\nBREAK\nNextInstruction = %X", NextInstruction);
|
CompilerWarning(stdstr_f("WTF\n\nBREAK\nNextInstruction = %X", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1907,7 +1904,7 @@ void Compile_RegImm_BLTZ(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BLTZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nPC = %X\nEmulation will now stop", NextInstruction, CompilePC);
|
CompilerWarning(stdstr_f("BLTZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nPC = %X\nEmulation will now stop", NextInstruction, CompilePC).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1966,7 +1963,7 @@ void Compile_RegImm_BGEZ(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BGEZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BGEZ error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2009,7 +2006,7 @@ void Compile_RegImm_BLTZAL(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BLTZAL error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BLTZAL error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2069,7 +2066,7 @@ void Compile_RegImm_BGEZAL(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("BGEZAL error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("BGEZAL error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2152,7 +2149,7 @@ void Compile_Cop0_MF(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("MF error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("MF error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2179,7 +2176,7 @@ void Compile_Cop0_MF(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompilerWarning("MF error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction);
|
CompilerWarning(stdstr_f("MF error\nWeird Delay Slot.\n\nNextInstruction = %X\nEmulation will now stop", NextInstruction).c_str());
|
||||||
BreakPoint();
|
BreakPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2206,7 +2203,7 @@ void Compile_Cop0_MF(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DisplayError("We have not implemented RSP MF CP0 reg %s (%d)", COP0_Name(RSPOpC.rd), RSPOpC.rd);
|
g_Notify->DisplayError(stdstr_f("We have not implemented RSP MF CP0 reg %s (%d)", COP0_Name(RSPOpC.rd), RSPOpC.rd).c_str());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -2317,7 +2314,7 @@ void Compile_Cop0_MT(void)
|
||||||
#endif
|
#endif
|
||||||
if (RSPOpC.rd == 2 && !ChangedPC)
|
if (RSPOpC.rd == 2 && !ChangedPC)
|
||||||
{
|
{
|
||||||
BYTE * Jump;
|
uint8_t * Jump;
|
||||||
|
|
||||||
TestConstToVariable(0x1000, RSPInfo.SP_MEM_ADDR_REG, "RSPInfo.SP_MEM_ADDR_REG");
|
TestConstToVariable(0x1000, RSPInfo.SP_MEM_ADDR_REG, "RSPInfo.SP_MEM_ADDR_REG");
|
||||||
JeLabel8("DontExit", 0);
|
JeLabel8("DontExit", 0);
|
||||||
|
@ -3028,7 +3025,7 @@ void Compile_Vector_VMUDM(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
||||||
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
||||||
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (!bOptimize)
|
if (!bOptimize)
|
||||||
{
|
{
|
||||||
|
@ -3039,7 +3036,7 @@ void Compile_Vector_VMUDM(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveZxX86RegPtrDispToX86RegHalf(x86_ECX, (BYTE)(del * 2), x86_EBX);
|
MoveZxX86RegPtrDispToX86RegHalf(x86_ECX, (uint8_t)(del * 2), x86_EBX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3050,7 +3047,7 @@ void Compile_Vector_VMUDM(void)
|
||||||
ShiftRightUnsignImmed(x86_EAX, 16);
|
ShiftRightUnsignImmed(x86_EAX, 16);
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
||||||
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
||||||
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (BYTE)(el * 2));
|
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (uint8_t)(el * 2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3069,7 +3066,7 @@ void Compile_Vector_VMUDM(void)
|
||||||
{
|
{
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
||||||
MoveX86regHalfToVariable(x86_EDX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
MoveX86regHalfToVariable(x86_EDX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
||||||
MoveX86regHalfToX86regPointerDisp(x86_EDX, x86_ECX, (BYTE)(el * 2));
|
MoveX86regHalfToX86regPointerDisp(x86_EDX, x86_ECX, (uint8_t)(el * 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3164,7 +3161,7 @@ void Compile_Vector_VMUDN(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].UHW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].UHW[%i]", RSPOpC.rd, el);
|
||||||
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].u16(el), Reg, x86_EAX);*/
|
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].u16(el), Reg, x86_EAX);*/
|
||||||
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (!bOptimize)
|
if (!bOptimize)
|
||||||
{
|
{
|
||||||
|
@ -3629,7 +3626,7 @@ void Compile_Vector_VMADM(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
||||||
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
||||||
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (!bOptimize)
|
if (!bOptimize)
|
||||||
{
|
{
|
||||||
|
@ -3640,7 +3637,7 @@ void Compile_Vector_VMADM(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveZxX86RegPtrDispToX86RegHalf(x86_ECX, (BYTE)(del * 2), x86_EBX);
|
MoveZxX86RegPtrDispToX86RegHalf(x86_ECX, (uint8_t)(del * 2), x86_EBX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3665,7 +3662,7 @@ void Compile_Vector_VMADM(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
||||||
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
||||||
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (BYTE)(el * 2));
|
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (uint8_t)(el * 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3714,7 +3711,7 @@ void Compile_Vector_VMADN(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].UHW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].UHW[%i]", RSPOpC.rd, el);
|
||||||
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].u16(el), Reg, x86_EAX);*/
|
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].u16(el), Reg, x86_EAX);*/
|
||||||
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (!bOptimize)
|
if (!bOptimize)
|
||||||
{
|
{
|
||||||
|
@ -3859,7 +3856,7 @@ void Compile_Vector_VMADH(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
||||||
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
MoveSxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
||||||
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveSxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (!bOptimize)
|
if (!bOptimize)
|
||||||
{
|
{
|
||||||
|
@ -3870,7 +3867,7 @@ void Compile_Vector_VMADH(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MoveSxX86RegPtrDispToX86RegHalf(x86_ECX, (BYTE)(del * 2), x86_EBX);
|
MoveSxX86RegPtrDispToX86RegHalf(x86_ECX, (uint8_t)(del * 2), x86_EBX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3889,7 +3886,7 @@ void Compile_Vector_VMADH(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.sa, el);
|
||||||
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
MoveX86regHalfToVariable(x86_EAX, &RSP_Vect[RSPOpC.vd].s16(el), Reg);*/
|
||||||
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (BYTE)(el * 2));
|
MoveX86regHalfToX86regPointerDisp(x86_EAX, x86_ECX, (uint8_t)(el * 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Pop(x86_EBP);
|
Pop(x86_EBP);
|
||||||
|
@ -4405,7 +4402,7 @@ void Compile_Vector_VADDC(void)
|
||||||
|
|
||||||
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
/*sprintf(Reg, "RSP_Vect[%i].HW[%i]", RSPOpC.rd, el);
|
||||||
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
MoveZxVariableToX86regHalf(&RSP_Vect[RSPOpC.vs].s16(el), Reg, x86_EAX);*/
|
||||||
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (BYTE)(el * 2), x86_EAX);
|
MoveZxX86RegPtrDispToX86RegHalf(x86_EBP, (uint8_t)(el * 2), x86_EAX);
|
||||||
|
|
||||||
if (bElement == false)
|
if (bElement == false)
|
||||||
{
|
{
|
||||||
|
@ -4420,7 +4417,7 @@ void Compile_Vector_VADDC(void)
|
||||||
Setnz(x86_EDX);
|
Setnz(x86_EDX);
|
||||||
if ((7 - el) != 0)
|
if ((7 - el) != 0)
|
||||||
{
|
{
|
||||||
ShiftLeftSignImmed(x86_EDX, (BYTE)(7 - el));
|
ShiftLeftSignImmed(x86_EDX, (uint8_t)(7 - el));
|
||||||
}
|
}
|
||||||
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
||||||
|
|
||||||
|
@ -4486,13 +4483,13 @@ void Compile_Vector_VSUBC(void)
|
||||||
XorX86RegToX86Reg(x86_EDX, x86_EDX);
|
XorX86RegToX86Reg(x86_EDX, x86_EDX);
|
||||||
TestConstToX86Reg(0x0000FFFF, x86_EAX);
|
TestConstToX86Reg(0x0000FFFF, x86_EAX);
|
||||||
Setnz(x86_EDX);
|
Setnz(x86_EDX);
|
||||||
ShiftLeftSignImmed(x86_EDX, (BYTE)(15 - el));
|
ShiftLeftSignImmed(x86_EDX, (uint8_t)(15 - el));
|
||||||
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
||||||
|
|
||||||
XorX86RegToX86Reg(x86_EDX, x86_EDX);
|
XorX86RegToX86Reg(x86_EDX, x86_EDX);
|
||||||
TestConstToX86Reg(0xFFFF0000, x86_EAX);
|
TestConstToX86Reg(0xFFFF0000, x86_EAX);
|
||||||
Setnz(x86_EDX);
|
Setnz(x86_EDX);
|
||||||
ShiftLeftSignImmed(x86_EDX, (BYTE)(7 - el));
|
ShiftLeftSignImmed(x86_EDX, (uint8_t)(7 - el));
|
||||||
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
OrX86RegToX86Reg(x86_ECX, x86_EDX);
|
||||||
|
|
||||||
if (bWriteToAccum != false)
|
if (bWriteToAccum != false)
|
||||||
|
@ -4569,7 +4566,7 @@ void Compile_Vector_VLT(void)
|
||||||
{
|
{
|
||||||
bool bWriteToDest = WriteToVectorDest(RSPOpC.sa, CompilePC);
|
bool bWriteToDest = WriteToVectorDest(RSPOpC.sa, CompilePC);
|
||||||
bool bWriteToAccum = WriteToAccum(Low16BitAccum, CompilePC);
|
bool bWriteToAccum = WriteToAccum(Low16BitAccum, CompilePC);
|
||||||
BYTE * jump[3];
|
uint8_t * jump[3];
|
||||||
uint32_t flag;
|
uint32_t flag;
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
uint8_t el, del, last;
|
uint8_t el, del, last;
|
||||||
|
@ -4600,7 +4597,7 @@ void Compile_Vector_VLT(void)
|
||||||
|
|
||||||
CompX86RegToX86Reg(x86_EDX, x86_ECX);
|
CompX86RegToX86Reg(x86_EDX, x86_ECX);
|
||||||
JgeLabel8("jge", 0);
|
JgeLabel8("jge", 0);
|
||||||
jump[0] = (BYTE *)(RecompPos - 1);
|
jump[0] = (uint8_t *)(RecompPos - 1);
|
||||||
|
|
||||||
if (bWriteToAccum || bWriteToDest)
|
if (bWriteToAccum || bWriteToDest)
|
||||||
{
|
{
|
||||||
|
@ -4610,7 +4607,7 @@ void Compile_Vector_VLT(void)
|
||||||
OrConstToX86Reg((flag & 0xFF), x86_EBX);
|
OrConstToX86Reg((flag & 0xFF), x86_EBX);
|
||||||
|
|
||||||
JmpLabel8("jmp", 0);
|
JmpLabel8("jmp", 0);
|
||||||
jump[1] = (BYTE *)(RecompPos - 1);
|
jump[1] = (uint8_t *)(RecompPos - 1);
|
||||||
x86_SetBranch8b(jump[0], RecompPos);
|
x86_SetBranch8b(jump[0], RecompPos);
|
||||||
|
|
||||||
if (bWriteToAccum || bWriteToDest)
|
if (bWriteToAccum || bWriteToDest)
|
||||||
|
@ -4619,7 +4616,7 @@ void Compile_Vector_VLT(void)
|
||||||
MoveX86regHalfToVariable(x86_ECX, &RSP_ACCUM[el].HW[1], Reg);
|
MoveX86regHalfToVariable(x86_ECX, &RSP_ACCUM[el].HW[1], Reg);
|
||||||
}
|
}
|
||||||
JneLabel8("jne", 0);
|
JneLabel8("jne", 0);
|
||||||
jump[2] = (BYTE *)(RecompPos - 1);
|
jump[2] = (uint8_t *)(RecompPos - 1);
|
||||||
|
|
||||||
MoveX86RegToX86Reg(x86_ESI, x86_EDI);
|
MoveX86RegToX86Reg(x86_ESI, x86_EDI);
|
||||||
AndConstToX86Reg(x86_EDI, flag);
|
AndConstToX86Reg(x86_EDI, flag);
|
||||||
|
@ -4874,7 +4871,7 @@ void Compile_Vector_VGE(void)
|
||||||
*/
|
*/
|
||||||
bool bWriteToDest = WriteToVectorDest(RSPOpC.sa, CompilePC);
|
bool bWriteToDest = WriteToVectorDest(RSPOpC.sa, CompilePC);
|
||||||
bool bWriteToAccum = WriteToAccum(Low16BitAccum, CompilePC);
|
bool bWriteToAccum = WriteToAccum(Low16BitAccum, CompilePC);
|
||||||
BYTE * jump[3];
|
uint8_t * jump[3];
|
||||||
uint32_t flag;
|
uint32_t flag;
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
uint8_t el, del, last = (uint8_t)-1;
|
uint8_t el, del, last = (uint8_t)-1;
|
||||||
|
@ -4905,7 +4902,7 @@ void Compile_Vector_VGE(void)
|
||||||
|
|
||||||
CompX86RegToX86Reg(x86_EDX, x86_ECX);
|
CompX86RegToX86Reg(x86_EDX, x86_ECX);
|
||||||
JleLabel8("jle", 0);
|
JleLabel8("jle", 0);
|
||||||
jump[0] = (BYTE *)(RecompPos - 1);
|
jump[0] = (uint8_t *)(RecompPos - 1);
|
||||||
|
|
||||||
if (bWriteToAccum || bWriteToDest)
|
if (bWriteToAccum || bWriteToDest)
|
||||||
{
|
{
|
||||||
|
@ -4915,7 +4912,7 @@ void Compile_Vector_VGE(void)
|
||||||
OrConstToX86Reg((flag & 0xFF), x86_EBX);
|
OrConstToX86Reg((flag & 0xFF), x86_EBX);
|
||||||
|
|
||||||
JmpLabel8("jmp", 0);
|
JmpLabel8("jmp", 0);
|
||||||
jump[1] = (BYTE *)(RecompPos - 1);
|
jump[1] = (uint8_t *)(RecompPos - 1);
|
||||||
x86_SetBranch8b(jump[0], RecompPos);
|
x86_SetBranch8b(jump[0], RecompPos);
|
||||||
|
|
||||||
if (bWriteToAccum || bWriteToDest)
|
if (bWriteToAccum || bWriteToDest)
|
||||||
|
@ -4925,7 +4922,7 @@ void Compile_Vector_VGE(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
JneLabel8("jne", 0);
|
JneLabel8("jne", 0);
|
||||||
jump[2] = (BYTE *)(RecompPos - 1);
|
jump[2] = (uint8_t *)(RecompPos - 1);
|
||||||
|
|
||||||
MoveX86RegToX86Reg(x86_ESI, x86_EDI);
|
MoveX86RegToX86Reg(x86_ESI, x86_EDI);
|
||||||
AndConstToX86Reg(x86_EDI, flag);
|
AndConstToX86Reg(x86_EDI, flag);
|
||||||
|
@ -6002,7 +5999,7 @@ void Compile_Opcode_LSV(void)
|
||||||
sprintf(Reg, "DMEM + %Xh", Addr ^ 2);
|
sprintf(Reg, "DMEM + %Xh", Addr ^ 2);
|
||||||
MoveVariableToX86regHalf(RSPInfo.DMEM + (Addr ^ 2), Reg, x86_EDX);
|
MoveVariableToX86regHalf(RSPInfo.DMEM + (Addr ^ 2), Reg, x86_EDX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveX86regHalfToVariable(x86_EDX, &RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg);
|
MoveX86regHalfToVariable(x86_EDX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6016,7 +6013,7 @@ void Compile_Opcode_LSV(void)
|
||||||
XorConstToX86Reg(x86_EBX, 2);
|
XorConstToX86Reg(x86_EBX, 2);
|
||||||
MoveN64MemToX86regHalf(x86_ECX, x86_EBX);
|
MoveN64MemToX86regHalf(x86_ECX, x86_EBX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveX86regHalfToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg);
|
MoveX86regHalfToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -6028,10 +6025,10 @@ void Compile_Opcode_LSV(void)
|
||||||
MoveN64MemToX86regByte(x86_EDX, x86_EAX);
|
MoveN64MemToX86regByte(x86_EDX, x86_EAX);
|
||||||
|
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 0));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 0));
|
||||||
MoveX86regByteToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 0)), Reg);
|
MoveX86regByteToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 0))), Reg);
|
||||||
|
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveX86regByteToVariable(x86_EDX, &RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg);
|
MoveX86regByteToVariable(x86_EDX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6039,7 +6036,7 @@ void Compile_Opcode_LLV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 2);
|
int offset = (RSPOpC.voffset << 2);
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef CompileLlv
|
#ifndef CompileLlv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_LLV, "RSP_Opcode_LLV");
|
Cheat_r4300iOpcode(RSP_Opcode_LLV, "RSP_Opcode_LLV");
|
||||||
|
@ -6069,7 +6066,7 @@ void Compile_Opcode_LLV(void)
|
||||||
sprintf(Reg, "DMEM + %Xh", Addr);
|
sprintf(Reg, "DMEM + %Xh", Addr);
|
||||||
MoveVariableToX86reg(RSPInfo.DMEM + Addr, Reg, x86_EAX);
|
MoveVariableToX86reg(RSPInfo.DMEM + Addr, Reg, x86_EAX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg);
|
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6098,7 +6095,7 @@ void Compile_Opcode_LLV(void)
|
||||||
MoveN64MemToX86reg(x86_EAX, x86_EBX);
|
MoveN64MemToX86reg(x86_EAX, x86_EBX);
|
||||||
// Because of byte swapping this swizzle works nicely
|
// Because of byte swapping this swizzle works nicely
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg);
|
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg);
|
||||||
|
|
||||||
CPU_Message(" Done:");
|
CPU_Message(" Done:");
|
||||||
*((uint32_t *)(Jump[1])) = (uint32_t)(RecompPos - Jump[1] - 4);
|
*((uint32_t *)(Jump[1])) = (uint32_t)(RecompPos - Jump[1] - 4);
|
||||||
|
@ -6108,7 +6105,7 @@ void Compile_Opcode_LDV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 3), length;
|
int offset = (RSPOpC.voffset << 3), length;
|
||||||
BYTE *Jump[2], *LoopEntry;
|
uint8_t *Jump[2], *LoopEntry;
|
||||||
|
|
||||||
#ifndef CompileLdv
|
#ifndef CompileLdv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
Cheat_r4300iOpcode(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
||||||
|
@ -6123,7 +6120,7 @@ void Compile_Opcode_LDV(void)
|
||||||
//}
|
//}
|
||||||
if ((RSPOpC.del & 0x3) != 0)
|
if ((RSPOpC.del & 0x3) != 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("LDV's element = %X, PC = %04X", RSPOpC.del, CompilePC);
|
CompilerWarning(stdstr_f("LDV's element = %X, PC = %04X", RSPOpC.del, CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6134,7 +6131,7 @@ void Compile_Opcode_LDV(void)
|
||||||
|
|
||||||
if ((Addr & 3) != 0)
|
if ((Addr & 3) != 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned LDV at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned LDV at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LDV, "RSP_Opcode_LDV");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6145,11 +6142,11 @@ void Compile_Opcode_LDV(void)
|
||||||
MoveVariableToX86reg(RSPInfo.DMEM + Addr + 4, Reg, x86_ECX);
|
MoveVariableToX86reg(RSPInfo.DMEM + Addr + 4, Reg, x86_ECX);
|
||||||
|
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg);
|
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg);
|
||||||
if (RSPOpC.del != 12)
|
if (RSPOpC.del != 12)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 8);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 8);
|
||||||
MoveX86regToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 8), Reg);
|
MoveX86regToVariable(x86_ECX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 8)), Reg);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6168,7 +6165,7 @@ void Compile_Opcode_LDV(void)
|
||||||
CPU_Message(" Unaligned:");
|
CPU_Message(" Unaligned:");
|
||||||
x86_SetBranch32b(Jump[0], RecompPos);
|
x86_SetBranch32b(Jump[0], RecompPos);
|
||||||
sprintf(Reg, "RSP_Vect[%i].UB[%i]", RSPOpC.rt, 15 - RSPOpC.del);
|
sprintf(Reg, "RSP_Vect[%i].UB[%i]", RSPOpC.rt, 15 - RSPOpC.del);
|
||||||
MoveOffsetToX86reg((size_t)&RSP_Vect[RSPOpC.vt].u8(15 - RSPOpC.del), Reg, x86_EDI);
|
MoveOffsetToX86reg((size_t)&RSP_Vect[RSPOpC.vt].u8((uint8_t)(15 - RSPOpC.del)), Reg, x86_EDI);
|
||||||
length = 8;
|
length = 8;
|
||||||
if (RSPOpC.del == 12)
|
if (RSPOpC.del == 12)
|
||||||
{
|
{
|
||||||
|
@ -6206,7 +6203,7 @@ void Compile_Opcode_LDV(void)
|
||||||
|
|
||||||
// Because of byte swapping this swizzle works nicely
|
// Because of byte swapping this swizzle works nicely
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg);
|
MoveX86regToVariable(x86_EAX, &RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg);
|
||||||
if (RSPOpC.del != 12)
|
if (RSPOpC.del != 12)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 8);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 8);
|
||||||
|
@ -6220,7 +6217,7 @@ void Compile_Opcode_LQV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 4);
|
int offset = (RSPOpC.voffset << 4);
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef CompileLqv
|
#ifndef CompileLqv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_LQV, "RSP_Opcode_LQV");
|
Cheat_r4300iOpcode(RSP_Opcode_LQV, "RSP_Opcode_LQV");
|
||||||
|
@ -6242,7 +6239,7 @@ void Compile_Opcode_LQV(void)
|
||||||
|
|
||||||
if (Addr & 15)
|
if (Addr & 15)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned LQV at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned LQV at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LQV, "RSP_Opcode_LQV");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_LQV, "RSP_Opcode_LQV");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6329,7 +6326,7 @@ void Compile_Opcode_LQV(void)
|
||||||
void Compile_Opcode_LRV(void)
|
void Compile_Opcode_LRV(void)
|
||||||
{
|
{
|
||||||
int offset = (RSPOpC.voffset << 4);
|
int offset = (RSPOpC.voffset << 4);
|
||||||
BYTE *Loop, *Jump[2];
|
uint8_t *Loop, *Jump[2];
|
||||||
|
|
||||||
#ifndef CompileLrv
|
#ifndef CompileLrv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_LRV, "RSP_Opcode_LRV");
|
Cheat_r4300iOpcode(RSP_Opcode_LRV, "RSP_Opcode_LRV");
|
||||||
|
@ -6775,9 +6772,9 @@ void Compile_Opcode_SSV(void)
|
||||||
if ((Addr & 1) != 0)
|
if ((Addr & 1) != 0)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 0));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 0));
|
||||||
MoveVariableToX86regByte(&RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 0)), Reg, x86_ECX);
|
MoveVariableToX86regByte(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 0))), Reg, x86_ECX);
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveVariableToX86regByte(&RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg, x86_EDX);
|
MoveVariableToX86regByte(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg, x86_EDX);
|
||||||
|
|
||||||
sprintf(Reg, "DMEM + %Xh", (Addr + 0) ^ 3);
|
sprintf(Reg, "DMEM + %Xh", (Addr + 0) ^ 3);
|
||||||
MoveX86regByteToVariable(x86_ECX, RSPInfo.DMEM + ((Addr + 0) ^ 3), Reg);
|
MoveX86regByteToVariable(x86_ECX, RSPInfo.DMEM + ((Addr + 0) ^ 3), Reg);
|
||||||
|
@ -6787,7 +6784,7 @@ void Compile_Opcode_SSV(void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveVariableToX86regHalf(&RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg, x86_ECX);
|
MoveVariableToX86regHalf(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg, x86_ECX);
|
||||||
sprintf(Reg, "DMEM + %Xh", Addr ^ 2);
|
sprintf(Reg, "DMEM + %Xh", Addr ^ 2);
|
||||||
MoveX86regHalfToVariable(x86_ECX, RSPInfo.DMEM + (Addr ^ 2), Reg);
|
MoveX86regHalfToVariable(x86_ECX, RSPInfo.DMEM + (Addr ^ 2), Reg);
|
||||||
}
|
}
|
||||||
|
@ -6801,7 +6798,7 @@ void Compile_Opcode_SSV(void)
|
||||||
if (Compiler.bAlignVector == true)
|
if (Compiler.bAlignVector == true)
|
||||||
{
|
{
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 15 - (RSPOpC.del + 1));
|
||||||
MoveVariableToX86regHalf(&RSP_Vect[RSPOpC.vt].s8(15 - (RSPOpC.del + 1)), Reg, x86_ECX);
|
MoveVariableToX86regHalf(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(15 - (RSPOpC.del + 1))), Reg, x86_ECX);
|
||||||
XorConstToX86Reg(x86_EBX, 2);
|
XorConstToX86Reg(x86_EBX, 2);
|
||||||
MoveX86regHalfToN64Mem(x86_ECX, x86_EBX);
|
MoveX86regHalfToN64Mem(x86_ECX, x86_EBX);
|
||||||
}
|
}
|
||||||
|
@ -6825,7 +6822,7 @@ void Compile_Opcode_SLV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 2);
|
int offset = (RSPOpC.voffset << 2);
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef CompileSlv
|
#ifndef CompileSlv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_SLV, "RSP_Opcode_SLV");
|
Cheat_r4300iOpcode(RSP_Opcode_SLV, "RSP_Opcode_SLV");
|
||||||
|
@ -6851,7 +6848,7 @@ void Compile_Opcode_SLV(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg, x86_EAX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg, x86_EAX);
|
||||||
sprintf(Reg, "DMEM + %Xh", Addr);
|
sprintf(Reg, "DMEM + %Xh", Addr);
|
||||||
MoveX86regToVariable(x86_EAX, RSPInfo.DMEM + Addr, Reg);
|
MoveX86regToVariable(x86_EAX, RSPInfo.DMEM + Addr, Reg);
|
||||||
return;
|
return;
|
||||||
|
@ -6880,7 +6877,7 @@ void Compile_Opcode_SLV(void)
|
||||||
|
|
||||||
// Because of byte swapping this swizzle works nicely
|
// Because of byte swapping this swizzle works nicely
|
||||||
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
sprintf(Reg, "RSP_Vect[%i].B[%i]", RSPOpC.rt, 16 - RSPOpC.del - 4);
|
||||||
MoveVariableToX86reg(&RSP_Vect[RSPOpC.vt].s8(16 - RSPOpC.del - 4), Reg, x86_EAX);
|
MoveVariableToX86reg(&RSP_Vect[RSPOpC.vt].s8((uint8_t)(16 - RSPOpC.del - 4)), Reg, x86_EAX);
|
||||||
|
|
||||||
AndConstToX86Reg(x86_EBX, 0x0fff);
|
AndConstToX86Reg(x86_EBX, 0x0fff);
|
||||||
MoveX86regToN64Mem(x86_EAX, x86_EBX);
|
MoveX86regToN64Mem(x86_EAX, x86_EBX);
|
||||||
|
@ -6893,7 +6890,7 @@ void Compile_Opcode_SDV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 3);
|
int offset = (RSPOpC.voffset << 3);
|
||||||
BYTE *Jump[2], *LoopEntry;
|
uint8_t *Jump[2], *LoopEntry;
|
||||||
|
|
||||||
//if ((RSPOpC.del & 0x7) != 0) {
|
//if ((RSPOpC.del & 0x7) != 0) {
|
||||||
// rsp_UnknownOpcode();
|
// rsp_UnknownOpcode();
|
||||||
|
@ -6913,7 +6910,7 @@ void Compile_Opcode_SDV(void)
|
||||||
|
|
||||||
if ((Addr & 3) != 0)
|
if ((Addr & 3) != 0)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned SDV at constant address PC = %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned SDV at constant address PC = %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SDV, "RSP_Opcode_SDV");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SDV, "RSP_Opcode_SDV");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6979,7 +6976,7 @@ void Compile_Opcode_SQV(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
int offset = (RSPOpC.voffset << 4);
|
int offset = (RSPOpC.voffset << 4);
|
||||||
BYTE * Jump[2];
|
uint8_t * Jump[2];
|
||||||
|
|
||||||
#ifndef CompileSqv
|
#ifndef CompileSqv
|
||||||
Cheat_r4300iOpcode(RSP_Opcode_SQV, "RSP_Opcode_SQV");
|
Cheat_r4300iOpcode(RSP_Opcode_SQV, "RSP_Opcode_SQV");
|
||||||
|
@ -7000,7 +6997,7 @@ void Compile_Opcode_SQV(void)
|
||||||
|
|
||||||
if (Addr & 15)
|
if (Addr & 15)
|
||||||
{
|
{
|
||||||
CompilerWarning("Unaligned SQV at constant address %04X", CompilePC);
|
CompilerWarning(stdstr_f("Unaligned SQV at constant address %04X", CompilePC).c_str());
|
||||||
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SQV, "RSP_Opcode_SQV");
|
Cheat_r4300iOpcodeNoMessage(RSP_Opcode_SQV, "RSP_Opcode_SQV");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
|
@ -1,21 +1,15 @@
|
||||||
#include <stdio.h>
|
#include "RspRecompilerCPU.h"
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "RSP Command.h"
|
|
||||||
#include "Recompiler CPU.h"
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "dma.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
#pragma warning(disable : 4152) // Non-standard extension, function/data pointer conversion in expression
|
||||||
|
|
||||||
void RSP_Sections_VMUDH(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMUDH(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -85,7 +79,7 @@ void RSP_Sections_VMUDH(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMADH(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMADH(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -156,7 +150,7 @@ void RSP_Sections_VMADH(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMUDL(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMUDL(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -202,7 +196,7 @@ void RSP_Sections_VMUDL(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMADL(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMADL(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -249,7 +243,7 @@ void RSP_Sections_VMADL(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMUDM(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMUDM(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -362,7 +356,7 @@ void RSP_Sections_VMUDM(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMADM(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMADM(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -478,7 +472,7 @@ void RSP_Sections_VMADM(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMUDN(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMUDN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -577,7 +571,7 @@ void RSP_Sections_VMUDN(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMADN(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMADN(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -679,7 +673,7 @@ void RSP_Sections_VMADN(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
MmxPaddswRegToReg(x86_MM1, x86_MM1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMULF(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMULF(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -752,7 +746,7 @@ void RSP_Sections_VMULF(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
MmxPsllwImmed(x86_MM1, 1);
|
MmxPsllwImmed(x86_MM1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_Sections_VMACF(RSPOpcode RspOp, DWORD AccumStyle)
|
void RSP_Sections_VMACF(RSPOpcode RspOp, uint32_t AccumStyle)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
|
@ -827,11 +821,11 @@ void RSP_Sections_VMACF(RSPOpcode RspOp, DWORD AccumStyle)
|
||||||
|
|
||||||
// Microcode sections
|
// Microcode sections
|
||||||
|
|
||||||
static DWORD Section_000_VMADN; // Yeah I know, but leave it
|
static uint32_t Section_000_VMADN; // Yeah I know, but leave it
|
||||||
|
|
||||||
bool Check_Section_000(void)
|
bool Check_Section_000(void)
|
||||||
{
|
{
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
RSPOpcode op0, op1;
|
RSPOpcode op0, op1;
|
||||||
|
|
||||||
RSP_LW_IMEM(CompilePC + 0x00, &op0.Value);
|
RSP_LW_IMEM(CompilePC + 0x00, &op0.Value);
|
||||||
|
@ -887,7 +881,7 @@ void Compile_Section_000(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
RSPOpcode vmudn, vmadn = {0};
|
RSPOpcode vmudn, vmadn = {0};
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
|
|
||||||
RSP_LW_IMEM(CompilePC + 0x00, &vmudn.Value);
|
RSP_LW_IMEM(CompilePC + 0x00, &vmudn.Value);
|
||||||
|
|
||||||
|
@ -942,11 +936,11 @@ void Compile_Section_000(void)
|
||||||
MmxEmptyMultimediaState();
|
MmxEmptyMultimediaState();
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD Section_001_VMACF;
|
static uint32_t Section_001_VMACF;
|
||||||
|
|
||||||
bool Check_Section_001(void)
|
bool Check_Section_001(void)
|
||||||
{
|
{
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
RSPOpcode op0, op1;
|
RSPOpcode op0, op1;
|
||||||
|
|
||||||
RSP_LW_IMEM(CompilePC + 0x00, &op0.Value);
|
RSP_LW_IMEM(CompilePC + 0x00, &op0.Value);
|
||||||
|
@ -1002,7 +996,7 @@ bool Check_Section_001(void)
|
||||||
|
|
||||||
void Compile_Section_001(void)
|
void Compile_Section_001(void)
|
||||||
{
|
{
|
||||||
DWORD i;
|
uint32_t i;
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
RSPOpcode vmulf, vmacf;
|
RSPOpcode vmulf, vmacf;
|
||||||
|
|
||||||
|
@ -1048,7 +1042,7 @@ void Compile_Section_001(void)
|
||||||
|
|
||||||
bool Check_Section_002(void)
|
bool Check_Section_002(void)
|
||||||
{
|
{
|
||||||
DWORD Count;
|
uint32_t Count;
|
||||||
RSPOpcode op[0x0C];
|
RSPOpcode op[0x0C];
|
||||||
|
|
||||||
for (Count = 0; Count < 0x0C; Count++)
|
for (Count = 0; Count < 0x0C; Count++)
|
||||||
|
@ -1120,7 +1114,7 @@ void Compile_Section_002(void)
|
||||||
{
|
{
|
||||||
char Reg[256];
|
char Reg[256];
|
||||||
|
|
||||||
DWORD Count;
|
uint32_t Count;
|
||||||
RSPOpcode op[0x0C];
|
RSPOpcode op[0x0C];
|
||||||
|
|
||||||
RSPOpcode vmudh, vsaw;
|
RSPOpcode vmudh, vsaw;
|
||||||
|
@ -1170,7 +1164,7 @@ void Compile_Section_002(void)
|
||||||
|
|
||||||
bool Check_Section_003(void)
|
bool Check_Section_003(void)
|
||||||
{
|
{
|
||||||
DWORD Count;
|
uint32_t Count;
|
||||||
RSPOpcode op[4];
|
RSPOpcode op[4];
|
||||||
|
|
||||||
for (Count = 0; Count < 4; Count++)
|
for (Count = 0; Count < 4; Count++)
|
||||||
|
@ -1197,11 +1191,11 @@ bool Check_Section_003(void)
|
||||||
static void resampler_hle()
|
static void resampler_hle()
|
||||||
{
|
{
|
||||||
UDWORD accum, initial;
|
UDWORD accum, initial;
|
||||||
DWORD const2 = (DWORD)RSP_Vect[18].u16(4 ^ 7);
|
uint32_t const2 = (uint32_t)RSP_Vect[18].u16(4 ^ 7);
|
||||||
__int64 const3 = (__int64)((int)RSP_Vect[30].s16(0 ^ 7)) << 16;
|
__int64 const3 = (__int64)((int)RSP_Vect[30].s16(0 ^ 7)) << 16;
|
||||||
|
|
||||||
// VMUDM $v23, $v31, $v23 [7]
|
// VMUDM $v23, $v31, $v23 [7]
|
||||||
initial.DW = (__int64)((DWORD)RSP_Vect[23].u16(7 ^ 7)) << 16;
|
initial.DW = (__int64)((uint32_t)RSP_Vect[23].u16(7 ^ 7)) << 16;
|
||||||
// VMADH $v23, $v31, $v22 [7]
|
// VMADH $v23, $v31, $v22 [7]
|
||||||
initial.W[1] += (int)RSP_Vect[22].s16(7 ^ 7);
|
initial.W[1] += (int)RSP_Vect[22].s16(7 ^ 7);
|
||||||
|
|
|
@ -1,34 +1,38 @@
|
||||||
#include "Rsp.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
#include <stdio.h>
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
#include <windows.h>
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
|
|
||||||
#define PUTDST8(dest, value) \
|
#define PUTDST8(dest, value) \
|
||||||
(*((BYTE *)(dest)) = (BYTE)(value)); \
|
(*((uint8_t *)(dest)) = (uint8_t)(value)); \
|
||||||
dest += 1;
|
dest += 1;
|
||||||
#define PUTDST16(dest, value) \
|
#define PUTDST16(dest, value) \
|
||||||
(*((WORD *)(dest)) = (WORD)(value)); \
|
(*((uint16_t *)(dest)) = (uint16_t)(value)); \
|
||||||
dest += 2;
|
dest += 2;
|
||||||
#define PUTDST32(dest, value) \
|
#define PUTDST32(dest, value) \
|
||||||
(*((DWORD *)(dest)) = (DWORD)(value)); \
|
(*((uint32_t *)(dest)) = (uint32_t)(value)); \
|
||||||
dest += 4;
|
dest += 4;
|
||||||
#define PUTDSTPTR(dest, value) \
|
#define PUTDSTPTR(dest, value) \
|
||||||
*(void **)(dest) = (void *)(value); \
|
*(void **)(dest) = (void *)(value); \
|
||||||
dest += sizeof(void *);
|
dest += sizeof(void *);
|
||||||
|
|
||||||
char * sse_Strings[8] = {
|
char * sse_Strings[8] = {
|
||||||
"xmm0", "xmm1", "xmm2", "xmm3",
|
"xmm0",
|
||||||
"xmm4", "xmm5", "xmm6", "xmm7"};
|
"xmm1",
|
||||||
|
"xmm2",
|
||||||
|
"xmm3",
|
||||||
|
"xmm4",
|
||||||
|
"xmm5",
|
||||||
|
"xmm6",
|
||||||
|
"xmm7",
|
||||||
|
};
|
||||||
|
|
||||||
#define sse_Name(Reg) (sse_Strings[(Reg)])
|
#define sse_Name(Reg) (sse_Strings[(Reg)])
|
||||||
|
|
||||||
void SseMoveAlignedVariableToReg(void * Variable, char * VariableName, int sseReg)
|
void SseMoveAlignedVariableToReg(void * Variable, char * VariableName, int sseReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
CPU_Message(" movaps %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
||||||
|
|
||||||
|
@ -51,7 +55,7 @@ void SseMoveAlignedVariableToReg(void * Variable, char * VariableName, int sseRe
|
||||||
|
|
||||||
void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg)
|
void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps %s, xmmword ptr [Dmem+%s]", sse_Name(sseReg), x86_Name(AddrReg));
|
CPU_Message(" movaps %s, xmmword ptr [Dmem+%s]", sse_Name(sseReg), x86_Name(AddrReg));
|
||||||
|
|
||||||
|
@ -85,7 +89,7 @@ void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
|
|
||||||
void SseMoveAlignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
void SseMoveAlignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
CPU_Message(" movaps xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
||||||
|
|
||||||
|
@ -108,7 +112,7 @@ void SseMoveAlignedRegToVariable(int sseReg, void * Variable, char * VariableNam
|
||||||
|
|
||||||
void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg)
|
void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps xmmword ptr [Dmem+%s], %s", x86_Name(AddrReg), sse_Name(sseReg));
|
CPU_Message(" movaps xmmword ptr [Dmem+%s], %s", x86_Name(AddrReg), sse_Name(sseReg));
|
||||||
|
|
||||||
|
@ -142,7 +146,7 @@ void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
|
|
||||||
void SseMoveUnalignedVariableToReg(void * Variable, char * VariableName, int sseReg)
|
void SseMoveUnalignedVariableToReg(void * Variable, char * VariableName, int sseReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
CPU_Message(" movups %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
||||||
|
|
||||||
|
@ -165,7 +169,7 @@ void SseMoveUnalignedVariableToReg(void * Variable, char * VariableName, int sse
|
||||||
|
|
||||||
void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg)
|
void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups %s, xmmword ptr [Dmem+%s]", sse_Name(sseReg), x86_Name(AddrReg));
|
CPU_Message(" movups %s, xmmword ptr [Dmem+%s]", sse_Name(sseReg), x86_Name(AddrReg));
|
||||||
|
|
||||||
|
@ -199,7 +203,7 @@ void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
|
|
||||||
void SseMoveUnalignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
void SseMoveUnalignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
CPU_Message(" movups xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
||||||
|
|
||||||
|
@ -222,7 +226,7 @@ void SseMoveUnalignedRegToVariable(int sseReg, void * Variable, char * VariableN
|
||||||
|
|
||||||
void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg)
|
void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups xmmword ptr [Dmem+%s], %s", x86_Name(AddrReg), sse_Name(sseReg));
|
CPU_Message(" movups xmmword ptr [Dmem+%s], %s", x86_Name(AddrReg), sse_Name(sseReg));
|
||||||
|
|
||||||
|
@ -256,7 +260,7 @@ void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
|
|
||||||
void SseMoveRegToReg(int Dest, int Source)
|
void SseMoveRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps %s, %s", sse_Name(Dest), sse_Name(Source));
|
CPU_Message(" movaps %s, %s", sse_Name(Dest), sse_Name(Source));
|
||||||
|
|
||||||
|
@ -289,7 +293,7 @@ void SseMoveRegToReg(int Dest, int Source)
|
||||||
|
|
||||||
void SseXorRegToReg(int Dest, int Source)
|
void SseXorRegToReg(int Dest, int Source)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" xorps %s, %s", sse_Name(Dest), sse_Name(Source));
|
CPU_Message(" xorps %s, %s", sse_Name(Dest), sse_Name(Source));
|
||||||
|
|
||||||
|
@ -319,9 +323,9 @@ void SseXorRegToReg(int Dest, int Source)
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseShuffleReg(int Dest, int Source, BYTE Immed)
|
void SseShuffleReg(int Dest, int Source, uint8_t Immed)
|
||||||
{
|
{
|
||||||
BYTE x86Command = 0;
|
uint8_t x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" shufps %s, %s, %02X", sse_Name(Dest), sse_Name(Source), Immed);
|
CPU_Message(" shufps %s, %s, %02X", sse_Name(Dest), sse_Name(Source), Immed);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,3 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
enum x86RegValues
|
enum x86RegValues
|
||||||
{
|
{
|
||||||
x86_EAX = 0,
|
x86_EAX = 0,
|
||||||
|
@ -37,23 +40,23 @@ enum sseRegValues
|
||||||
void AdcX86RegToX86Reg(int Destination, int Source);
|
void AdcX86RegToX86Reg(int Destination, int Source);
|
||||||
void AdcX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
void AdcX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void AdcX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
void AdcX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void AdcConstToX86reg(BYTE Constant, int x86reg);
|
void AdcConstToX86reg(uint8_t Constant, int x86reg);
|
||||||
void AdcConstToVariable(void * Variable, char * VariableName, BYTE Constant);
|
void AdcConstToVariable(void * Variable, char * VariableName, uint8_t Constant);
|
||||||
void AdcConstHalfToVariable(void * Variable, char * VariableName, BYTE Constant);
|
void AdcConstHalfToVariable(void * Variable, char * VariableName, uint8_t Constant);
|
||||||
void AddConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void AddConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void AddConstToX86Reg(int x86Reg, size_t Const);
|
void AddConstToX86Reg(int x86Reg, size_t Const);
|
||||||
void AddVariableToX86reg(int x86reg, void * Variable, char * VariableName);
|
void AddVariableToX86reg(int x86reg, void * Variable, char * VariableName);
|
||||||
void AddX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
void AddX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void AddX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
void AddX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void AddX86RegToX86Reg(int Destination, int Source);
|
void AddX86RegToX86Reg(int Destination, int Source);
|
||||||
void AndConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void AndConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void AndConstToX86Reg(int x86Reg, DWORD Const);
|
void AndConstToX86Reg(int x86Reg, uint32_t Const);
|
||||||
void AndVariableToX86Reg(void * Variable, char * VariableName, int x86Reg);
|
void AndVariableToX86Reg(void * Variable, char * VariableName, int x86Reg);
|
||||||
void AndVariableToX86regHalf(void * Variable, char * VariableName, int x86Reg);
|
void AndVariableToX86regHalf(void * Variable, char * VariableName, int x86Reg);
|
||||||
void AndX86RegToVariable(void * Variable, char * VariableName, int x86Reg);
|
void AndX86RegToVariable(void * Variable, char * VariableName, int x86Reg);
|
||||||
void AndX86RegToX86Reg(int Destination, int Source);
|
void AndX86RegToX86Reg(int Destination, int Source);
|
||||||
void AndX86RegHalfToX86RegHalf(int Destination, int Source);
|
void AndX86RegHalfToX86RegHalf(int Destination, int Source);
|
||||||
void X86BreakPoint(LPCSTR FileName, int LineNumber);
|
void X86BreakPoint(const char * FileName, int LineNumber);
|
||||||
void BsrX86RegToX86Reg(int Destination, int Source);
|
void BsrX86RegToX86Reg(int Destination, int Source);
|
||||||
void Call_Direct(void * FunctAddress, char * FunctName);
|
void Call_Direct(void * FunctAddress, char * FunctName);
|
||||||
void Call_Indirect(void * FunctAddress, char * FunctName);
|
void Call_Indirect(void * FunctAddress, char * FunctName);
|
||||||
|
@ -63,9 +66,9 @@ void CondMoveGreater(int Destination, int Source);
|
||||||
void CondMoveGreaterEqual(int Destination, int Source);
|
void CondMoveGreaterEqual(int Destination, int Source);
|
||||||
void CondMoveLess(int Destination, int Source);
|
void CondMoveLess(int Destination, int Source);
|
||||||
void CondMoveLessEqual(int Destination, int Source);
|
void CondMoveLessEqual(int Destination, int Source);
|
||||||
void CompConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void CompConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void CompConstHalfToVariable(WORD Const, void * Variable, char * VariableName);
|
void CompConstHalfToVariable(uint16_t Const, void * Variable, char * VariableName);
|
||||||
void CompConstToX86reg(int x86Reg, DWORD Const);
|
void CompConstToX86reg(int x86Reg, uint32_t Const);
|
||||||
void CompX86regToVariable(int x86Reg, void * Variable, char * VariableName);
|
void CompX86regToVariable(int x86Reg, void * Variable, char * VariableName);
|
||||||
void CompVariableToX86reg(int x86Reg, void * Variable, char * VariableName);
|
void CompVariableToX86reg(int x86Reg, void * Variable, char * VariableName);
|
||||||
void CompX86RegToX86Reg(int Destination, int Source);
|
void CompX86RegToX86Reg(int Destination, int Source);
|
||||||
|
@ -77,48 +80,48 @@ void idivX86reg(int x86reg);
|
||||||
void imulX86reg(int x86reg);
|
void imulX86reg(int x86reg);
|
||||||
void ImulX86RegToX86Reg(int Destination, int Source);
|
void ImulX86RegToX86Reg(int Destination, int Source);
|
||||||
void IncX86reg(int x86Reg);
|
void IncX86reg(int x86Reg);
|
||||||
void JaeLabel32(char * Label, DWORD Value);
|
void JaeLabel32(char * Label, uint32_t Value);
|
||||||
void JaLabel8(char * Label, BYTE Value);
|
void JaLabel8(char * Label, uint8_t Value);
|
||||||
void JaLabel32(char * Label, DWORD Value);
|
void JaLabel32(char * Label, uint32_t Value);
|
||||||
void JbLabel8(char * Label, BYTE Value);
|
void JbLabel8(char * Label, uint8_t Value);
|
||||||
void JbLabel32(char * Label, DWORD Value);
|
void JbLabel32(char * Label, uint32_t Value);
|
||||||
void JeLabel8(char * Label, BYTE Value);
|
void JeLabel8(char * Label, uint8_t Value);
|
||||||
void JeLabel32(char * Label, DWORD Value);
|
void JeLabel32(char * Label, uint32_t Value);
|
||||||
void JgeLabel8(char * Label, BYTE Value);
|
void JgeLabel8(char * Label, uint8_t Value);
|
||||||
void JgeLabel32(char * Label, DWORD Value);
|
void JgeLabel32(char * Label, uint32_t Value);
|
||||||
void JgLabel8(char * Label, BYTE Value);
|
void JgLabel8(char * Label, uint8_t Value);
|
||||||
void JgLabel32(char * Label, DWORD Value);
|
void JgLabel32(char * Label, uint32_t Value);
|
||||||
void JleLabel8(char * Label, BYTE Value);
|
void JleLabel8(char * Label, uint8_t Value);
|
||||||
void JleLabel32(char * Label, DWORD Value);
|
void JleLabel32(char * Label, uint32_t Value);
|
||||||
void JlLabel8(char * Label, BYTE Value);
|
void JlLabel8(char * Label, uint8_t Value);
|
||||||
void JlLabel32(char * Label, DWORD Value);
|
void JlLabel32(char * Label, uint32_t Value);
|
||||||
void JumpX86Reg(int x86reg);
|
void JumpX86Reg(int x86reg);
|
||||||
void JmpLabel8(char * Label, BYTE Value);
|
void JmpLabel8(char * Label, uint8_t Value);
|
||||||
void JmpLabel32(char * Label, DWORD Value);
|
void JmpLabel32(char * Label, uint32_t Value);
|
||||||
void JneLabel8(char * Label, BYTE Value);
|
void JneLabel8(char * Label, uint8_t Value);
|
||||||
void JneLabel32(char * Label, DWORD Value);
|
void JneLabel32(char * Label, uint32_t Value);
|
||||||
void JnsLabel8(char * Label, BYTE Value);
|
void JnsLabel8(char * Label, uint8_t Value);
|
||||||
void JnsLabel32(char * Label, DWORD Value);
|
void JnsLabel32(char * Label, uint32_t Value);
|
||||||
void JsLabel32(char * Label, DWORD Value);
|
void JsLabel32(char * Label, uint32_t Value);
|
||||||
void LeaSourceAndOffset(int x86DestReg, int x86SourceReg, size_t offset);
|
void LeaSourceAndOffset(int x86DestReg, int x86SourceReg, size_t offset);
|
||||||
void MoveConstByteToN64Mem(BYTE Const, int AddrReg);
|
void MoveConstByteToN64Mem(uint8_t Const, int AddrReg);
|
||||||
void MoveConstHalfToN64Mem(WORD Const, int AddrReg);
|
void MoveConstHalfToN64Mem(uint16_t Const, int AddrReg);
|
||||||
void MoveConstByteToVariable(BYTE Const, void * Variable, char * VariableName);
|
void MoveConstByteToVariable(uint8_t Const, void * Variable, char * VariableName);
|
||||||
void MoveConstHalfToVariable(WORD Const, void * Variable, char * VariableName);
|
void MoveConstHalfToVariable(uint16_t Const, void * Variable, char * VariableName);
|
||||||
void MoveConstToN64Mem(DWORD Const, int AddrReg);
|
void MoveConstToN64Mem(uint32_t Const, int AddrReg);
|
||||||
void MoveConstToN64MemDisp(DWORD Const, int AddrReg, BYTE Disp);
|
void MoveConstToN64MemDisp(uint32_t Const, int AddrReg, uint8_t Disp);
|
||||||
void MoveConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void MoveConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void MoveConstToX86reg(DWORD Const, int x86reg);
|
void MoveConstToX86reg(uint32_t Const, int x86reg);
|
||||||
void MoveOffsetToX86reg(size_t Const, char * VariableName, int x86reg);
|
void MoveOffsetToX86reg(size_t Const, char * VariableName, int x86reg);
|
||||||
void MoveX86regByteToX86regPointer(int Source, int AddrReg);
|
void MoveX86regByteToX86regPointer(int Source, int AddrReg);
|
||||||
void MoveX86regHalfToX86regPointer(int Source, int AddrReg);
|
void MoveX86regHalfToX86regPointer(int Source, int AddrReg);
|
||||||
void MoveX86regHalfToX86regPointerDisp(int Source, int AddrReg, BYTE Disp);
|
void MoveX86regHalfToX86regPointerDisp(int Source, int AddrReg, uint8_t Disp);
|
||||||
void MoveX86regToX86regPointer(int Source, int AddrReg);
|
void MoveX86regToX86regPointer(int Source, int AddrReg);
|
||||||
void MoveX86RegToX86regPointerDisp(int Source, int AddrReg, BYTE Disp);
|
void MoveX86RegToX86regPointerDisp(int Source, int AddrReg, uint8_t Disp);
|
||||||
void MoveX86regPointerToX86regByte(int Destination, int AddrReg);
|
void MoveX86regPointerToX86regByte(int Destination, int AddrReg);
|
||||||
void MoveX86regPointerToX86regHalf(int Destination, int AddrReg);
|
void MoveX86regPointerToX86regHalf(int Destination, int AddrReg);
|
||||||
void MoveX86regPointerToX86reg(int Destination, int AddrReg);
|
void MoveX86regPointerToX86reg(int Destination, int AddrReg);
|
||||||
void MoveN64MemDispToX86reg(int x86reg, int AddrReg, BYTE Disp);
|
void MoveN64MemDispToX86reg(int x86reg, int AddrReg, uint8_t Disp);
|
||||||
void MoveN64MemToX86reg(int x86reg, int AddrReg);
|
void MoveN64MemToX86reg(int x86reg, int AddrReg);
|
||||||
void MoveN64MemToX86regByte(int x86reg, int AddrReg);
|
void MoveN64MemToX86regByte(int x86reg, int AddrReg);
|
||||||
void MoveN64MemToX86regHalf(int x86reg, int AddrReg);
|
void MoveN64MemToX86regHalf(int x86reg, int AddrReg);
|
||||||
|
@ -127,20 +130,20 @@ void MoveX86regByteToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void MoveX86regHalfToN64Mem(int x86reg, int AddrReg);
|
void MoveX86regHalfToN64Mem(int x86reg, int AddrReg);
|
||||||
void MoveX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
void MoveX86regHalfToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void MoveX86regToN64Mem(int x86reg, int AddrReg);
|
void MoveX86regToN64Mem(int x86reg, int AddrReg);
|
||||||
void MoveX86regToN64MemDisp(int x86reg, int AddrReg, BYTE Disp);
|
void MoveX86regToN64MemDisp(int x86reg, int AddrReg, uint8_t Disp);
|
||||||
void MoveX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
void MoveX86regToVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void MoveX86RegToX86Reg(int Source, int Destination);
|
void MoveX86RegToX86Reg(int Source, int Destination);
|
||||||
void MoveVariableToX86reg(void * Variable, char * VariableName, int x86reg);
|
void MoveVariableToX86reg(void * Variable, char * VariableName, int x86reg);
|
||||||
void MoveVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
void MoveVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
||||||
void MoveVariableToX86regHalf(void * Variable, char * VariableName, int x86reg);
|
void MoveVariableToX86regHalf(void * Variable, char * VariableName, int x86reg);
|
||||||
void MoveSxX86RegHalfToX86Reg(int Source, int Destination);
|
void MoveSxX86RegHalfToX86Reg(int Source, int Destination);
|
||||||
void MoveSxX86RegPtrDispToX86RegHalf(int AddrReg, BYTE Disp, int Destination);
|
void MoveSxX86RegPtrDispToX86RegHalf(int AddrReg, uint8_t Disp, int Destination);
|
||||||
void MoveSxN64MemToX86regByte(int x86reg, int AddrReg);
|
void MoveSxN64MemToX86regByte(int x86reg, int AddrReg);
|
||||||
void MoveSxN64MemToX86regHalf(int x86reg, int AddrReg);
|
void MoveSxN64MemToX86regHalf(int x86reg, int AddrReg);
|
||||||
void MoveSxVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
void MoveSxVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
||||||
void MoveSxVariableToX86regHalf(void * Variable, char * VariableName, int x86reg);
|
void MoveSxVariableToX86regHalf(void * Variable, char * VariableName, int x86reg);
|
||||||
void MoveZxX86RegHalfToX86Reg(int Source, int Destination);
|
void MoveZxX86RegHalfToX86Reg(int Source, int Destination);
|
||||||
void MoveZxX86RegPtrDispToX86RegHalf(int AddrReg, BYTE Disp, int Destination);
|
void MoveZxX86RegPtrDispToX86RegHalf(int AddrReg, uint8_t Disp, int Destination);
|
||||||
void MoveZxN64MemToX86regByte(int x86reg, int AddrReg);
|
void MoveZxN64MemToX86regByte(int x86reg, int AddrReg);
|
||||||
void MoveZxN64MemToX86regHalf(int x86reg, int AddrReg);
|
void MoveZxN64MemToX86regHalf(int x86reg, int AddrReg);
|
||||||
void MoveZxVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
void MoveZxVariableToX86regByte(void * Variable, char * VariableName, int x86reg);
|
||||||
|
@ -148,8 +151,8 @@ void MoveZxVariableToX86regHalf(void * Variable, char * VariableName, int x86reg
|
||||||
void MulX86reg(int x86reg);
|
void MulX86reg(int x86reg);
|
||||||
void NegateX86reg(int x86reg);
|
void NegateX86reg(int x86reg);
|
||||||
void NotX86reg(int x86reg);
|
void NotX86reg(int x86reg);
|
||||||
void OrConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void OrConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void OrConstToX86Reg(DWORD Const, int x86Reg);
|
void OrConstToX86Reg(uint32_t Const, int x86Reg);
|
||||||
void OrVariableToX86Reg(void * Variable, char * VariableName, int x86Reg);
|
void OrVariableToX86Reg(void * Variable, char * VariableName, int x86Reg);
|
||||||
void OrVariableToX86regHalf(void * Variable, char * VariableName, int x86Reg);
|
void OrVariableToX86regHalf(void * Variable, char * VariableName, int x86Reg);
|
||||||
void OrX86RegToVariable(void * Variable, char * VariableName, int x86Reg);
|
void OrX86RegToVariable(void * Variable, char * VariableName, int x86Reg);
|
||||||
|
@ -158,7 +161,7 @@ void Popad(void);
|
||||||
void Pushad(void);
|
void Pushad(void);
|
||||||
void Push(int x86reg);
|
void Push(int x86reg);
|
||||||
void Pop(int x86reg);
|
void Pop(int x86reg);
|
||||||
void PushImm32(char * String, DWORD Value);
|
void PushImm32(char * String, uint32_t Value);
|
||||||
void Ret(void);
|
void Ret(void);
|
||||||
void Seta(int x86reg);
|
void Seta(int x86reg);
|
||||||
void Setae(int x86reg);
|
void Setae(int x86reg);
|
||||||
|
@ -176,32 +179,32 @@ void SetaVariable(void * Variable, char * VariableName);
|
||||||
void SetzVariable(void * Variable, char * VariableName);
|
void SetzVariable(void * Variable, char * VariableName);
|
||||||
void SetnzVariable(void * Variable, char * VariableName);
|
void SetnzVariable(void * Variable, char * VariableName);
|
||||||
void ShiftLeftSign(int x86reg);
|
void ShiftLeftSign(int x86reg);
|
||||||
void ShiftLeftSignImmed(int x86reg, BYTE Immediate);
|
void ShiftLeftSignImmed(int x86reg, uint8_t Immediate);
|
||||||
void ShiftLeftSignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
void ShiftLeftSignVariableImmed(void * Variable, char * VariableName, uint8_t Immediate);
|
||||||
void ShiftRightSignImmed(int x86reg, BYTE Immediate);
|
void ShiftRightSignImmed(int x86reg, uint8_t Immediate);
|
||||||
void ShiftRightSignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
void ShiftRightSignVariableImmed(void * Variable, char * VariableName, uint8_t Immediate);
|
||||||
void ShiftRightUnsign(int x86reg);
|
void ShiftRightUnsign(int x86reg);
|
||||||
void ShiftRightUnsignImmed(int x86reg, BYTE Immediate);
|
void ShiftRightUnsignImmed(int x86reg, uint8_t Immediate);
|
||||||
void ShiftRightUnsignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
void ShiftRightUnsignVariableImmed(void * Variable, char * VariableName, uint8_t Immediate);
|
||||||
void ShiftLeftDoubleImmed(int Destination, int Source, BYTE Immediate);
|
void ShiftLeftDoubleImmed(int Destination, int Source, uint8_t Immediate);
|
||||||
void ShiftRightDoubleImmed(int Destination, int Source, BYTE Immediate);
|
void ShiftRightDoubleImmed(int Destination, int Source, uint8_t Immediate);
|
||||||
void SubConstFromVariable(DWORD Const, void * Variable, char * VariableName);
|
void SubConstFromVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void SubConstFromX86Reg(int x86Reg, DWORD Const);
|
void SubConstFromX86Reg(int x86Reg, uint32_t Const);
|
||||||
void SubVariableFromX86reg(int x86reg, void * Variable, char * VariableName);
|
void SubVariableFromX86reg(int x86reg, void * Variable, char * VariableName);
|
||||||
void SubX86RegToX86Reg(int Destination, int Source);
|
void SubX86RegToX86Reg(int Destination, int Source);
|
||||||
void SubX86regFromVariable(int x86reg, void * Variable, char * VariableName);
|
void SubX86regFromVariable(int x86reg, void * Variable, char * VariableName);
|
||||||
void SbbX86RegToX86Reg(int Destination, int Source);
|
void SbbX86RegToX86Reg(int Destination, int Source);
|
||||||
void TestConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
void TestConstToVariable(uint32_t Const, void * Variable, char * VariableName);
|
||||||
void TestConstToX86Reg(DWORD Const, int x86reg);
|
void TestConstToX86Reg(uint32_t Const, int x86reg);
|
||||||
void TestX86RegToX86Reg(int Destination, int Source);
|
void TestX86RegToX86Reg(int Destination, int Source);
|
||||||
void XorConstToX86Reg(int x86Reg, DWORD Const);
|
void XorConstToX86Reg(int x86Reg, uint32_t Const);
|
||||||
void XorX86RegToX86Reg(int Source, int Destination);
|
void XorX86RegToX86Reg(int Source, int Destination);
|
||||||
void XorVariableToX86reg(void * Variable, char * VariableName, int x86reg);
|
void XorVariableToX86reg(void * Variable, char * VariableName, int x86reg);
|
||||||
void XorX86RegToVariable(void * Variable, char * VariableName, int x86reg);
|
void XorX86RegToVariable(void * Variable, char * VariableName, int x86reg);
|
||||||
void XorConstToVariable(void * Variable, char * VariableName, DWORD Const);
|
void XorConstToVariable(void * Variable, char * VariableName, uint32_t Const);
|
||||||
|
|
||||||
#define _MMX_SHUFFLE(a, b, c, d) \
|
#define _MMX_SHUFFLE(a, b, c, d) \
|
||||||
((BYTE)(((a) << 6) | ((b) << 4) | ((c) << 2) | (d)))
|
((uint8_t)(((a) << 6) | ((b) << 4) | ((c) << 2) | (d)))
|
||||||
|
|
||||||
void MmxMoveRegToReg(int Dest, int Source);
|
void MmxMoveRegToReg(int Dest, int Source);
|
||||||
void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName);
|
void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName);
|
||||||
|
@ -212,16 +215,16 @@ void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest);
|
||||||
void MmxPorRegToReg(int Dest, int Source);
|
void MmxPorRegToReg(int Dest, int Source);
|
||||||
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest);
|
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest);
|
||||||
void MmxXorRegToReg(int Dest, int Source);
|
void MmxXorRegToReg(int Dest, int Source);
|
||||||
void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, BYTE Immed);
|
void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, uint8_t Immed);
|
||||||
void MmxPcmpeqwRegToReg(int Dest, int Source);
|
void MmxPcmpeqwRegToReg(int Dest, int Source);
|
||||||
void MmxPmullwRegToReg(int Dest, int Source);
|
void MmxPmullwRegToReg(int Dest, int Source);
|
||||||
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName);
|
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName);
|
||||||
void MmxPmulhuwRegToReg(int Dest, int Source);
|
void MmxPmulhuwRegToReg(int Dest, int Source);
|
||||||
void MmxPmulhwRegToReg(int Dest, int Source);
|
void MmxPmulhwRegToReg(int Dest, int Source);
|
||||||
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName);
|
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName);
|
||||||
void MmxPsrlwImmed(int Dest, BYTE Immed);
|
void MmxPsrlwImmed(int Dest, uint8_t Immed);
|
||||||
void MmxPsrawImmed(int Dest, BYTE Immed);
|
void MmxPsrawImmed(int Dest, uint8_t Immed);
|
||||||
void MmxPsllwImmed(int Dest, BYTE Immed);
|
void MmxPsllwImmed(int Dest, uint8_t Immed);
|
||||||
void MmxPaddswRegToReg(int Dest, int Source);
|
void MmxPaddswRegToReg(int Dest, int Source);
|
||||||
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName);
|
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName);
|
||||||
void MmxPaddwRegToReg(int Dest, int Source);
|
void MmxPaddwRegToReg(int Dest, int Source);
|
||||||
|
@ -261,7 +264,7 @@ typedef union
|
||||||
|
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
||||||
void SseShuffleReg(int Dest, int Source, BYTE Immed);
|
void SseShuffleReg(int Dest, int Source, uint8_t Immed);
|
||||||
|
|
||||||
void x86_SetBranch32b(void * JumpByte, void * Destination);
|
void x86_SetBranch32b(void * Jumpuint8_t, void * Destination);
|
||||||
void x86_SetBranch8b(void * JumpByte, void * Destination);
|
void x86_SetBranch8b(void * Jumpuint8_t, void * Destination);
|
|
@ -0,0 +1,43 @@
|
||||||
|
#include "RspSettings.h"
|
||||||
|
#include "RspSettingsID.h"
|
||||||
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
|
#include <Settings/Settings.h>
|
||||||
|
|
||||||
|
uint16_t Set_AudioHle = 0, Set_GraphicsHle = 0;
|
||||||
|
bool GraphicsHle = true, AudioHle, ConditionalMove;
|
||||||
|
bool DebuggingEnabled = false, Profiling, IndvidualBlock, ShowErrors, BreakOnStart = false, LogRDP = false, LogX86Code = false;
|
||||||
|
|
||||||
|
void InitializeRspSetting(void)
|
||||||
|
{
|
||||||
|
SetModuleName("RSP");
|
||||||
|
Set_GraphicsHle = FindSystemSettingId("HLE GFX");
|
||||||
|
Set_AudioHle = FindSystemSettingId("HLE Audio");
|
||||||
|
|
||||||
|
RegisterSetting(Set_BreakOnStart, Data_DWORD_General, "Break on Start", NULL, BreakOnStart, NULL);
|
||||||
|
RegisterSetting(Set_CPUCore, Data_DWORD_General, "CPU Method", NULL, g_CPUCore, NULL);
|
||||||
|
RegisterSetting(Set_LogRDP, Data_DWORD_General, "Log RDP", NULL, LogRDP, NULL);
|
||||||
|
RegisterSetting(Set_LogX86Code, Data_DWORD_General, "Log X86 Code", NULL, LogX86Code, NULL);
|
||||||
|
RegisterSetting(Set_Profiling, Data_DWORD_General, "Profiling", NULL, Profiling, NULL);
|
||||||
|
RegisterSetting(Set_IndvidualBlock, Data_DWORD_General, "Individual Block", NULL, IndvidualBlock, NULL);
|
||||||
|
RegisterSetting(Set_ShowErrors, Data_DWORD_General, "Show Errors", NULL, ShowErrors, NULL);
|
||||||
|
|
||||||
|
// Compiler settings
|
||||||
|
RegisterSetting(Set_CheckDest, Data_DWORD_General, "Check Destination Vector", NULL, Compiler.bDest, NULL);
|
||||||
|
RegisterSetting(Set_Accum, Data_DWORD_General, "Check Destination Accumulator", NULL, Compiler.bAccum, NULL);
|
||||||
|
RegisterSetting(Set_Mmx, Data_DWORD_General, "Use MMX", NULL, Compiler.mmx, NULL);
|
||||||
|
RegisterSetting(Set_Mmx2, Data_DWORD_General, "Use MMX2", NULL, Compiler.mmx2, NULL);
|
||||||
|
RegisterSetting(Set_Sse, Data_DWORD_General, "Use SSE", NULL, Compiler.sse, NULL);
|
||||||
|
RegisterSetting(Set_Sections, Data_DWORD_General, "Use precompiled sections", NULL, Compiler.bSections, NULL);
|
||||||
|
RegisterSetting(Set_ReOrdering, Data_DWORD_General, "Reorder opcodes", NULL, Compiler.bReOrdering, NULL);
|
||||||
|
RegisterSetting(Set_GPRConstants, Data_DWORD_General, "Detect GPR Constants", NULL, Compiler.bGPRConstants, NULL);
|
||||||
|
RegisterSetting(Set_Flags, Data_DWORD_General, "Check Flag Usage", NULL, Compiler.bFlags, NULL);
|
||||||
|
RegisterSetting(Set_AlignVector, Data_DWORD_General, "Assume Vector loads align", NULL, Compiler.bAlignVector, NULL);
|
||||||
|
|
||||||
|
RegisterSetting(Set_JumpTableSize, Data_DWORD_Game, "JumpTableSize", NULL, 0x800, NULL);
|
||||||
|
RegisterSetting(Set_Mfc0Count, Data_DWORD_Game, "Mfc0Count", NULL, 0x0, NULL);
|
||||||
|
RegisterSetting(Set_SemaphoreExit, Data_DWORD_Game, "SemaphoreExit", NULL, 0x0, NULL);
|
||||||
|
|
||||||
|
AudioHle = Set_AudioHle != 0 ? GetSystemSetting(Set_AudioHle) != 0 : false;
|
||||||
|
GraphicsHle = Set_GraphicsHle != 0 ? GetSystemSetting(Set_GraphicsHle) != 0 : true;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void InitializeRspSetting(void);
|
||||||
|
|
||||||
|
extern uint16_t Set_AudioHle, Set_GraphicsHle;
|
||||||
|
extern bool GraphicsHle, AudioHle, ConditionalMove;
|
||||||
|
extern bool DebuggingEnabled, Profiling, IndvidualBlock, ShowErrors, BreakOnStart, LogRDP, LogX86Code;
|
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
Set_BreakOnStart,
|
||||||
|
Set_CPUCore,
|
||||||
|
Set_LogRDP,
|
||||||
|
Set_LogX86Code,
|
||||||
|
Set_Profiling,
|
||||||
|
Set_IndvidualBlock,
|
||||||
|
Set_AccurateEmulation,
|
||||||
|
Set_ShowErrors,
|
||||||
|
|
||||||
|
// Compiler settings
|
||||||
|
Set_CheckDest,
|
||||||
|
Set_Accum,
|
||||||
|
Set_Mmx,
|
||||||
|
Set_Mmx2,
|
||||||
|
Set_Sse,
|
||||||
|
Set_Sections,
|
||||||
|
Set_ReOrdering,
|
||||||
|
Set_GPRConstants,
|
||||||
|
Set_Flags,
|
||||||
|
Set_AlignVector,
|
||||||
|
|
||||||
|
// Game settings
|
||||||
|
Set_JumpTableSize,
|
||||||
|
Set_Mfc0Count,
|
||||||
|
Set_SemaphoreExit
|
||||||
|
};
|
|
@ -1,9 +1,12 @@
|
||||||
#include "RSPCpu.h"
|
#include "RSPCpu.h"
|
||||||
#include "RSPInterpreterCPU.h"
|
#include "RSPInterpreterCPU.h"
|
||||||
#include "RSPRegisters.h"
|
#include "RSPRegisters.h"
|
||||||
|
#include "RspLog.h"
|
||||||
#include <Common/StdString.h>
|
#include <Common/StdString.h>
|
||||||
#include <Project64-rsp-core\RSPDebugger.h>
|
#include <Project64-rsp-core/RSPDebugger.h>
|
||||||
#include <Project64-rsp-core\RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspDma.h>
|
||||||
#include <Settings/Settings.h>
|
#include <Settings/Settings.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
@ -408,8 +411,6 @@ void RSP_Cop0_MF(void)
|
||||||
|
|
||||||
void RSP_Cop0_MT(void)
|
void RSP_Cop0_MT(void)
|
||||||
{
|
{
|
||||||
__debugbreak();
|
|
||||||
#ifdef tofix
|
|
||||||
if (LogRDP && g_CPUCore == InterpreterCPU)
|
if (LogRDP && g_CPUCore == InterpreterCPU)
|
||||||
{
|
{
|
||||||
RDP_LogMT0(*PrgCount, RSPOpC.rd, RSP_GPR[RSPOpC.rt].UW);
|
RDP_LogMT0(*PrgCount, RSPOpC.rd, RSP_GPR[RSPOpC.rt].UW);
|
||||||
|
@ -575,20 +576,19 @@ void RSP_Cop0_MT(void)
|
||||||
}
|
}
|
||||||
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_PIPE_CTR) != 0)
|
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_PIPE_CTR) != 0)
|
||||||
{
|
{
|
||||||
DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR");
|
g_Notify->DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_PIPE_CTR");
|
||||||
}
|
}
|
||||||
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_CMD_CTR) != 0)
|
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_CMD_CTR) != 0)
|
||||||
{
|
{
|
||||||
DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR");
|
g_Notify->DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CMD_CTR");
|
||||||
}
|
}
|
||||||
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_CLOCK_CTR) != 0)
|
if ((RSP_GPR[RSPOpC.rt].W & DPC_CLR_CLOCK_CTR) != 0)
|
||||||
{ /* DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR"); */
|
{ /* DisplayError("RSP: DPC_STATUS_REG: DPC_CLR_CLOCK_CTR"); */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DisplayError("We have not implemented RSP MT CP0 reg %s (%d)", COP0_Name(RSPOpC.rd), RSPOpC.rd);
|
g_Notify->DisplayError(stdstr_f("We have not implemented RSP MT CP0 reg %s (%d)", COP0_Name(RSPOpC.rd), RSPOpC.rd).c_str());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// COP2 functions
|
// COP2 functions
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#pragma once
|
||||||
#include "RspTypes.h"
|
#include "RspTypes.h"
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "Rsp.h"
|
#include "RSPCpu.h"
|
||||||
#include "memory.h"
|
#include "RSPRegisters.h"
|
||||||
|
#include "RspMemory.h"
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Settings/Settings.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
|
||||||
|
|
||||||
// #define RSP_SAFE_DMA // Unoptimized DMA transfers
|
// #define RSP_SAFE_DMA // Unoptimized DMA transfers
|
||||||
|
|
||||||
|
@ -19,13 +19,13 @@ void SP_DMA_READ(void)
|
||||||
|
|
||||||
if (addr > 0x7FFFFF)
|
if (addr > 0x7FFFFF)
|
||||||
{
|
{
|
||||||
DisplayError("SP DMA READ\nSP_DRAM_ADDR_REG not in RDRAM space");
|
g_Notify->DisplayError("SP DMA READ\nSP_DRAM_ADDR_REG not in RDRAM space");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*RSPInfo.SP_RD_LEN_REG & 0xFFF) + 1 + (*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
if ((*RSPInfo.SP_RD_LEN_REG & 0xFFF) + 1 + (*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
||||||
{
|
{
|
||||||
DisplayError("SP DMA READ\nCould not fit copy in memory segment");
|
g_Notify->DisplayError("SP DMA READ\nCould not fit copy in memory segment");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,13 +87,13 @@ void SP_DMA_WRITE(void)
|
||||||
|
|
||||||
if (addr > 0x7FFFFF)
|
if (addr > 0x7FFFFF)
|
||||||
{
|
{
|
||||||
DisplayError("SP DMA WRITE\nSP_DRAM_ADDR_REG not in RDRAM space");
|
g_Notify->DisplayError("SP DMA WRITE\nSP_DRAM_ADDR_REG not in RDRAM space");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*RSPInfo.SP_WR_LEN_REG & 0xFFF) + 1 + (*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
if ((*RSPInfo.SP_WR_LEN_REG & 0xFFF) + 1 + (*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
||||||
{
|
{
|
||||||
DisplayError("SP DMA WRITE\nCould not fit copy in memory segment");
|
g_Notify->DisplayError("SP DMA WRITE\nCould not fit copy in memory segment");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
void SP_DMA_READ(void);
|
void SP_DMA_READ(void);
|
||||||
void SP_DMA_WRITE(void);
|
void SP_DMA_WRITE(void);
|
|
@ -1,14 +1,10 @@
|
||||||
|
#include "RspLog.h"
|
||||||
|
#include "RSPRegisters.h"
|
||||||
#include <Common/File.h>
|
#include <Common/File.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
#include <Common/StdString.h>
|
#include <Common/StdString.h>
|
||||||
#include <Common/path.h>
|
#include <Common/path.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "Log.h"
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
|
||||||
|
|
||||||
CLog * RDPLog = NULL;
|
CLog * RDPLog = NULL;
|
||||||
CLog * CPULog = NULL;
|
CLog * CPULog = NULL;
|
||||||
|
@ -95,7 +91,7 @@ void RDP_Message(const char * Message, ...)
|
||||||
RDPLog->Log(Msg.c_str());
|
RDPLog->Log(Msg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LogMT0(DWORD PC, int Reg, DWORD Value)
|
void RDP_LogMT0(uint32_t PC, int Reg, uint32_t Value)
|
||||||
{
|
{
|
||||||
if (RDPLog == NULL)
|
if (RDPLog == NULL)
|
||||||
{
|
{
|
||||||
|
@ -119,7 +115,7 @@ void RDP_LogMT0(DWORD PC, int Reg, DWORD Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LogMF0(DWORD PC, int Reg)
|
void RDP_LogMF0(uint32_t PC, int Reg)
|
||||||
{
|
{
|
||||||
switch (Reg)
|
switch (Reg)
|
||||||
{
|
{
|
||||||
|
@ -137,19 +133,19 @@ void RDP_LogDlist(void)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DWORD Length = *RSPInfo.DPC_END_REG - *RSPInfo.DPC_CURRENT_REG;
|
uint32_t Length = *RSPInfo.DPC_END_REG - *RSPInfo.DPC_CURRENT_REG;
|
||||||
RDP_Message(" Dlist length = %d bytes", Length);
|
RDP_Message(" Dlist length = %d bytes", Length);
|
||||||
|
|
||||||
DWORD Pos = *RSPInfo.DPC_CURRENT_REG;
|
uint32_t Pos = *RSPInfo.DPC_CURRENT_REG;
|
||||||
while (Pos < *RSPInfo.DPC_END_REG)
|
while (Pos < *RSPInfo.DPC_END_REG)
|
||||||
{
|
{
|
||||||
char Hex[100], Ascii[30];
|
char Hex[100], Ascii[30];
|
||||||
DWORD count;
|
uint32_t count;
|
||||||
|
|
||||||
memset(&Hex, 0, sizeof(Hex));
|
memset(&Hex, 0, sizeof(Hex));
|
||||||
memset(&Ascii, 0, sizeof(Ascii));
|
memset(&Ascii, 0, sizeof(Ascii));
|
||||||
|
|
||||||
BYTE * Mem = RSPInfo.DMEM;
|
uint8_t * Mem = RSPInfo.DMEM;
|
||||||
if ((*RSPInfo.DPC_STATUS_REG & DPC_STATUS_XBUS_DMEM_DMA) == 0)
|
if ((*RSPInfo.DPC_STATUS_REG & DPC_STATUS_XBUS_DMEM_DMA) == 0)
|
||||||
{
|
{
|
||||||
Mem = RSPInfo.RDRAM;
|
Mem = RSPInfo.RDRAM;
|
||||||
|
@ -185,142 +181,9 @@ void RDP_LogDlist(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LogLoc(DWORD /*PC*/)
|
void RDP_LogLoc(uint32_t /*PC*/)
|
||||||
{
|
{
|
||||||
// RDP_Message("%03X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X",PC, RSP_GPR[26].UW, *(DWORD *)&RSPInfo.IMEM[0xDBC],
|
// RDP_Message("%03X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X %08X",PC, RSP_GPR[26].UW, *(uint32_t *)&RSPInfo.IMEM[0xDBC],
|
||||||
// RSP_Flags[0].UW, RSP_Vect[0].UW[0],RSP_Vect[0].UW[1],RSP_Vect[0].UW[2],RSP_Vect[0].UW[3],
|
// RSP_Flags[0].UW, RSP_Vect[0].UW[0],RSP_Vect[0].UW[1],RSP_Vect[0].UW[2],RSP_Vect[0].UW[3],
|
||||||
// RSP_Vect[28].UW[0],RSP_Vect[28].UW[1],RSP_Vect[28].UW[2],RSP_Vect[28].UW[3],RSP_Vect[31].UW[0]);
|
// RSP_Vect[28].UW[0],RSP_Vect[28].UW[1],RSP_Vect[28].UW[2],RSP_Vect[28].UW[3],RSP_Vect[31].UW[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef old
|
|
||||||
|
|
||||||
#include "RSP Registers.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
|
||||||
static HANDLE hCPULogFile = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GenerateLog
|
|
||||||
static HANDLE hLogFile = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
|
||||||
void CPU_Message(char * Message, ...)
|
|
||||||
{
|
|
||||||
DWORD dwWritten;
|
|
||||||
char Msg[400];
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, Message);
|
|
||||||
vsprintf(Msg, Message, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
strcat(Msg, "\r\n");
|
|
||||||
WriteFile(hCPULogFile, Msg, strlen(Msg), &dwWritten, NULL);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GenerateLog
|
|
||||||
void Log_Message(char * Message, ...)
|
|
||||||
{
|
|
||||||
DWORD dwWritten;
|
|
||||||
char Msg[400];
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, Message);
|
|
||||||
vsprintf(Msg, Message, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
strcat(Msg, "\r\n");
|
|
||||||
|
|
||||||
WriteFile(hLogFile, Msg, strlen(Msg), &dwWritten, NULL);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
|
||||||
void Start_x86_Log(void)
|
|
||||||
{
|
|
||||||
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
|
||||||
char File[_MAX_PATH];
|
|
||||||
|
|
||||||
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
|
|
||||||
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
|
||||||
|
|
||||||
sprintf(File, "%s%s\\RSPx86Log.log", drive, dir);
|
|
||||||
|
|
||||||
hCPULogFile = CreateFile(File, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
|
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
|
||||||
SetFilePointer(hCPULogFile, 0, NULL, FILE_BEGIN);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GenerateLog
|
|
||||||
void Log_MT_CP0(unsigned int PC, int CP0Reg, int Value)
|
|
||||||
{
|
|
||||||
switch (CP0Reg)
|
|
||||||
{
|
|
||||||
//case 0: Log_Message("%03X: Stored 0x%08X in SP_MEM_ADDR_REG",PC,Value); break;
|
|
||||||
//case 1: Log_Message("%03X: Stored 0x%08X in SP_DRAM_ADDR_REG",PC,Value); break;
|
|
||||||
//case 2: Log_Message("%03X: Stored 0x%08X in SP_RD_LEN_REG",PC,Value); break;
|
|
||||||
case 3:
|
|
||||||
//Log_Message("%03X: Stored 0x%08X in SP_WR_LEN_REG",PC,Value);
|
|
||||||
Log_Message("Instruction: %08X%08X", RSP_GPR[25].UW, RSP_GPR[24].UW);
|
|
||||||
//Log_Message("");
|
|
||||||
break;
|
|
||||||
/*case 4: Log_Message("%03X: Stored 0x%08X in SP_STATUS_REG",PC,Value); break;
|
|
||||||
case 5: Log_Message("%03X: Stored 0x%08X in SP_DMA_FULL_REG",PC,Value); break;
|
|
||||||
case 6: Log_Message("%03X: Stored 0x%08X in SP_DMA_BUSY_REG",PC,Value); break;
|
|
||||||
case 7: Log_Message("%03X: Stored 0x%08X in SP_SEMAPHORE_REG",PC,Value); break;
|
|
||||||
case 8: Log_Message("%03X: Stored 0x%08X in DPC_START_REG",PC,Value); break;
|
|
||||||
case 9: Log_Message("%03X: Stored 0x%08X in DPC_END_REG",PC,Value); break;
|
|
||||||
case 10: Log_Message("%03X: Stored 0x%08X in DPC_CURRENT_REG",PC,Value); break;
|
|
||||||
case 11: Log_Message("%03X: Stored 0x%08X in DPC_STATUS_REG",PC,Value); break;
|
|
||||||
case 12: Log_Message("%03X: Stored 0x%08X in DPC_CLOCK_REG",PC,Value); break;
|
|
||||||
case 13: Log_Message("%03X: Stored 0x%08X in DPC_BUFBUSY_REG",PC,Value); break;
|
|
||||||
case 14: Log_Message("%03X: Stored 0x%08X in DPC_PIPEBUSY_REG",PC,Value); break;
|
|
||||||
case 15: Log_Message("%03X: Stored 0x%08X in DPC_TMEM_REG",PC,Value); break;
|
|
||||||
default:
|
|
||||||
Log_Message("%03X: Unknown RSP CP0 register %d",PC,CP0Reg);
|
|
||||||
break;*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Start_Log(void)
|
|
||||||
{
|
|
||||||
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
|
||||||
char File[_MAX_PATH];
|
|
||||||
|
|
||||||
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
|
|
||||||
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
|
||||||
|
|
||||||
sprintf(File, "%s%s\\RSP.log", drive, dir);
|
|
||||||
|
|
||||||
hLogFile = CreateFile(File, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
|
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
|
||||||
SetFilePointer(hLogFile, 0, NULL, FILE_BEGIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Stop_Log(void)
|
|
||||||
{
|
|
||||||
if (hLogFile)
|
|
||||||
{
|
|
||||||
CloseHandle(hLogFile);
|
|
||||||
hLogFile = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
|
||||||
void Stop_x86_Log(void)
|
|
||||||
{
|
|
||||||
if (hCPULogFile)
|
|
||||||
{
|
|
||||||
CloseHandle(hCPULogFile);
|
|
||||||
hCPULogFile = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <windows.h>
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
void StartCPULog(void);
|
void StartCPULog(void);
|
||||||
void StopCPULog(void);
|
void StopCPULog(void);
|
||||||
|
@ -8,6 +9,6 @@ void StartRDPLog(void);
|
||||||
void StopRDPLog(void);
|
void StopRDPLog(void);
|
||||||
void RDP_Message(const char * Message, ...);
|
void RDP_Message(const char * Message, ...);
|
||||||
void RDP_LogDlist(void);
|
void RDP_LogDlist(void);
|
||||||
void RDP_LogMT0(DWORD PC, int Reg, DWORD Value);
|
void RDP_LogMT0(uint32_t PC, int Reg, uint32_t Value);
|
||||||
void RDP_LogMF0(DWORD PC, int Reg);
|
void RDP_LogMF0(uint32_t PC, int Reg);
|
||||||
void RDP_LogLoc(DWORD PC);
|
void RDP_LogLoc(uint32_t PC);
|
|
@ -1,48 +1,52 @@
|
||||||
|
#include <Common/MemoryManagement.h>
|
||||||
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Settings/Settings.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MaxMaps = 32
|
MaxMaps = 32
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
uint32_t NoOfMaps, MapsCRC[MaxMaps];
|
uint32_t NoOfMaps, MapsCRC[MaxMaps];
|
||||||
uint32_t Table;
|
uint32_t Table;
|
||||||
BYTE *RecompCode, *RecompCodeSecondary, *RecompPos, *JumpTables;
|
uint8_t *RecompCode, *RecompCodeSecondary, *RecompPos, *JumpTables;
|
||||||
void ** JumpTable;
|
void ** JumpTable;
|
||||||
|
|
||||||
int AllocateMemory(void)
|
int AllocateMemory(void)
|
||||||
{
|
{
|
||||||
if (RecompCode == NULL)
|
if (RecompCode == nullptr)
|
||||||
{
|
{
|
||||||
RecompCode = (BYTE *)VirtualAlloc(NULL, 0x00400004, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
RecompCode = (uint8_t *)AllocateAddressSpace(0x00400004);
|
||||||
RecompCode = (BYTE *)VirtualAlloc(RecompCode, 0x00400000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
RecompCode = (uint8_t *)CommitMemory(RecompCode, 0x00400000, MEM_EXECUTE_READWRITE);
|
||||||
|
|
||||||
if (RecompCode == NULL)
|
if (RecompCode == nullptr)
|
||||||
{
|
{
|
||||||
DisplayError("Not enough memory for RSP RecompCode!");
|
g_Notify->DisplayError("Not enough memory for RSP RecompCode!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RecompCodeSecondary == NULL)
|
if (RecompCodeSecondary == nullptr)
|
||||||
{
|
{
|
||||||
RecompCodeSecondary = (BYTE *)VirtualAlloc(NULL, 0x00200000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
RecompCodeSecondary = (uint8_t *)AllocateAddressSpace(0x00200004);
|
||||||
if (RecompCodeSecondary == NULL)
|
RecompCodeSecondary = (uint8_t *)CommitMemory(RecompCode, 0x00200000, MEM_EXECUTE_READWRITE);
|
||||||
|
if (RecompCodeSecondary == nullptr)
|
||||||
{
|
{
|
||||||
DisplayError("Not enough memory for RSP RecompCode Secondary!");
|
g_Notify->DisplayError("Not enough memory for RSP RecompCode Secondary!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JumpTables == NULL)
|
if (JumpTables == nullptr)
|
||||||
{
|
{
|
||||||
JumpTables = (BYTE *)VirtualAlloc(NULL, 0x1000 * MaxMaps, MEM_COMMIT, PAGE_READWRITE);
|
JumpTables = (uint8_t *)AllocateAddressSpace(0x1000 * MaxMaps);
|
||||||
if (JumpTables == NULL)
|
JumpTables = (uint8_t *)CommitMemory(RecompCode, 0x1000 * MaxMaps, MEM_READWRITE);
|
||||||
|
if (JumpTables == nullptr)
|
||||||
{
|
{
|
||||||
DisplayError("Not enough memory for jump table!");
|
g_Notify->DisplayError("Not enough memory for jump table!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,13 +59,13 @@ int AllocateMemory(void)
|
||||||
|
|
||||||
void FreeMemory(void)
|
void FreeMemory(void)
|
||||||
{
|
{
|
||||||
VirtualFree(RecompCode, 0, MEM_RELEASE);
|
FreeAddressSpace(RecompCode, 0x00400004);
|
||||||
VirtualFree(JumpTable, 0, MEM_RELEASE);
|
FreeAddressSpace(JumpTable, 0x1000 * MaxMaps);
|
||||||
VirtualFree(RecompCodeSecondary, 0, MEM_RELEASE);
|
FreeAddressSpace(RecompCodeSecondary, 0x00200004);
|
||||||
|
|
||||||
RecompCode = NULL;
|
RecompCode = nullptr;
|
||||||
JumpTables = NULL;
|
JumpTables = nullptr;
|
||||||
RecompCodeSecondary = NULL;
|
RecompCodeSecondary = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetJumpTables(void)
|
void ResetJumpTables(void)
|
||||||
|
@ -115,7 +119,7 @@ void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value)
|
||||||
{
|
{
|
||||||
if ((Addr & 0x3) != 0)
|
if ((Addr & 0x3) != 0)
|
||||||
{
|
{
|
||||||
DisplayError("Unaligned RSP_LW_IMEM");
|
g_Notify->DisplayError("Unaligned RSP_LW_IMEM");
|
||||||
}
|
}
|
||||||
*Value = *(uint32_t *)(RSPInfo.IMEM + (Addr & 0xFFF));
|
*Value = *(uint32_t *)(RSPInfo.IMEM + (Addr & 0xFFF));
|
||||||
}
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
int AllocateMemory(void);
|
int AllocateMemory(void);
|
|
@ -1,12 +1,13 @@
|
||||||
#include "RSPDebuggerUI.h"
|
#include "RSPDebuggerUI.h"
|
||||||
#include "Profiling.h"
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include "Recompiler CPU.h"
|
#include <Project64-rsp-core/Recompiler/RspProfiling.h>
|
||||||
#include <Project64-rsp-core\RSPInfo.h>
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
#include <Project64-rsp-core\cpu\RSPCpu.h>
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
#include <Project64-rsp-core\cpu\RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp\RSP Command.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp\breakpoint.h>
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
#include <Project64-rsp\log.h>
|
#include <Project64-rsp/RSP Command.h>
|
||||||
|
#include <Project64-rsp/breakpoint.h>
|
||||||
|
|
||||||
void UpdateRSPRegistersScreen(void);
|
void UpdateRSPRegistersScreen(void);
|
||||||
void RDP_LogLoc(DWORD /*PC*/);
|
void RDP_LogLoc(DWORD /*PC*/);
|
||||||
|
|
|
@ -16,18 +16,20 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "Debugger/RSPDebuggerUI.h"
|
#include "Debugger/RSPDebuggerUI.h"
|
||||||
#include "Profiling.h"
|
|
||||||
#include "RSP Command.h"
|
#include "RSP Command.h"
|
||||||
#include "Recompiler CPU.h"
|
|
||||||
#include "Rsp.h"
|
#include "Rsp.h"
|
||||||
#include "breakpoint.h"
|
#include "breakpoint.h"
|
||||||
#include "log.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
|
#include <Project64-rsp-core/Recompiler/RspProfiling.h>
|
||||||
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
|
#include <Project64-rsp-core/Settings/RspSettingsID.h>
|
||||||
#include <Project64-rsp-core/Version.h>
|
#include <Project64-rsp-core/Version.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
#include <Project64-rsp-core/cpu/RSPCpu.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspLog.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
void ClearAllx86Code(void);
|
void ClearAllx86Code(void);
|
||||||
|
@ -37,51 +39,12 @@ BOOL CALLBACK CompilerDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
HMENU hRSPMenu = NULL;
|
HMENU hRSPMenu = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool GraphicsHle = true, AudioHle, ConditionalMove;
|
|
||||||
bool DebuggingEnabled = false,
|
|
||||||
Profiling,
|
|
||||||
IndvidualBlock,
|
|
||||||
ShowErrors,
|
|
||||||
BreakOnStart = false,
|
|
||||||
LogRDP = false,
|
|
||||||
LogX86Code = false;
|
|
||||||
|
|
||||||
DEBUG_INFO DebugInfo;
|
DEBUG_INFO DebugInfo;
|
||||||
void * hinstDLL;
|
void * hinstDLL;
|
||||||
std::unique_ptr<RSPDebuggerUI> g_RSPDebuggerUI;
|
std::unique_ptr<RSPDebuggerUI> g_RSPDebuggerUI;
|
||||||
|
|
||||||
extern uint8_t * pLastSecondary;
|
extern uint8_t * pLastSecondary;
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
Set_BreakOnStart,
|
|
||||||
Set_CPUCore,
|
|
||||||
Set_LogRDP,
|
|
||||||
Set_LogX86Code,
|
|
||||||
Set_Profiling,
|
|
||||||
Set_IndvidualBlock,
|
|
||||||
Set_ShowErrors,
|
|
||||||
|
|
||||||
// Compiler settings
|
|
||||||
Set_CheckDest,
|
|
||||||
Set_Accum,
|
|
||||||
Set_Mmx,
|
|
||||||
Set_Mmx2,
|
|
||||||
Set_Sse,
|
|
||||||
Set_Sections,
|
|
||||||
Set_ReOrdering,
|
|
||||||
Set_GPRConstants,
|
|
||||||
Set_Flags,
|
|
||||||
Set_AlignVector,
|
|
||||||
|
|
||||||
// Game settings
|
|
||||||
Set_JumpTableSize,
|
|
||||||
Set_Mfc0Count,
|
|
||||||
Set_SemaphoreExit
|
|
||||||
};
|
|
||||||
|
|
||||||
short Set_AudioHle = 0, Set_GraphicsHle = 0;
|
|
||||||
|
|
||||||
// DLL info
|
// DLL info
|
||||||
const char * AppName(void)
|
const char * AppName(void)
|
||||||
{
|
{
|
||||||
|
@ -446,8 +409,8 @@ void ProcessMenuItem(int ID)
|
||||||
IndvidualBlock = true;
|
IndvidualBlock = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case ID_SHOWCOMPILERERRORS:
|
case ID_SHOWCOMPILERERRORS:
|
||||||
{
|
{
|
||||||
uState = GetMenuState(hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND);
|
uState = GetMenuState(hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND);
|
||||||
|
@ -815,36 +778,7 @@ EXPORT void PluginLoaded(void)
|
||||||
Compiler.bGPRConstants = true;
|
Compiler.bGPRConstants = true;
|
||||||
DetectCpuSpecs();
|
DetectCpuSpecs();
|
||||||
|
|
||||||
SetModuleName("RSP");
|
InitializeRspSetting();
|
||||||
Set_GraphicsHle = FindSystemSettingId("HLE GFX");
|
|
||||||
Set_AudioHle = FindSystemSettingId("HLE Audio");
|
|
||||||
|
|
||||||
RegisterSetting(Set_BreakOnStart, Data_DWORD_General, "Break on Start", NULL, BreakOnStart, NULL);
|
|
||||||
RegisterSetting(Set_CPUCore, Data_DWORD_General, "CPU Method", NULL, g_CPUCore, NULL);
|
|
||||||
RegisterSetting(Set_LogRDP, Data_DWORD_General, "Log RDP", NULL, LogRDP, NULL);
|
|
||||||
RegisterSetting(Set_LogX86Code, Data_DWORD_General, "Log X86 Code", NULL, LogX86Code, NULL);
|
|
||||||
RegisterSetting(Set_Profiling, Data_DWORD_General, "Profiling", NULL, Profiling, NULL);
|
|
||||||
RegisterSetting(Set_IndvidualBlock, Data_DWORD_General, "Individual Block", NULL, IndvidualBlock, NULL);
|
|
||||||
RegisterSetting(Set_ShowErrors, Data_DWORD_General, "Show Errors", NULL, ShowErrors, NULL);
|
|
||||||
|
|
||||||
// Compiler settings
|
|
||||||
RegisterSetting(Set_CheckDest, Data_DWORD_General, "Check Destination Vector", NULL, Compiler.bDest, NULL);
|
|
||||||
RegisterSetting(Set_Accum, Data_DWORD_General, "Check Destination Accumulator", NULL, Compiler.bAccum, NULL);
|
|
||||||
RegisterSetting(Set_Mmx, Data_DWORD_General, "Use MMX", NULL, Compiler.mmx, NULL);
|
|
||||||
RegisterSetting(Set_Mmx2, Data_DWORD_General, "Use MMX2", NULL, Compiler.mmx2, NULL);
|
|
||||||
RegisterSetting(Set_Sse, Data_DWORD_General, "Use SSE", NULL, Compiler.sse, NULL);
|
|
||||||
RegisterSetting(Set_Sections, Data_DWORD_General, "Use precompiled sections", NULL, Compiler.bSections, NULL);
|
|
||||||
RegisterSetting(Set_ReOrdering, Data_DWORD_General, "Reorder opcodes", NULL, Compiler.bReOrdering, NULL);
|
|
||||||
RegisterSetting(Set_GPRConstants, Data_DWORD_General, "Detect GPR Constants", NULL, Compiler.bGPRConstants, NULL);
|
|
||||||
RegisterSetting(Set_Flags, Data_DWORD_General, "Check Flag Usage", NULL, Compiler.bFlags, NULL);
|
|
||||||
RegisterSetting(Set_AlignVector, Data_DWORD_General, "Assume Vector loads align", NULL, Compiler.bAlignVector, NULL);
|
|
||||||
|
|
||||||
RegisterSetting(Set_JumpTableSize, Data_DWORD_Game, "JumpTableSize", NULL, 0x800, NULL);
|
|
||||||
RegisterSetting(Set_Mfc0Count, Data_DWORD_Game, "Mfc0Count", NULL, 0x0, NULL);
|
|
||||||
RegisterSetting(Set_SemaphoreExit, Data_DWORD_Game, "SemaphoreExit", NULL, 0x0, NULL);
|
|
||||||
|
|
||||||
AudioHle = Set_AudioHle != 0 ? GetSystemSetting(Set_AudioHle) != 0 : false;
|
|
||||||
GraphicsHle = Set_GraphicsHle != 0 ? GetSystemSetting(Set_GraphicsHle) != 0 : true;
|
|
||||||
SetCPU(g_CPUCore);
|
SetCPU(g_CPUCore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,38 +46,16 @@
|
||||||
<ClCompile Include="breakpoint.cpp" />
|
<ClCompile Include="breakpoint.cpp" />
|
||||||
<ClCompile Include="Debugger\RSPDebuggerUI.cpp" />
|
<ClCompile Include="Debugger\RSPDebuggerUI.cpp" />
|
||||||
<ClCompile Include="Debugger\RSPRegistersUI.cpp" />
|
<ClCompile Include="Debugger\RSPRegistersUI.cpp" />
|
||||||
<ClCompile Include="dma.cpp" />
|
|
||||||
<ClCompile Include="log.cpp" />
|
|
||||||
<ClCompile Include="Main.cpp" />
|
<ClCompile Include="Main.cpp" />
|
||||||
<ClCompile Include="memory.cpp" />
|
|
||||||
<ClCompile Include="Mmx.cpp" />
|
|
||||||
<ClCompile Include="Profiling.cpp" />
|
|
||||||
<ClCompile Include="Recompiler Analysis.cpp" />
|
|
||||||
<ClCompile Include="Recompiler CPU.cpp" />
|
|
||||||
<ClCompile Include="Recompiler Ops.cpp" />
|
|
||||||
<ClCompile Include="Recompiler Sections.cpp" />
|
|
||||||
<ClCompile Include="RSP Command.cpp" />
|
<ClCompile Include="RSP Command.cpp" />
|
||||||
<ClCompile Include="Sse.cpp" />
|
|
||||||
<ClCompile Include="X86.cpp" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="breakpoint.h" />
|
<ClInclude Include="breakpoint.h" />
|
||||||
<ClInclude Include="Debugger\RSPDebuggerUI.h" />
|
<ClInclude Include="Debugger\RSPDebuggerUI.h" />
|
||||||
<ClInclude Include="Debugger\RSPRegistersUI.h" />
|
<ClInclude Include="Debugger\RSPRegistersUI.h" />
|
||||||
<ClInclude Include="dma.h" />
|
|
||||||
<ClInclude Include="Interpreter CPU.h" />
|
|
||||||
<ClInclude Include="Interpreter Ops.h" />
|
|
||||||
<ClInclude Include="log.h" />
|
|
||||||
<ClInclude Include="memory.h" />
|
|
||||||
<ClInclude Include="Profiling.h" />
|
|
||||||
<ClInclude Include="Recompiler CPU.h" />
|
|
||||||
<ClInclude Include="Recompiler Ops.h" />
|
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
<ClInclude Include="RSP Command.h" />
|
<ClInclude Include="RSP Command.h" />
|
||||||
<ClInclude Include="RSP Registers.h" />
|
|
||||||
<ClInclude Include="Rsp.h" />
|
<ClInclude Include="Rsp.h" />
|
||||||
<ClInclude Include="RspTypes.h" />
|
|
||||||
<ClInclude Include="X86.h" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Common\Common.vcxproj">
|
<ProjectReference Include="..\Common\Common.vcxproj">
|
||||||
|
|
|
@ -21,51 +21,18 @@
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="RspTypes.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="breakpoint.h">
|
<ClInclude Include="breakpoint.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="dma.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Interpreter CPU.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Interpreter Ops.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="log.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="memory.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Profiling.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Recompiler CPU.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Recompiler Ops.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="resource.h">
|
<ClInclude Include="resource.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="RSP Command.h">
|
<ClInclude Include="RSP Command.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="RSP Registers.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Rsp.h">
|
<ClInclude Include="Rsp.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="X86.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="Debugger\RSPRegistersUI.h">
|
<ClInclude Include="Debugger\RSPRegistersUI.h">
|
||||||
<Filter>Header Files\Debugger</Filter>
|
<Filter>Header Files\Debugger</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -82,50 +49,17 @@
|
||||||
<ClCompile Include="breakpoint.cpp">
|
<ClCompile Include="breakpoint.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="dma.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="log.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Main.cpp">
|
<ClCompile Include="Main.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="memory.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Mmx.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Profiling.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Recompiler Analysis.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Recompiler CPU.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Recompiler Ops.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Recompiler Sections.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="RSP Command.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Sse.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="X86.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Debugger\RSPRegistersUI.cpp">
|
<ClCompile Include="Debugger\RSPRegistersUI.cpp">
|
||||||
<Filter>Source Files\Debugger</Filter>
|
<Filter>Source Files\Debugger</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="Debugger\RSPDebuggerUI.cpp">
|
<ClCompile Include="Debugger\RSPDebuggerUI.cpp">
|
||||||
<Filter>Source Files\Debugger</Filter>
|
<Filter>Source Files\Debugger</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="RSP Command.cpp">
|
||||||
|
<Filter>Source Files\Debugger</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -11,6 +11,7 @@
|
||||||
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
#include <Project64-rsp-core/cpu/RSPInstruction.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
#include <Project64-rsp-core/cpu/RSPOpcode.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspMemory.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
|
||||||
#define RSP_MaxCommandLines 30
|
#define RSP_MaxCommandLines 30
|
||||||
|
@ -910,7 +911,7 @@ void SetRSPCommandToStepping(void)
|
||||||
Stepping_Commands = true;
|
Stepping_Commands = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetRSPCommandViewto(UINT NewLocation)
|
void SetRSPCommandViewto(uint32_t NewLocation)
|
||||||
{
|
{
|
||||||
unsigned int location;
|
unsigned int location;
|
||||||
char Value[20];
|
char Value[20];
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
void DumpRSPCode(void);
|
void DumpRSPCode(void);
|
||||||
void DumpRSPData(void);
|
void DumpRSPData(void);
|
||||||
void Disable_RSP_Commands_Window(void);
|
void Disable_RSP_Commands_Window(void);
|
||||||
|
@ -6,7 +9,7 @@ void Enter_RSP_Commands_Window(void);
|
||||||
void RefreshRSPCommands(void);
|
void RefreshRSPCommands(void);
|
||||||
void SetRSPCommandToRunning(void);
|
void SetRSPCommandToRunning(void);
|
||||||
void SetRSPCommandToStepping(void);
|
void SetRSPCommandToStepping(void);
|
||||||
void SetRSPCommandViewto(unsigned int NewLocation);
|
void SetRSPCommandViewto(uint32_t NewLocation);
|
||||||
|
|
||||||
extern bool Stepping_Commands, WaitingForStep;
|
extern bool Stepping_Commands, WaitingForStep;
|
||||||
extern bool InRSPCommandsWindow;
|
extern bool InRSPCommandsWindow;
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Project64-plugin-spec/Rsp.h>
|
#include <Project64-plugin-spec/Rsp.h>
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
|
||||||
|
|
||||||
// Profiling
|
|
||||||
#define Default_ProfilingOn false
|
|
||||||
#define Default_IndvidualBlock false
|
|
||||||
#define Default_ShowErrors false
|
|
||||||
#define Default_AudioHle false
|
|
||||||
|
|
||||||
uint32_t AsciiToHex(char * HexValue);
|
uint32_t AsciiToHex(char * HexValue);
|
||||||
void DisplayError(char * Message, ...);
|
void DisplayError(char * Message, ...);
|
||||||
|
|
||||||
extern bool DebuggingEnabled, Profiling, IndvidualBlock, ShowErrors, BreakOnStart, LogRDP, LogX86Code;
|
|
||||||
extern DEBUG_INFO DebugInfo;
|
extern DEBUG_INFO DebugInfo;
|
||||||
extern void * hinstDLL;
|
extern void * hinstDLL;
|
Loading…
Reference in New Issue