RSP: Get the code to conform to clang-format
This commit is contained in:
parent
90fefed579
commit
98b96a60cb
|
@ -1,18 +1,18 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <float.h>
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
#include "RSP registers.h"
|
|
||||||
#include "RSP Command.h"
|
|
||||||
#include "Recompiler CPU.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "OpCode.h"
|
#include "OpCode.h"
|
||||||
#include "log.h"
|
|
||||||
#include "Profiling.h"
|
#include "Profiling.h"
|
||||||
#include "breakpoint.h"
|
#include "RSP Command.h"
|
||||||
#include "x86.h"
|
#include "RSP registers.h"
|
||||||
|
#include "Recompiler CPU.h"
|
||||||
|
#include "Rsp.h"
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
#include "breakpoint.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include <float.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
UDWORD EleSpec[32], Indx[32];
|
UDWORD EleSpec[32], Indx[32];
|
||||||
OPCODE RSPOpC;
|
OPCODE RSPOpC;
|
||||||
|
@ -49,7 +49,7 @@ void SetCPU(DWORD core)
|
||||||
ReleaseMutex(hMutex);
|
ReleaseMutex(hMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Build_RSP ( void )
|
void Build_RSP(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
extern UWORD32 Recp, RecpResult, SQroot, SQrootResult;
|
extern UWORD32 Recp, RecpResult, SQroot, SQrootResult;
|
||||||
|
@ -62,16 +62,16 @@ void Build_RSP ( void )
|
||||||
SetCPU(CPUCore);
|
SetCPU(CPUCore);
|
||||||
ResetTimerList();
|
ResetTimerList();
|
||||||
|
|
||||||
EleSpec[ 0].DW = 0;
|
EleSpec[0].DW = 0;
|
||||||
EleSpec[ 1].DW = 0;
|
EleSpec[1].DW = 0;
|
||||||
EleSpec[ 2].DW = 0;
|
EleSpec[2].DW = 0;
|
||||||
EleSpec[ 3].DW = 0;
|
EleSpec[3].DW = 0;
|
||||||
EleSpec[ 4].DW = 0;
|
EleSpec[4].DW = 0;
|
||||||
EleSpec[ 5].DW = 0;
|
EleSpec[5].DW = 0;
|
||||||
EleSpec[ 6].DW = 0;
|
EleSpec[6].DW = 0;
|
||||||
EleSpec[ 7].DW = 0;
|
EleSpec[7].DW = 0;
|
||||||
EleSpec[ 8].DW = 0;
|
EleSpec[8].DW = 0;
|
||||||
EleSpec[ 9].DW = 0;
|
EleSpec[9].DW = 0;
|
||||||
EleSpec[10].DW = 0;
|
EleSpec[10].DW = 0;
|
||||||
EleSpec[11].DW = 0;
|
EleSpec[11].DW = 0;
|
||||||
EleSpec[12].DW = 0;
|
EleSpec[12].DW = 0;
|
||||||
|
@ -95,16 +95,16 @@ void Build_RSP ( void )
|
||||||
EleSpec[30].DW = 0x0606060606060606; // 6
|
EleSpec[30].DW = 0x0606060606060606; // 6
|
||||||
EleSpec[31].DW = 0x0707070707070707; // 7
|
EleSpec[31].DW = 0x0707070707070707; // 7
|
||||||
|
|
||||||
Indx[ 0].DW = 0;
|
Indx[0].DW = 0;
|
||||||
Indx[ 1].DW = 0;
|
Indx[1].DW = 0;
|
||||||
Indx[ 2].DW = 0;
|
Indx[2].DW = 0;
|
||||||
Indx[ 3].DW = 0;
|
Indx[3].DW = 0;
|
||||||
Indx[ 4].DW = 0;
|
Indx[4].DW = 0;
|
||||||
Indx[ 5].DW = 0;
|
Indx[5].DW = 0;
|
||||||
Indx[ 6].DW = 0;
|
Indx[6].DW = 0;
|
||||||
Indx[ 7].DW = 0;
|
Indx[7].DW = 0;
|
||||||
Indx[ 8].DW = 0;
|
Indx[8].DW = 0;
|
||||||
Indx[ 9].DW = 0;
|
Indx[9].DW = 0;
|
||||||
Indx[10].DW = 0;
|
Indx[10].DW = 0;
|
||||||
Indx[11].DW = 0;
|
Indx[11].DW = 0;
|
||||||
Indx[12].DW = 0;
|
Indx[12].DW = 0;
|
||||||
|
@ -129,16 +129,16 @@ void Build_RSP ( void )
|
||||||
Indx[30].DW = 0x0001020304050706; // 6
|
Indx[30].DW = 0x0001020304050706; // 6
|
||||||
Indx[31].DW = 0x0001020304050607; // 7
|
Indx[31].DW = 0x0001020304050607; // 7
|
||||||
|
|
||||||
for (i = 16; i < 32; i ++)
|
for (i = 16; i < 32; i++)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
for (count = 0; count < 8; count ++)
|
for (count = 0; count < 8; count++)
|
||||||
{
|
{
|
||||||
Indx[i].B[count] = 7 - Indx[i].B[count];
|
Indx[i].B[count] = 7 - Indx[i].B[count];
|
||||||
EleSpec[i].B[count] = 7 - EleSpec[i].B[count];
|
EleSpec[i].B[count] = 7 - EleSpec[i].B[count];
|
||||||
}
|
}
|
||||||
for (count = 0; count < 4; count ++)
|
for (count = 0; count < 4; count++)
|
||||||
{
|
{
|
||||||
BYTE Temp;
|
BYTE Temp;
|
||||||
|
|
||||||
|
@ -163,16 +163,16 @@ be greater than the number of cycles that the RSP should have performed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DWORD RunInterpreterCPU(DWORD Cycles);
|
DWORD RunInterpreterCPU(DWORD Cycles);
|
||||||
DWORD RunRecompilerCPU (DWORD Cycles);
|
DWORD RunRecompilerCPU(DWORD Cycles);
|
||||||
|
|
||||||
#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
|
#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
|
||||||
|
|
||||||
uint32_t DoRspCycles (uint32_t Cycles )
|
uint32_t DoRspCycles(uint32_t Cycles)
|
||||||
{
|
{
|
||||||
extern Boolean AudioHle, GraphicsHle;
|
extern Boolean AudioHle, GraphicsHle;
|
||||||
DWORD TaskType = *(DWORD*)(RSPInfo.DMEM + 0xFC0);
|
DWORD TaskType = *(DWORD *)(RSPInfo.DMEM + 0xFC0);
|
||||||
|
|
||||||
/* if (*RSPInfo.SP_STATUS_REG & SP_STATUS_SIG0)
|
/* if (*RSPInfo.SP_STATUS_REG & SP_STATUS_SIG0)
|
||||||
{
|
{
|
||||||
*RSPInfo.SP_STATUS_REG &= ~SP_STATUS_SIG0;
|
*RSPInfo.SP_STATUS_REG &= ~SP_STATUS_SIG0;
|
||||||
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
||||||
|
@ -180,14 +180,14 @@ uint32_t DoRspCycles (uint32_t Cycles )
|
||||||
return Cycles;
|
return Cycles;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (TaskType == 1 && GraphicsHle && *(DWORD*)(RSPInfo.DMEM + 0x0ff0) != 0)
|
if (TaskType == 1 && GraphicsHle && *(DWORD *)(RSPInfo.DMEM + 0x0ff0) != 0)
|
||||||
{
|
{
|
||||||
if (RSPInfo.ProcessDList != NULL)
|
if (RSPInfo.ProcessDList != NULL)
|
||||||
{
|
{
|
||||||
RSPInfo.ProcessDList();
|
RSPInfo.ProcessDList();
|
||||||
}
|
}
|
||||||
*RSPInfo.SP_STATUS_REG |= (0x0203 );
|
*RSPInfo.SP_STATUS_REG |= (0x0203);
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0 )
|
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
||||||
{
|
{
|
||||||
*RSPInfo.MI_INTR_REG |= R4300i_SP_Intr;
|
*RSPInfo.MI_INTR_REG |= R4300i_SP_Intr;
|
||||||
RSPInfo.CheckInterrupts();
|
RSPInfo.CheckInterrupts();
|
||||||
|
@ -202,8 +202,8 @@ uint32_t DoRspCycles (uint32_t Cycles )
|
||||||
{
|
{
|
||||||
RSPInfo.ProcessAList();
|
RSPInfo.ProcessAList();
|
||||||
}
|
}
|
||||||
*RSPInfo.SP_STATUS_REG |= (0x0203 );
|
*RSPInfo.SP_STATUS_REG |= (0x0203);
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0 )
|
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
||||||
{
|
{
|
||||||
*RSPInfo.MI_INTR_REG |= R4300i_SP_Intr;
|
*RSPInfo.MI_INTR_REG |= R4300i_SP_Intr;
|
||||||
RSPInfo.CheckInterrupts();
|
RSPInfo.CheckInterrupts();
|
||||||
|
@ -217,7 +217,7 @@ uint32_t DoRspCycles (uint32_t Cycles )
|
||||||
|
|
||||||
Compiler.bAudioUcode = (TaskType == 2) ? TRUE : FALSE;
|
Compiler.bAudioUcode = (TaskType == 2) ? TRUE : FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*RSPInfo.SP_STATUS_REG |= (0x0203 );
|
*RSPInfo.SP_STATUS_REG |= (0x0203 );
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0 )
|
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "OpCode.h"
|
#include "OpCode.h"
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
extern UDWORD EleSpec[32], Indx[32];
|
extern UDWORD EleSpec[32], Indx[32];
|
||||||
|
|
||||||
|
@ -10,10 +11,10 @@ extern p_func RSP_Cop2[32];
|
||||||
extern p_func RSP_Vector[64];
|
extern p_func RSP_Vector[64];
|
||||||
extern p_func RSP_Lc2[32];
|
extern p_func RSP_Lc2[32];
|
||||||
extern p_func RSP_Sc2[32];
|
extern p_func RSP_Sc2[32];
|
||||||
extern uint32_t * PrgCount, RSP_Running;
|
extern uint32_t *PrgCount, RSP_Running;
|
||||||
extern OPCODE RSPOpC;
|
extern OPCODE RSPOpC;
|
||||||
|
|
||||||
void SetCPU(DWORD core);
|
void SetCPU(DWORD core);
|
||||||
void Build_RSP (void);
|
void Build_RSP(void);
|
||||||
|
|
||||||
extern DWORD Mfc0Count, SemaphoreExit;
|
extern DWORD Mfc0Count, SemaphoreExit;
|
||||||
|
|
|
@ -1,30 +1,31 @@
|
||||||
#include <windows.h>
|
#include "Interpreter CPU.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include <float.h>
|
|
||||||
#include "breakpoint.h"
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
#include "Interpreter Ops.h"
|
#include "Interpreter Ops.h"
|
||||||
#include "Interpreter CPU.h"
|
|
||||||
#include "RSP registers.h"
|
|
||||||
#include "RSP Command.h"
|
#include "RSP Command.h"
|
||||||
|
#include "RSP registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
|
#include "breakpoint.h"
|
||||||
|
#include "log.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "opcode.h"
|
#include "opcode.h"
|
||||||
#include "log.h"
|
#include <float.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
DWORD RSP_NextInstruction, RSP_JumpTo;
|
DWORD RSP_NextInstruction, RSP_JumpTo;
|
||||||
|
|
||||||
void BuildInterpreterCPU(void) {
|
void BuildInterpreterCPU(void)
|
||||||
RSP_Opcode[ 0] = RSP_Opcode_SPECIAL;
|
{
|
||||||
RSP_Opcode[ 1] = RSP_Opcode_REGIMM;
|
RSP_Opcode[0] = RSP_Opcode_SPECIAL;
|
||||||
RSP_Opcode[ 2] = RSP_Opcode_J;
|
RSP_Opcode[1] = RSP_Opcode_REGIMM;
|
||||||
RSP_Opcode[ 3] = RSP_Opcode_JAL;
|
RSP_Opcode[2] = RSP_Opcode_J;
|
||||||
RSP_Opcode[ 4] = RSP_Opcode_BEQ;
|
RSP_Opcode[3] = RSP_Opcode_JAL;
|
||||||
RSP_Opcode[ 5] = RSP_Opcode_BNE;
|
RSP_Opcode[4] = RSP_Opcode_BEQ;
|
||||||
RSP_Opcode[ 6] = RSP_Opcode_BLEZ;
|
RSP_Opcode[5] = RSP_Opcode_BNE;
|
||||||
RSP_Opcode[ 7] = RSP_Opcode_BGTZ;
|
RSP_Opcode[6] = RSP_Opcode_BLEZ;
|
||||||
RSP_Opcode[ 8] = RSP_Opcode_ADDI;
|
RSP_Opcode[7] = RSP_Opcode_BGTZ;
|
||||||
RSP_Opcode[ 9] = RSP_Opcode_ADDIU;
|
RSP_Opcode[8] = RSP_Opcode_ADDI;
|
||||||
|
RSP_Opcode[9] = RSP_Opcode_ADDIU;
|
||||||
RSP_Opcode[10] = RSP_Opcode_SLTI;
|
RSP_Opcode[10] = RSP_Opcode_SLTI;
|
||||||
RSP_Opcode[11] = RSP_Opcode_SLTIU;
|
RSP_Opcode[11] = RSP_Opcode_SLTIU;
|
||||||
RSP_Opcode[12] = RSP_Opcode_ANDI;
|
RSP_Opcode[12] = RSP_Opcode_ANDI;
|
||||||
|
@ -80,16 +81,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Opcode[62] = rsp_UnknownOpcode;
|
RSP_Opcode[62] = rsp_UnknownOpcode;
|
||||||
RSP_Opcode[63] = rsp_UnknownOpcode;
|
RSP_Opcode[63] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Special[ 0] = RSP_Special_SLL;
|
RSP_Special[0] = RSP_Special_SLL;
|
||||||
RSP_Special[ 1] = rsp_UnknownOpcode;
|
RSP_Special[1] = rsp_UnknownOpcode;
|
||||||
RSP_Special[ 2] = RSP_Special_SRL;
|
RSP_Special[2] = RSP_Special_SRL;
|
||||||
RSP_Special[ 3] = RSP_Special_SRA;
|
RSP_Special[3] = RSP_Special_SRA;
|
||||||
RSP_Special[ 4] = RSP_Special_SLLV;
|
RSP_Special[4] = RSP_Special_SLLV;
|
||||||
RSP_Special[ 5] = rsp_UnknownOpcode;
|
RSP_Special[5] = rsp_UnknownOpcode;
|
||||||
RSP_Special[ 6] = RSP_Special_SRLV;
|
RSP_Special[6] = RSP_Special_SRLV;
|
||||||
RSP_Special[ 7] = RSP_Special_SRAV;
|
RSP_Special[7] = RSP_Special_SRAV;
|
||||||
RSP_Special[ 8] = RSP_Special_JR;
|
RSP_Special[8] = RSP_Special_JR;
|
||||||
RSP_Special[ 9] = RSP_Special_JALR;
|
RSP_Special[9] = RSP_Special_JALR;
|
||||||
RSP_Special[10] = rsp_UnknownOpcode;
|
RSP_Special[10] = rsp_UnknownOpcode;
|
||||||
RSP_Special[11] = rsp_UnknownOpcode;
|
RSP_Special[11] = rsp_UnknownOpcode;
|
||||||
RSP_Special[12] = rsp_UnknownOpcode;
|
RSP_Special[12] = rsp_UnknownOpcode;
|
||||||
|
@ -145,16 +146,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Special[62] = rsp_UnknownOpcode;
|
RSP_Special[62] = rsp_UnknownOpcode;
|
||||||
RSP_Special[63] = rsp_UnknownOpcode;
|
RSP_Special[63] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_RegImm[ 0] = RSP_Opcode_BLTZ;
|
RSP_RegImm[0] = RSP_Opcode_BLTZ;
|
||||||
RSP_RegImm[ 1] = RSP_Opcode_BGEZ;
|
RSP_RegImm[1] = RSP_Opcode_BGEZ;
|
||||||
RSP_RegImm[ 2] = rsp_UnknownOpcode;
|
RSP_RegImm[2] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 3] = rsp_UnknownOpcode;
|
RSP_RegImm[3] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 4] = rsp_UnknownOpcode;
|
RSP_RegImm[4] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 5] = rsp_UnknownOpcode;
|
RSP_RegImm[5] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 6] = rsp_UnknownOpcode;
|
RSP_RegImm[6] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 7] = rsp_UnknownOpcode;
|
RSP_RegImm[7] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 8] = rsp_UnknownOpcode;
|
RSP_RegImm[8] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[ 9] = rsp_UnknownOpcode;
|
RSP_RegImm[9] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[10] = rsp_UnknownOpcode;
|
RSP_RegImm[10] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[11] = rsp_UnknownOpcode;
|
RSP_RegImm[11] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[12] = rsp_UnknownOpcode;
|
RSP_RegImm[12] = rsp_UnknownOpcode;
|
||||||
|
@ -178,16 +179,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_RegImm[30] = rsp_UnknownOpcode;
|
RSP_RegImm[30] = rsp_UnknownOpcode;
|
||||||
RSP_RegImm[31] = rsp_UnknownOpcode;
|
RSP_RegImm[31] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Cop0[ 0] = RSP_Cop0_MF;
|
RSP_Cop0[0] = RSP_Cop0_MF;
|
||||||
RSP_Cop0[ 1] = rsp_UnknownOpcode;
|
RSP_Cop0[1] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 2] = rsp_UnknownOpcode;
|
RSP_Cop0[2] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 3] = rsp_UnknownOpcode;
|
RSP_Cop0[3] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 4] = RSP_Cop0_MT;
|
RSP_Cop0[4] = RSP_Cop0_MT;
|
||||||
RSP_Cop0[ 5] = rsp_UnknownOpcode;
|
RSP_Cop0[5] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 6] = rsp_UnknownOpcode;
|
RSP_Cop0[6] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 7] = rsp_UnknownOpcode;
|
RSP_Cop0[7] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 8] = rsp_UnknownOpcode;
|
RSP_Cop0[8] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[ 9] = rsp_UnknownOpcode;
|
RSP_Cop0[9] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[10] = rsp_UnknownOpcode;
|
RSP_Cop0[10] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[11] = rsp_UnknownOpcode;
|
RSP_Cop0[11] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[12] = rsp_UnknownOpcode;
|
RSP_Cop0[12] = rsp_UnknownOpcode;
|
||||||
|
@ -211,16 +212,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Cop0[30] = rsp_UnknownOpcode;
|
RSP_Cop0[30] = rsp_UnknownOpcode;
|
||||||
RSP_Cop0[31] = rsp_UnknownOpcode;
|
RSP_Cop0[31] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Cop2[ 0] = RSP_Cop2_MF;
|
RSP_Cop2[0] = RSP_Cop2_MF;
|
||||||
RSP_Cop2[ 1] = rsp_UnknownOpcode;
|
RSP_Cop2[1] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[ 2] = RSP_Cop2_CF;
|
RSP_Cop2[2] = RSP_Cop2_CF;
|
||||||
RSP_Cop2[ 3] = rsp_UnknownOpcode;
|
RSP_Cop2[3] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[ 4] = RSP_Cop2_MT;
|
RSP_Cop2[4] = RSP_Cop2_MT;
|
||||||
RSP_Cop2[ 5] = rsp_UnknownOpcode;
|
RSP_Cop2[5] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[ 6] = RSP_Cop2_CT;
|
RSP_Cop2[6] = RSP_Cop2_CT;
|
||||||
RSP_Cop2[ 7] = rsp_UnknownOpcode;
|
RSP_Cop2[7] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[ 8] = rsp_UnknownOpcode;
|
RSP_Cop2[8] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[ 9] = rsp_UnknownOpcode;
|
RSP_Cop2[9] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[10] = rsp_UnknownOpcode;
|
RSP_Cop2[10] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[11] = rsp_UnknownOpcode;
|
RSP_Cop2[11] = rsp_UnknownOpcode;
|
||||||
RSP_Cop2[12] = rsp_UnknownOpcode;
|
RSP_Cop2[12] = rsp_UnknownOpcode;
|
||||||
|
@ -244,16 +245,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Cop2[30] = RSP_COP2_VECTOR;
|
RSP_Cop2[30] = RSP_COP2_VECTOR;
|
||||||
RSP_Cop2[31] = RSP_COP2_VECTOR;
|
RSP_Cop2[31] = RSP_COP2_VECTOR;
|
||||||
|
|
||||||
RSP_Vector[ 0] = RSP_Vector_VMULF;
|
RSP_Vector[0] = RSP_Vector_VMULF;
|
||||||
RSP_Vector[ 1] = RSP_Vector_VMULU;
|
RSP_Vector[1] = RSP_Vector_VMULU;
|
||||||
RSP_Vector[ 2] = rsp_UnknownOpcode;
|
RSP_Vector[2] = rsp_UnknownOpcode;
|
||||||
RSP_Vector[ 3] = rsp_UnknownOpcode;
|
RSP_Vector[3] = rsp_UnknownOpcode;
|
||||||
RSP_Vector[ 4] = RSP_Vector_VMUDL;
|
RSP_Vector[4] = RSP_Vector_VMUDL;
|
||||||
RSP_Vector[ 5] = RSP_Vector_VMUDM;
|
RSP_Vector[5] = RSP_Vector_VMUDM;
|
||||||
RSP_Vector[ 6] = RSP_Vector_VMUDN;
|
RSP_Vector[6] = RSP_Vector_VMUDN;
|
||||||
RSP_Vector[ 7] = RSP_Vector_VMUDH;
|
RSP_Vector[7] = RSP_Vector_VMUDH;
|
||||||
RSP_Vector[ 8] = RSP_Vector_VMACF;
|
RSP_Vector[8] = RSP_Vector_VMACF;
|
||||||
RSP_Vector[ 9] = RSP_Vector_VMACU;
|
RSP_Vector[9] = RSP_Vector_VMACU;
|
||||||
RSP_Vector[10] = rsp_UnknownOpcode;
|
RSP_Vector[10] = rsp_UnknownOpcode;
|
||||||
RSP_Vector[11] = RSP_Vector_VMACQ;
|
RSP_Vector[11] = RSP_Vector_VMACQ;
|
||||||
RSP_Vector[12] = RSP_Vector_VMADL;
|
RSP_Vector[12] = RSP_Vector_VMADL;
|
||||||
|
@ -309,16 +310,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Vector[62] = rsp_UnknownOpcode;
|
RSP_Vector[62] = rsp_UnknownOpcode;
|
||||||
RSP_Vector[63] = rsp_UnknownOpcode;
|
RSP_Vector[63] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Lc2[ 0] = RSP_Opcode_LBV;
|
RSP_Lc2[0] = RSP_Opcode_LBV;
|
||||||
RSP_Lc2[ 1] = RSP_Opcode_LSV;
|
RSP_Lc2[1] = RSP_Opcode_LSV;
|
||||||
RSP_Lc2[ 2] = RSP_Opcode_LLV;
|
RSP_Lc2[2] = RSP_Opcode_LLV;
|
||||||
RSP_Lc2[ 3] = RSP_Opcode_LDV;
|
RSP_Lc2[3] = RSP_Opcode_LDV;
|
||||||
RSP_Lc2[ 4] = RSP_Opcode_LQV;
|
RSP_Lc2[4] = RSP_Opcode_LQV;
|
||||||
RSP_Lc2[ 5] = RSP_Opcode_LRV;
|
RSP_Lc2[5] = RSP_Opcode_LRV;
|
||||||
RSP_Lc2[ 6] = RSP_Opcode_LPV;
|
RSP_Lc2[6] = RSP_Opcode_LPV;
|
||||||
RSP_Lc2[ 7] = RSP_Opcode_LUV;
|
RSP_Lc2[7] = RSP_Opcode_LUV;
|
||||||
RSP_Lc2[ 8] = RSP_Opcode_LHV;
|
RSP_Lc2[8] = RSP_Opcode_LHV;
|
||||||
RSP_Lc2[ 9] = RSP_Opcode_LFV;
|
RSP_Lc2[9] = RSP_Opcode_LFV;
|
||||||
RSP_Lc2[10] = rsp_UnknownOpcode;
|
RSP_Lc2[10] = rsp_UnknownOpcode;
|
||||||
RSP_Lc2[11] = RSP_Opcode_LTV;
|
RSP_Lc2[11] = RSP_Opcode_LTV;
|
||||||
RSP_Lc2[12] = rsp_UnknownOpcode;
|
RSP_Lc2[12] = rsp_UnknownOpcode;
|
||||||
|
@ -342,16 +343,16 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Lc2[30] = rsp_UnknownOpcode;
|
RSP_Lc2[30] = rsp_UnknownOpcode;
|
||||||
RSP_Lc2[31] = rsp_UnknownOpcode;
|
RSP_Lc2[31] = rsp_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Sc2[ 0] = RSP_Opcode_SBV;
|
RSP_Sc2[0] = RSP_Opcode_SBV;
|
||||||
RSP_Sc2[ 1] = RSP_Opcode_SSV;
|
RSP_Sc2[1] = RSP_Opcode_SSV;
|
||||||
RSP_Sc2[ 2] = RSP_Opcode_SLV;
|
RSP_Sc2[2] = RSP_Opcode_SLV;
|
||||||
RSP_Sc2[ 3] = RSP_Opcode_SDV;
|
RSP_Sc2[3] = RSP_Opcode_SDV;
|
||||||
RSP_Sc2[ 4] = RSP_Opcode_SQV;
|
RSP_Sc2[4] = RSP_Opcode_SQV;
|
||||||
RSP_Sc2[ 5] = RSP_Opcode_SRV;
|
RSP_Sc2[5] = RSP_Opcode_SRV;
|
||||||
RSP_Sc2[ 6] = RSP_Opcode_SPV;
|
RSP_Sc2[6] = RSP_Opcode_SPV;
|
||||||
RSP_Sc2[ 7] = RSP_Opcode_SUV;
|
RSP_Sc2[7] = RSP_Opcode_SUV;
|
||||||
RSP_Sc2[ 8] = RSP_Opcode_SHV;
|
RSP_Sc2[8] = RSP_Opcode_SHV;
|
||||||
RSP_Sc2[ 9] = RSP_Opcode_SFV;
|
RSP_Sc2[9] = RSP_Opcode_SFV;
|
||||||
RSP_Sc2[10] = RSP_Opcode_SWV;
|
RSP_Sc2[10] = RSP_Opcode_SWV;
|
||||||
RSP_Sc2[11] = RSP_Opcode_STV;
|
RSP_Sc2[11] = RSP_Opcode_STV;
|
||||||
RSP_Sc2[12] = rsp_UnknownOpcode;
|
RSP_Sc2[12] = rsp_UnknownOpcode;
|
||||||
|
@ -376,38 +377,51 @@ void BuildInterpreterCPU(void) {
|
||||||
RSP_Sc2[31] = rsp_UnknownOpcode;
|
RSP_Sc2[31] = rsp_UnknownOpcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD RunInterpreterCPU(DWORD Cycles) {
|
DWORD RunInterpreterCPU(DWORD Cycles)
|
||||||
|
{
|
||||||
DWORD CycleCount;
|
DWORD CycleCount;
|
||||||
RSP_Running = TRUE;
|
RSP_Running = TRUE;
|
||||||
Enable_RSP_Commands_Window();
|
Enable_RSP_Commands_Window();
|
||||||
CycleCount = 0;
|
CycleCount = 0;
|
||||||
|
|
||||||
while (RSP_Running) {
|
while (RSP_Running)
|
||||||
if (NoOfBpoints != 0) {
|
{
|
||||||
if (CheckForRSPBPoint(*PrgCount)) {
|
if (NoOfBpoints != 0)
|
||||||
if (InRSPCommandsWindow) {
|
{
|
||||||
|
if (CheckForRSPBPoint(*PrgCount))
|
||||||
|
{
|
||||||
|
if (InRSPCommandsWindow)
|
||||||
|
{
|
||||||
Enter_RSP_Commands_Window();
|
Enter_RSP_Commands_Window();
|
||||||
if (Stepping_Commands) {
|
if (Stepping_Commands)
|
||||||
DisplayError ( "Encountered an R4300i breakpoint" );
|
{
|
||||||
} else {
|
DisplayError("Encountered an R4300i breakpoint");
|
||||||
DisplayError ( "Encountered an R4300i breakpoint\n\nNow stepping" );
|
}
|
||||||
SetRSPCommandViewto( *PrgCount );
|
else
|
||||||
|
{
|
||||||
|
DisplayError("Encountered an R4300i breakpoint\n\nNow stepping");
|
||||||
|
SetRSPCommandViewto(*PrgCount);
|
||||||
SetRSPCommandToStepping();
|
SetRSPCommandToStepping();
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
DisplayError ( "Encountered an RSP breakpoint\n\nEntering command window" );
|
else
|
||||||
|
{
|
||||||
|
DisplayError("Encountered an RSP breakpoint\n\nEntering command window");
|
||||||
Enter_RSP_Commands_Window();
|
Enter_RSP_Commands_Window();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Stepping_Commands) {
|
if (Stepping_Commands)
|
||||||
|
{
|
||||||
WaitingForStep = TRUE;
|
WaitingForStep = TRUE;
|
||||||
SetRSPCommandViewto( *PrgCount );
|
SetRSPCommandViewto(*PrgCount);
|
||||||
UpdateRSPRegistersScreen();
|
UpdateRSPRegistersScreen();
|
||||||
while ( WaitingForStep == TRUE ){
|
while (WaitingForStep == TRUE)
|
||||||
|
{
|
||||||
Sleep(20);
|
Sleep(20);
|
||||||
if (!Stepping_Commands) {
|
if (!Stepping_Commands)
|
||||||
|
{
|
||||||
WaitingForStep = FALSE;
|
WaitingForStep = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,10 +430,11 @@ DWORD RunInterpreterCPU(DWORD Cycles) {
|
||||||
RDP_LogLoc(*PrgCount);
|
RDP_LogLoc(*PrgCount);
|
||||||
|
|
||||||
RSP_LW_IMEM(*PrgCount, &RSPOpC.Hex);
|
RSP_LW_IMEM(*PrgCount, &RSPOpC.Hex);
|
||||||
RSP_Opcode[ RSPOpC.op ]();
|
RSP_Opcode[RSPOpC.op]();
|
||||||
RSP_GPR[0].W = 0x00000000; // MIPS $zero hard-wired to 0
|
RSP_GPR[0].W = 0x00000000; // MIPS $zero hard-wired to 0
|
||||||
|
|
||||||
switch (RSP_NextInstruction) {
|
switch (RSP_NextInstruction)
|
||||||
|
{
|
||||||
case NORMAL:
|
case NORMAL:
|
||||||
*PrgCount = (*PrgCount + 4) & 0xFFC;
|
*PrgCount = (*PrgCount + 4) & 0xFFC;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#define NORMAL 0
|
#define NORMAL 0
|
||||||
#define DO_DELAY_SLOT 1
|
#define DO_DELAY_SLOT 1
|
||||||
#define DELAY_SLOT 2
|
#define DELAY_SLOT 2
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,149 +1,149 @@
|
||||||
// Opcode functions
|
// Opcode functions
|
||||||
|
|
||||||
void RSP_Opcode_SPECIAL ( void );
|
void RSP_Opcode_SPECIAL(void);
|
||||||
void RSP_Opcode_REGIMM ( void );
|
void RSP_Opcode_REGIMM(void);
|
||||||
void RSP_Opcode_J ( void );
|
void RSP_Opcode_J(void);
|
||||||
void RSP_Opcode_JAL ( void );
|
void RSP_Opcode_JAL(void);
|
||||||
void RSP_Opcode_BEQ ( void );
|
void RSP_Opcode_BEQ(void);
|
||||||
void RSP_Opcode_BNE ( void );
|
void RSP_Opcode_BNE(void);
|
||||||
void RSP_Opcode_BLEZ ( void );
|
void RSP_Opcode_BLEZ(void);
|
||||||
void RSP_Opcode_BGTZ ( void );
|
void RSP_Opcode_BGTZ(void);
|
||||||
void RSP_Opcode_ADDI ( void );
|
void RSP_Opcode_ADDI(void);
|
||||||
void RSP_Opcode_ADDIU ( void );
|
void RSP_Opcode_ADDIU(void);
|
||||||
void RSP_Opcode_SLTI ( void );
|
void RSP_Opcode_SLTI(void);
|
||||||
void RSP_Opcode_SLTIU ( void );
|
void RSP_Opcode_SLTIU(void);
|
||||||
void RSP_Opcode_ANDI ( void );
|
void RSP_Opcode_ANDI(void);
|
||||||
void RSP_Opcode_ORI ( void );
|
void RSP_Opcode_ORI(void);
|
||||||
void RSP_Opcode_XORI ( void );
|
void RSP_Opcode_XORI(void);
|
||||||
void RSP_Opcode_LUI ( void );
|
void RSP_Opcode_LUI(void);
|
||||||
void RSP_Opcode_COP0 ( void );
|
void RSP_Opcode_COP0(void);
|
||||||
void RSP_Opcode_COP2 ( void );
|
void RSP_Opcode_COP2(void);
|
||||||
void RSP_Opcode_LB ( void );
|
void RSP_Opcode_LB(void);
|
||||||
void RSP_Opcode_LH ( void );
|
void RSP_Opcode_LH(void);
|
||||||
void RSP_Opcode_LW ( void );
|
void RSP_Opcode_LW(void);
|
||||||
void RSP_Opcode_LBU ( void );
|
void RSP_Opcode_LBU(void);
|
||||||
void RSP_Opcode_LHU ( void );
|
void RSP_Opcode_LHU(void);
|
||||||
void RSP_Opcode_SB ( void );
|
void RSP_Opcode_SB(void);
|
||||||
void RSP_Opcode_SH ( void );
|
void RSP_Opcode_SH(void);
|
||||||
void RSP_Opcode_SW ( void );
|
void RSP_Opcode_SW(void);
|
||||||
void RSP_Opcode_LC2 ( void );
|
void RSP_Opcode_LC2(void);
|
||||||
void RSP_Opcode_SC2 ( void );
|
void RSP_Opcode_SC2(void);
|
||||||
|
|
||||||
// R4300i Opcodes: Special
|
// R4300i Opcodes: Special
|
||||||
|
|
||||||
void RSP_Special_SLL ( void );
|
void RSP_Special_SLL(void);
|
||||||
void RSP_Special_SRL ( void );
|
void RSP_Special_SRL(void);
|
||||||
void RSP_Special_SRA ( void );
|
void RSP_Special_SRA(void);
|
||||||
void RSP_Special_SLLV ( void );
|
void RSP_Special_SLLV(void);
|
||||||
void RSP_Special_SRLV ( void );
|
void RSP_Special_SRLV(void);
|
||||||
void RSP_Special_SRAV ( void );
|
void RSP_Special_SRAV(void);
|
||||||
void RSP_Special_JR ( void );
|
void RSP_Special_JR(void);
|
||||||
void RSP_Special_JALR ( void );
|
void RSP_Special_JALR(void);
|
||||||
void RSP_Special_BREAK ( void );
|
void RSP_Special_BREAK(void);
|
||||||
void RSP_Special_ADD ( void );
|
void RSP_Special_ADD(void);
|
||||||
void RSP_Special_ADDU ( void );
|
void RSP_Special_ADDU(void);
|
||||||
void RSP_Special_SUB ( void );
|
void RSP_Special_SUB(void);
|
||||||
void RSP_Special_SUBU ( void );
|
void RSP_Special_SUBU(void);
|
||||||
void RSP_Special_AND ( void );
|
void RSP_Special_AND(void);
|
||||||
void RSP_Special_OR ( void );
|
void RSP_Special_OR(void);
|
||||||
void RSP_Special_XOR ( void );
|
void RSP_Special_XOR(void);
|
||||||
void RSP_Special_NOR ( void );
|
void RSP_Special_NOR(void);
|
||||||
void RSP_Special_SLT ( void );
|
void RSP_Special_SLT(void);
|
||||||
void RSP_Special_SLTU ( void );
|
void RSP_Special_SLTU(void);
|
||||||
|
|
||||||
// R4300i Opcodes: RegImm
|
// R4300i Opcodes: RegImm
|
||||||
|
|
||||||
void RSP_Opcode_BLTZ ( void );
|
void RSP_Opcode_BLTZ(void);
|
||||||
void RSP_Opcode_BGEZ ( void );
|
void RSP_Opcode_BGEZ(void);
|
||||||
void RSP_Opcode_BLTZAL ( void );
|
void RSP_Opcode_BLTZAL(void);
|
||||||
void RSP_Opcode_BGEZAL ( void );
|
void RSP_Opcode_BGEZAL(void);
|
||||||
|
|
||||||
// COP0 functions
|
// COP0 functions
|
||||||
|
|
||||||
void RSP_Cop0_MF ( void );
|
void RSP_Cop0_MF(void);
|
||||||
void RSP_Cop0_MT ( void );
|
void RSP_Cop0_MT(void);
|
||||||
|
|
||||||
// COP2 functions
|
// COP2 functions
|
||||||
|
|
||||||
void RSP_Cop2_MF ( void );
|
void RSP_Cop2_MF(void);
|
||||||
void RSP_Cop2_CF ( void );
|
void RSP_Cop2_CF(void);
|
||||||
void RSP_Cop2_MT ( void );
|
void RSP_Cop2_MT(void);
|
||||||
void RSP_Cop2_CT ( void );
|
void RSP_Cop2_CT(void);
|
||||||
void RSP_COP2_VECTOR ( void );
|
void RSP_COP2_VECTOR(void);
|
||||||
|
|
||||||
// Vector functions
|
// Vector functions
|
||||||
|
|
||||||
void RSP_Vector_VMULF ( void );
|
void RSP_Vector_VMULF(void);
|
||||||
void RSP_Vector_VMULU ( void );
|
void RSP_Vector_VMULU(void);
|
||||||
void RSP_Vector_VMUDL ( void );
|
void RSP_Vector_VMUDL(void);
|
||||||
void RSP_Vector_VMUDM ( void );
|
void RSP_Vector_VMUDM(void);
|
||||||
void RSP_Vector_VMUDN ( void );
|
void RSP_Vector_VMUDN(void);
|
||||||
void RSP_Vector_VMUDH ( void );
|
void RSP_Vector_VMUDH(void);
|
||||||
void RSP_Vector_VMACF ( void );
|
void RSP_Vector_VMACF(void);
|
||||||
void RSP_Vector_VMACU ( void );
|
void RSP_Vector_VMACU(void);
|
||||||
void RSP_Vector_VMACQ ( void );
|
void RSP_Vector_VMACQ(void);
|
||||||
void RSP_Vector_VMADL ( void );
|
void RSP_Vector_VMADL(void);
|
||||||
void RSP_Vector_VMADM ( void );
|
void RSP_Vector_VMADM(void);
|
||||||
void RSP_Vector_VMADN ( void );
|
void RSP_Vector_VMADN(void);
|
||||||
void RSP_Vector_VMADH ( void );
|
void RSP_Vector_VMADH(void);
|
||||||
void RSP_Vector_VADD ( void );
|
void RSP_Vector_VADD(void);
|
||||||
void RSP_Vector_VSUB ( void );
|
void RSP_Vector_VSUB(void);
|
||||||
void RSP_Vector_VABS ( void );
|
void RSP_Vector_VABS(void);
|
||||||
void RSP_Vector_VADDC ( void );
|
void RSP_Vector_VADDC(void);
|
||||||
void RSP_Vector_VSUBC ( void );
|
void RSP_Vector_VSUBC(void);
|
||||||
void RSP_Vector_VSAW ( void );
|
void RSP_Vector_VSAW(void);
|
||||||
void RSP_Vector_VLT ( void );
|
void RSP_Vector_VLT(void);
|
||||||
void RSP_Vector_VEQ ( void );
|
void RSP_Vector_VEQ(void);
|
||||||
void RSP_Vector_VNE ( void );
|
void RSP_Vector_VNE(void);
|
||||||
void RSP_Vector_VGE ( void );
|
void RSP_Vector_VGE(void);
|
||||||
void RSP_Vector_VCL ( void );
|
void RSP_Vector_VCL(void);
|
||||||
void RSP_Vector_VCH ( void );
|
void RSP_Vector_VCH(void);
|
||||||
void RSP_Vector_VCR ( void );
|
void RSP_Vector_VCR(void);
|
||||||
void RSP_Vector_VMRG ( void );
|
void RSP_Vector_VMRG(void);
|
||||||
void RSP_Vector_VAND ( void );
|
void RSP_Vector_VAND(void);
|
||||||
void RSP_Vector_VNAND ( void );
|
void RSP_Vector_VNAND(void);
|
||||||
void RSP_Vector_VOR ( void );
|
void RSP_Vector_VOR(void);
|
||||||
void RSP_Vector_VNOR ( void );
|
void RSP_Vector_VNOR(void);
|
||||||
void RSP_Vector_VXOR ( void );
|
void RSP_Vector_VXOR(void);
|
||||||
void RSP_Vector_VNXOR ( void );
|
void RSP_Vector_VNXOR(void);
|
||||||
void RSP_Vector_VRCP ( void );
|
void RSP_Vector_VRCP(void);
|
||||||
void RSP_Vector_VRCPL ( void );
|
void RSP_Vector_VRCPL(void);
|
||||||
void RSP_Vector_VRCPH ( void );
|
void RSP_Vector_VRCPH(void);
|
||||||
void RSP_Vector_VMOV ( void );
|
void RSP_Vector_VMOV(void);
|
||||||
void RSP_Vector_VRSQ ( void );
|
void RSP_Vector_VRSQ(void);
|
||||||
void RSP_Vector_VRSQL ( void );
|
void RSP_Vector_VRSQL(void);
|
||||||
void RSP_Vector_VRSQH ( void );
|
void RSP_Vector_VRSQH(void);
|
||||||
void RSP_Vector_VNOOP ( void );
|
void RSP_Vector_VNOOP(void);
|
||||||
|
|
||||||
// LC2 functions
|
// LC2 functions
|
||||||
|
|
||||||
void RSP_Opcode_LBV ( void );
|
void RSP_Opcode_LBV(void);
|
||||||
void RSP_Opcode_LSV ( void );
|
void RSP_Opcode_LSV(void);
|
||||||
void RSP_Opcode_LLV ( void );
|
void RSP_Opcode_LLV(void);
|
||||||
void RSP_Opcode_LDV ( void );
|
void RSP_Opcode_LDV(void);
|
||||||
void RSP_Opcode_LQV ( void );
|
void RSP_Opcode_LQV(void);
|
||||||
void RSP_Opcode_LRV ( void );
|
void RSP_Opcode_LRV(void);
|
||||||
void RSP_Opcode_LPV ( void );
|
void RSP_Opcode_LPV(void);
|
||||||
void RSP_Opcode_LUV ( void );
|
void RSP_Opcode_LUV(void);
|
||||||
void RSP_Opcode_LHV ( void );
|
void RSP_Opcode_LHV(void);
|
||||||
void RSP_Opcode_LFV ( void );
|
void RSP_Opcode_LFV(void);
|
||||||
void RSP_Opcode_LTV ( void );
|
void RSP_Opcode_LTV(void);
|
||||||
|
|
||||||
// LC2 functions
|
// LC2 functions
|
||||||
|
|
||||||
void RSP_Opcode_SBV ( void );
|
void RSP_Opcode_SBV(void);
|
||||||
void RSP_Opcode_SSV ( void );
|
void RSP_Opcode_SSV(void);
|
||||||
void RSP_Opcode_SLV ( void );
|
void RSP_Opcode_SLV(void);
|
||||||
void RSP_Opcode_SDV ( void );
|
void RSP_Opcode_SDV(void);
|
||||||
void RSP_Opcode_SQV ( void );
|
void RSP_Opcode_SQV(void);
|
||||||
void RSP_Opcode_SRV ( void );
|
void RSP_Opcode_SRV(void);
|
||||||
void RSP_Opcode_SPV ( void );
|
void RSP_Opcode_SPV(void);
|
||||||
void RSP_Opcode_SUV ( void );
|
void RSP_Opcode_SUV(void);
|
||||||
void RSP_Opcode_SHV ( void );
|
void RSP_Opcode_SHV(void);
|
||||||
void RSP_Opcode_SFV ( void );
|
void RSP_Opcode_SFV(void);
|
||||||
void RSP_Opcode_STV ( void );
|
void RSP_Opcode_STV(void);
|
||||||
void RSP_Opcode_SWV ( void );
|
void RSP_Opcode_SWV(void);
|
||||||
|
|
||||||
// Other functions
|
// Other functions
|
||||||
|
|
||||||
void rsp_UnknownOpcode ( void );
|
void rsp_UnknownOpcode(void);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <windowsx.h>
|
|
||||||
#include <commctrl.h>
|
#include <commctrl.h>
|
||||||
|
#include <windowsx.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1910
|
#if defined(_MSC_VER) && _MSC_VER >= 1910
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
|
@ -10,22 +10,22 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../Settings/Settings.h"
|
||||||
#include <Common/StdString.h>
|
#include <Common/StdString.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "../Settings/Settings.h"
|
|
||||||
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
#include "Recompiler CPU.h"
|
#include "Profiling.h"
|
||||||
#include "RSP Command.h"
|
#include "RSP Command.h"
|
||||||
#include "RSP Registers.h"
|
#include "RSP Registers.h"
|
||||||
#include "memory.h"
|
#include "Recompiler CPU.h"
|
||||||
#include "breakpoint.h"
|
#include "Rsp.h"
|
||||||
#include "Profiling.h"
|
|
||||||
#include "log.h"
|
|
||||||
#include "resource.h"
|
|
||||||
#include "Version.h"
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
#include "Version.h"
|
||||||
|
#include "breakpoint.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
void ClearAllx86Code(void);
|
void ClearAllx86Code(void);
|
||||||
void ProcessMenuItem(int ID);
|
void ProcessMenuItem(int ID);
|
||||||
|
@ -52,27 +52,43 @@ void * hinstDLL;
|
||||||
|
|
||||||
extern uint8_t * pLastSecondary;
|
extern uint8_t * pLastSecondary;
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
Set_BreakOnStart, Set_CPUCore, Set_LogRDP, Set_LogX86Code, Set_Profiling, Set_IndvidualBlock,
|
{
|
||||||
|
Set_BreakOnStart,
|
||||||
|
Set_CPUCore,
|
||||||
|
Set_LogRDP,
|
||||||
|
Set_LogX86Code,
|
||||||
|
Set_Profiling,
|
||||||
|
Set_IndvidualBlock,
|
||||||
Set_ShowErrors,
|
Set_ShowErrors,
|
||||||
|
|
||||||
// Compiler settings
|
// Compiler settings
|
||||||
Set_CheckDest, Set_Accum, Set_Mmx, Set_Mmx2, Set_Sse, Set_Sections,
|
Set_CheckDest,
|
||||||
Set_ReOrdering, Set_GPRConstants, Set_Flags, Set_AlignVector,
|
Set_Accum,
|
||||||
|
Set_Mmx,
|
||||||
|
Set_Mmx2,
|
||||||
|
Set_Sse,
|
||||||
|
Set_Sections,
|
||||||
|
Set_ReOrdering,
|
||||||
|
Set_GPRConstants,
|
||||||
|
Set_Flags,
|
||||||
|
Set_AlignVector,
|
||||||
|
|
||||||
// Game settings
|
// Game settings
|
||||||
Set_JumpTableSize, Set_Mfc0Count, Set_SemaphoreExit
|
Set_JumpTableSize,
|
||||||
|
Set_Mfc0Count,
|
||||||
|
Set_SemaphoreExit
|
||||||
};
|
};
|
||||||
|
|
||||||
short Set_AudioHle = 0, Set_GraphicsHle = 0;
|
short Set_AudioHle = 0, Set_GraphicsHle = 0;
|
||||||
|
|
||||||
// DLL info
|
// DLL info
|
||||||
const char * AppName ( void )
|
const char * AppName(void)
|
||||||
{
|
{
|
||||||
static stdstr_f Name("RSP %s", VER_FILE_VERSION_STR);
|
static stdstr_f Name("RSP %s", VER_FILE_VERSION_STR);
|
||||||
return Name.c_str();
|
return Name.c_str();
|
||||||
}
|
}
|
||||||
const char * AboutMsg ( void )
|
const char * AboutMsg(void)
|
||||||
{
|
{
|
||||||
static stdstr_f Msg("RSP emulation plugin\nMade for Project64 (c)\nVersion %s\n\nby Jabo and Zilmar", VER_FILE_VERSION_STR);
|
static stdstr_f Msg("RSP emulation plugin\nMade for Project64 (c)\nVersion %s\n\nby Jabo and Zilmar", VER_FILE_VERSION_STR);
|
||||||
return Msg.c_str();
|
return Msg.c_str();
|
||||||
|
@ -86,12 +102,15 @@ uint32_t AsciiToHex(char * HexValue)
|
||||||
uint32_t Value = 0;
|
uint32_t Value = 0;
|
||||||
|
|
||||||
Finish = strlen(HexValue);
|
Finish = strlen(HexValue);
|
||||||
if (Finish > 8 ) { Finish = 8; }
|
if (Finish > 8)
|
||||||
|
{
|
||||||
|
Finish = 8;
|
||||||
|
}
|
||||||
|
|
||||||
for (Count = 0; Count < Finish; Count++)
|
for (Count = 0; Count < Finish; Count++)
|
||||||
{
|
{
|
||||||
Value = (Value << 4);
|
Value = (Value << 4);
|
||||||
switch( HexValue[Count] )
|
switch (HexValue[Count])
|
||||||
{
|
{
|
||||||
case '0': break;
|
case '0': break;
|
||||||
case '1': Value += 1; break;
|
case '1': Value += 1; break;
|
||||||
|
@ -123,14 +142,14 @@ uint32_t AsciiToHex(char * HexValue)
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayError(char* Message, ...)
|
void DisplayError(char * Message, ...)
|
||||||
{
|
{
|
||||||
char Msg[400];
|
char Msg[400];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start( ap, Message );
|
va_start(ap, Message);
|
||||||
vsprintf( Msg, Message, ap );
|
vsprintf(Msg, Message, ap);
|
||||||
va_end( ap );
|
va_end(ap);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
MessageBoxA(NULL, Msg, "Error", MB_OK | MB_ICONERROR);
|
MessageBoxA(NULL, Msg, "Error", MB_OK | MB_ICONERROR);
|
||||||
#else
|
#else
|
||||||
|
@ -177,8 +196,8 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD /*fdwReason*/, LPVOID /*lpvReserved*/
|
||||||
|
|
||||||
void FixMenuState(void)
|
void FixMenuState(void)
|
||||||
{
|
{
|
||||||
EnableMenuItem(hRSPMenu, ID_RSPCOMMANDS,MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_RSPCOMMANDS, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_RSPREGISTERS,MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_RSPREGISTERS, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_PROFILING_RESETSTATS, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_PROFILING_RESETSTATS, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_PROFILING_GENERATELOG, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_PROFILING_GENERATELOG, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_DUMP_RSPCODE, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_DUMP_RSPCODE, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
|
@ -233,7 +252,7 @@ EXPORT void GetRspDebugInfo(RSPDEBUG_INFO * _DebugInfo)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (hRSPMenu == NULL)
|
if (hRSPMenu == NULL)
|
||||||
{
|
{
|
||||||
hRSPMenu = LoadMenu((HINSTANCE)hinstDLL,MAKEINTRESOURCE(RspMenu));
|
hRSPMenu = LoadMenu((HINSTANCE)hinstDLL, MAKEINTRESOURCE(RspMenu));
|
||||||
FixMenuState();
|
FixMenuState();
|
||||||
}
|
}
|
||||||
_DebugInfo->hRSPMenu = hRSPMenu;
|
_DebugInfo->hRSPMenu = hRSPMenu;
|
||||||
|
@ -241,7 +260,7 @@ EXPORT void GetRspDebugInfo(RSPDEBUG_INFO * _DebugInfo)
|
||||||
_DebugInfo->ProcessMenuItem = ProcessMenuItem;
|
_DebugInfo->ProcessMenuItem = ProcessMenuItem;
|
||||||
|
|
||||||
_DebugInfo->UseBPoints = TRUE;
|
_DebugInfo->UseBPoints = TRUE;
|
||||||
sprintf(_DebugInfo->BPPanelName," RSP ");
|
sprintf(_DebugInfo->BPPanelName, " RSP ");
|
||||||
_DebugInfo->Add_BPoint = Add_BPoint;
|
_DebugInfo->Add_BPoint = Add_BPoint;
|
||||||
_DebugInfo->CreateBPPanel = CreateBPPanel;
|
_DebugInfo->CreateBPPanel = CreateBPPanel;
|
||||||
_DebugInfo->HideBPPanel = HideBPPanel;
|
_DebugInfo->HideBPPanel = HideBPPanel;
|
||||||
|
@ -273,7 +292,8 @@ void DetectCpuSpecs(void)
|
||||||
DWORD AMD_Features = 0;
|
DWORD AMD_Features = 0;
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
__try {
|
__try
|
||||||
|
{
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
_asm {
|
_asm {
|
||||||
// Intel features
|
// Intel features
|
||||||
|
@ -294,12 +314,13 @@ void DetectCpuSpecs(void)
|
||||||
AMD_Features = cpuInfo[3];
|
AMD_Features = cpuInfo[3];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
__except (EXCEPTION_EXECUTE_HANDLER) {
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
AMD_Features = Intel_Features = 0;
|
AMD_Features = Intel_Features = 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: With GCC, there is <cpuid.h>, but __cpuid() there is a macro and
|
TODO: With GCC, there is <cpuid.h>, but __cpuid() there is a macro and
|
||||||
needs five arguments, not two. Also, GCC lacks SEH.
|
needs five arguments, not two. Also, GCC lacks SEH.
|
||||||
*/
|
*/
|
||||||
|
@ -340,9 +361,9 @@ EXPORT void InitiateRSP(RSP_INFO Rsp_Info, uint32_t * CycleCount)
|
||||||
AllocateMemory();
|
AllocateMemory();
|
||||||
InitilizeRSPRegisters();
|
InitilizeRSPRegisters();
|
||||||
Build_RSP();
|
Build_RSP();
|
||||||
#ifdef GenerateLog
|
#ifdef GenerateLog
|
||||||
Start_Log();
|
Start_Log();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -379,17 +400,23 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_ON, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_ON, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_OFF, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_OFF, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_Profiling,FALSE);
|
SetSetting(Set_Profiling, FALSE);
|
||||||
if (DebuggingEnabled) { Profiling = FALSE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
Profiling = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_ON, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_ON, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_OFF, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_OFF, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_Profiling,TRUE);
|
SetSetting(Set_Profiling, TRUE);
|
||||||
if (DebuggingEnabled) { Profiling = TRUE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
Profiling = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -401,15 +428,21 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_LOGINDIVIDUALBLOCKS, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_LOGINDIVIDUALBLOCKS, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_IndvidualBlock,FALSE);
|
SetSetting(Set_IndvidualBlock, FALSE);
|
||||||
if (DebuggingEnabled) { IndvidualBlock = FALSE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
IndvidualBlock = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_PROFILING_LOGINDIVIDUALBLOCKS, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_PROFILING_LOGINDIVIDUALBLOCKS, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_IndvidualBlock,TRUE);
|
SetSetting(Set_IndvidualBlock, TRUE);
|
||||||
if (DebuggingEnabled) { IndvidualBlock = TRUE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
IndvidualBlock = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -419,15 +452,21 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_ShowErrors,FALSE);
|
SetSetting(Set_ShowErrors, FALSE);
|
||||||
if (DebuggingEnabled) { ShowErrors = FALSE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
ShowErrors = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_SHOWCOMPILERERRORS, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_ShowErrors,TRUE);
|
SetSetting(Set_ShowErrors, TRUE);
|
||||||
if (DebuggingEnabled) { ShowErrors = TRUE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
ShowErrors = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -440,15 +479,21 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_BreakOnStart,FALSE);
|
SetSetting(Set_BreakOnStart, FALSE);
|
||||||
if (DebuggingEnabled) { BreakOnStart = FALSE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
BreakOnStart = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_BreakOnStart,TRUE);
|
SetSetting(Set_BreakOnStart, TRUE);
|
||||||
if (DebuggingEnabled) { BreakOnStart = TRUE; }
|
if (DebuggingEnabled)
|
||||||
|
{
|
||||||
|
BreakOnStart = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -458,8 +503,8 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_LogRDP,FALSE);
|
SetSetting(Set_LogRDP, FALSE);
|
||||||
if (DebuggingEnabled)
|
if (DebuggingEnabled)
|
||||||
{
|
{
|
||||||
LogRDP = FALSE;
|
LogRDP = FALSE;
|
||||||
|
@ -468,8 +513,8 @@ void ProcessMenuItem(int ID)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_LogRDP,TRUE);
|
SetSetting(Set_LogRDP, TRUE);
|
||||||
if (DebuggingEnabled)
|
if (DebuggingEnabled)
|
||||||
{
|
{
|
||||||
LogRDP = TRUE;
|
LogRDP = TRUE;
|
||||||
|
@ -484,8 +529,8 @@ void ProcessMenuItem(int ID)
|
||||||
|
|
||||||
if (uState & MFS_CHECKED)
|
if (uState & MFS_CHECKED)
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_SETTINGS_LOGX86CODE, MF_BYCOMMAND | MFS_UNCHECKED );
|
CheckMenuItem(hRSPMenu, ID_SETTINGS_LOGX86CODE, MF_BYCOMMAND | MFS_UNCHECKED);
|
||||||
SetSetting(Set_LogX86Code,FALSE);
|
SetSetting(Set_LogX86Code, FALSE);
|
||||||
if (DebuggingEnabled)
|
if (DebuggingEnabled)
|
||||||
{
|
{
|
||||||
LogX86Code = FALSE;
|
LogX86Code = FALSE;
|
||||||
|
@ -494,8 +539,8 @@ void ProcessMenuItem(int ID)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CheckMenuItem( hRSPMenu, ID_SETTINGS_LOGX86CODE, MF_BYCOMMAND | MFS_CHECKED );
|
CheckMenuItem(hRSPMenu, ID_SETTINGS_LOGX86CODE, MF_BYCOMMAND | MFS_CHECKED);
|
||||||
SetSetting(Set_LogX86Code,TRUE);
|
SetSetting(Set_LogX86Code, TRUE);
|
||||||
if (DebuggingEnabled)
|
if (DebuggingEnabled)
|
||||||
{
|
{
|
||||||
LogX86Code = TRUE;
|
LogX86Code = TRUE;
|
||||||
|
@ -506,7 +551,7 @@ void ProcessMenuItem(int ID)
|
||||||
break;
|
break;
|
||||||
case ID_CPUMETHOD_RECOMPILER:
|
case ID_CPUMETHOD_RECOMPILER:
|
||||||
{
|
{
|
||||||
SetSetting(Set_CPUCore,RecompilerCPU);
|
SetSetting(Set_CPUCore, RecompilerCPU);
|
||||||
CPUCore = RecompilerCPU;
|
CPUCore = RecompilerCPU;
|
||||||
FixMenuState();
|
FixMenuState();
|
||||||
SetCPU(RecompilerCPU);
|
SetCPU(RecompilerCPU);
|
||||||
|
@ -514,7 +559,7 @@ void ProcessMenuItem(int ID)
|
||||||
break;
|
break;
|
||||||
case ID_CPUMETHOD_INTERPT:
|
case ID_CPUMETHOD_INTERPT:
|
||||||
{
|
{
|
||||||
SetSetting(Set_CPUCore,InterpreterCPU);
|
SetSetting(Set_CPUCore, InterpreterCPU);
|
||||||
CPUCore = InterpreterCPU;
|
CPUCore = InterpreterCPU;
|
||||||
FixMenuState();
|
FixMenuState();
|
||||||
SetCPU(InterpreterCPU);
|
SetCPU(InterpreterCPU);
|
||||||
|
@ -606,7 +651,7 @@ BOOL CALLBACK CompilerDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM /*lPar
|
||||||
break;
|
break;
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
sprintf(Buffer, "x86: %2.2f KB / %2.2f KB", (float)(RecompPos - RecompCode) / 1024.0F,
|
sprintf(Buffer, "x86: %2.2f KB / %2.2f KB", (float)(RecompPos - RecompCode) / 1024.0F,
|
||||||
pLastSecondary?(float)((pLastSecondary - RecompCodeSecondary) / 1024.0F):0);
|
pLastSecondary ? (float)((pLastSecondary - RecompCodeSecondary) / 1024.0F) : 0);
|
||||||
|
|
||||||
SetDlgItemTextA(hDlg, IDC_COMPILER_BUFFERS, Buffer);
|
SetDlgItemTextA(hDlg, IDC_COMPILER_BUFFERS, Buffer);
|
||||||
break;
|
break;
|
||||||
|
@ -624,16 +669,16 @@ BOOL CALLBACK CompilerDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM /*lPar
|
||||||
Compiler.bGPRConstants = GetBooleanCheck(hDlg, IDC_COMPILER_GPRCONSTANTS);
|
Compiler.bGPRConstants = GetBooleanCheck(hDlg, IDC_COMPILER_GPRCONSTANTS);
|
||||||
Compiler.bFlags = GetBooleanCheck(hDlg, IDC_COMPILER_FLAGS);
|
Compiler.bFlags = GetBooleanCheck(hDlg, IDC_COMPILER_FLAGS);
|
||||||
Compiler.bAlignVector = GetBooleanCheck(hDlg, IDC_COMPILER_ALIGNVEC);
|
Compiler.bAlignVector = GetBooleanCheck(hDlg, IDC_COMPILER_ALIGNVEC);
|
||||||
SetSetting(Set_CheckDest,Compiler.bDest);
|
SetSetting(Set_CheckDest, Compiler.bDest);
|
||||||
SetSetting(Set_Accum,Compiler.bAccum);
|
SetSetting(Set_Accum, Compiler.bAccum);
|
||||||
SetSetting(Set_Mmx,Compiler.mmx);
|
SetSetting(Set_Mmx, Compiler.mmx);
|
||||||
SetSetting(Set_Mmx2,Compiler.mmx2);
|
SetSetting(Set_Mmx2, Compiler.mmx2);
|
||||||
SetSetting(Set_Sse,Compiler.sse);
|
SetSetting(Set_Sse, Compiler.sse);
|
||||||
SetSetting(Set_Sections,Compiler.bSections);
|
SetSetting(Set_Sections, Compiler.bSections);
|
||||||
SetSetting(Set_ReOrdering,Compiler.bReOrdering);
|
SetSetting(Set_ReOrdering, Compiler.bReOrdering);
|
||||||
SetSetting(Set_GPRConstants,Compiler.bGPRConstants);
|
SetSetting(Set_GPRConstants, Compiler.bGPRConstants);
|
||||||
SetSetting(Set_Flags,Compiler.bFlags);
|
SetSetting(Set_Flags, Compiler.bFlags);
|
||||||
SetSetting(Set_AlignVector,Compiler.bAlignVector);
|
SetSetting(Set_AlignVector, Compiler.bAlignVector);
|
||||||
|
|
||||||
KillTimer(hDlg, 1);
|
KillTimer(hDlg, 1);
|
||||||
EndDialog(hDlg, TRUE);
|
EndDialog(hDlg, TRUE);
|
||||||
|
@ -768,32 +813,31 @@ EXPORT void PluginLoaded(void)
|
||||||
Compiler.bGPRConstants = TRUE;
|
Compiler.bGPRConstants = TRUE;
|
||||||
DetectCpuSpecs();
|
DetectCpuSpecs();
|
||||||
|
|
||||||
|
|
||||||
SetModuleName("RSP");
|
SetModuleName("RSP");
|
||||||
Set_GraphicsHle = FindSystemSettingId("HLE GFX");
|
Set_GraphicsHle = FindSystemSettingId("HLE GFX");
|
||||||
Set_AudioHle = FindSystemSettingId("HLE Audio");
|
Set_AudioHle = FindSystemSettingId("HLE Audio");
|
||||||
|
|
||||||
RegisterSetting(Set_BreakOnStart, Data_DWORD_General,"Break on Start", NULL,BreakOnStart,NULL);
|
RegisterSetting(Set_BreakOnStart, Data_DWORD_General, "Break on Start", NULL, BreakOnStart, NULL);
|
||||||
RegisterSetting(Set_CPUCore, Data_DWORD_General,"CPU Method", NULL,CPUCore,NULL);
|
RegisterSetting(Set_CPUCore, Data_DWORD_General, "CPU Method", NULL, CPUCore, NULL);
|
||||||
RegisterSetting(Set_LogRDP, Data_DWORD_General,"Log RDP", NULL,LogRDP,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_LogX86Code, Data_DWORD_General, "Log X86 Code", NULL, LogX86Code, NULL);
|
||||||
RegisterSetting(Set_Profiling, Data_DWORD_General,"Profiling", NULL,Profiling,NULL);
|
RegisterSetting(Set_Profiling, Data_DWORD_General, "Profiling", NULL, Profiling, NULL);
|
||||||
RegisterSetting(Set_IndvidualBlock, Data_DWORD_General,"Individual Block",NULL,IndvidualBlock,NULL);
|
RegisterSetting(Set_IndvidualBlock, Data_DWORD_General, "Individual Block", NULL, IndvidualBlock, NULL);
|
||||||
RegisterSetting(Set_ShowErrors, Data_DWORD_General,"Show Errors", NULL,ShowErrors,NULL);
|
RegisterSetting(Set_ShowErrors, Data_DWORD_General, "Show Errors", NULL, ShowErrors, NULL);
|
||||||
|
|
||||||
// Compiler settings
|
// Compiler settings
|
||||||
RegisterSetting(Set_CheckDest, Data_DWORD_General,"Check Destination Vector", NULL,Compiler.bDest,NULL);
|
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_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_Mmx, Data_DWORD_General, "Use MMX", NULL, Compiler.mmx, NULL);
|
||||||
RegisterSetting(Set_Mmx2, Data_DWORD_General,"Use MMX2", NULL,Compiler.mmx2,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_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_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_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_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_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_AlignVector, Data_DWORD_General, "Assume Vector loads align", NULL, Compiler.bAlignVector, NULL);
|
||||||
|
|
||||||
RegisterSetting(Set_JumpTableSize, Data_DWORD_Game,"JumpTableSize",NULL,0x800,NULL);
|
RegisterSetting(Set_JumpTableSize, Data_DWORD_Game, "JumpTableSize", NULL, 0x800, NULL);
|
||||||
RegisterSetting(Set_Mfc0Count, Data_DWORD_Game, "Mfc0Count", NULL, 0x0, NULL);
|
RegisterSetting(Set_Mfc0Count, Data_DWORD_Game, "Mfc0Count", NULL, 0x0, NULL);
|
||||||
RegisterSetting(Set_SemaphoreExit, Data_DWORD_Game, "SemaphoreExit", NULL, 0x0, NULL);
|
RegisterSetting(Set_SemaphoreExit, Data_DWORD_Game, "SemaphoreExit", NULL, 0x0, NULL);
|
||||||
|
|
||||||
|
|
|
@ -1,36 +1,44 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "x86.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "RSP registers.h"
|
#include "RSP registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#define PUTDST8(dest,value) (*((BYTE *)(dest))=(BYTE)(value)); dest += 1;
|
#define PUTDST8(dest, value) \
|
||||||
#define PUTDST16(dest,value) (*((WORD *)(dest))=(WORD)(value)); dest += 2;
|
(*((BYTE *)(dest)) = (BYTE)(value)); \
|
||||||
#define PUTDST32(dest,value) (*((DWORD *)(dest))=(DWORD)(value)); dest += 4;
|
dest += 1;
|
||||||
|
#define PUTDST16(dest, value) \
|
||||||
|
(*((WORD *)(dest)) = (WORD)(value)); \
|
||||||
|
dest += 2;
|
||||||
|
#define PUTDST32(dest, value) \
|
||||||
|
(*((DWORD *)(dest)) = (DWORD)(value)); \
|
||||||
|
dest += 4;
|
||||||
#define PUTDSTPTR(dest, value) \
|
#define PUTDSTPTR(dest, value) \
|
||||||
*(void **)(dest) = (void *)(value); dest += sizeof(void *);
|
*(void **)(dest) = (void *)(value); \
|
||||||
|
dest += sizeof(void *);
|
||||||
|
|
||||||
char * mmx_Strings[8] = {
|
char * mmx_Strings[8] = {
|
||||||
"mm0", "mm1", "mm2", "mm3",
|
"mm0", "mm1", "mm2", "mm3",
|
||||||
"mm4", "mm5", "mm6", "mm7"
|
"mm4", "mm5", "mm6", "mm7"};
|
||||||
};
|
|
||||||
|
|
||||||
#define mmx_Name(Reg) (mmx_Strings[(Reg)])
|
#define mmx_Name(Reg) (mmx_Strings[(Reg)])
|
||||||
|
|
||||||
|
void MmxEmptyMultimediaState(void)
|
||||||
void MmxEmptyMultimediaState(void) {
|
{
|
||||||
CPU_Message(" emms");
|
CPU_Message(" emms");
|
||||||
PUTDST16(RecompPos,0x770f);
|
PUTDST16(RecompPos, 0x770f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxMoveRegToReg(int Dest, int Source) {
|
void MmxMoveRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" movq %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0; break;
|
case x86_MM0: x86Command = 0; break;
|
||||||
case x86_MM1: x86Command = 1; break;
|
case x86_MM1: x86Command = 1; break;
|
||||||
case x86_MM2: x86Command = 2; break;
|
case x86_MM2: x86Command = 2; break;
|
||||||
|
@ -40,7 +48,8 @@ void MmxMoveRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6; break;
|
case x86_MM6: x86Command = 6; break;
|
||||||
case x86_MM7: x86Command = 7; break;
|
case x86_MM7: x86Command = 7; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0 << 3; break;
|
case x86_MM0: x86Command |= 0 << 3; break;
|
||||||
case x86_MM1: x86Command |= 1 << 3; break;
|
case x86_MM1: x86Command |= 1 << 3; break;
|
||||||
case x86_MM2: x86Command |= 2 << 3; break;
|
case x86_MM2: x86Command |= 2 << 3; break;
|
||||||
|
@ -50,16 +59,18 @@ void MmxMoveRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6 << 3; break;
|
case x86_MM6: x86Command |= 6 << 3; break;
|
||||||
case x86_MM7: x86Command |= 7 << 3; break;
|
case x86_MM7: x86Command |= 7 << 3; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x7f0f);
|
PUTDST16(RecompPos, 0x7f0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxMoveQwordVariableToReg(int Dest, void *Variable, char *VariableName) {
|
void MmxMoveQwordVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq %s, qword ptr [%s]",mmx_Name(Dest), VariableName);
|
CPU_Message(" movq %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -70,17 +81,19 @@ void MmxMoveQwordVariableToReg(int Dest, void *Variable, char *VariableName) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x6f0f);
|
PUTDST16(RecompPos, 0x6f0f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxMoveQwordRegToVariable(int Dest, void *Variable, char *VariableName) {
|
void MmxMoveQwordRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movq qword ptr [%s], %s", VariableName, mmx_Name(Dest));
|
CPU_Message(" movq qword ptr [%s], %s", VariableName, mmx_Name(Dest));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -91,17 +104,19 @@ void MmxMoveQwordRegToVariable(int Dest, void *Variable, char *VariableName) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x7f0f);
|
PUTDST16(RecompPos, 0x7f0f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPorRegToReg(int Dest, int Source) {
|
void MmxPorRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" por %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" por %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -111,7 +126,8 @@ void MmxPorRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -121,16 +137,18 @@ void MmxPorRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xeb0f);
|
PUTDST16(RecompPos, 0xeb0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest) {
|
void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" por %s, qword ptr [%s]",mmx_Name(Dest), VariableName);
|
CPU_Message(" por %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -141,17 +159,19 @@ void MmxPorVariableToReg(void * Variable, char * VariableName, int Dest) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0xeb0f);
|
PUTDST16(RecompPos, 0xeb0f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPandRegToReg(int Dest, int Source) {
|
void MmxPandRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pand %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pand %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -161,7 +181,8 @@ void MmxPandRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -171,16 +192,18 @@ void MmxPandRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xdb0f);
|
PUTDST16(RecompPos, 0xdb0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest) {
|
void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pand %s, qword ptr [%s]",mmx_Name(Dest), VariableName);
|
CPU_Message(" pand %s, qword ptr [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -191,17 +214,19 @@ void MmxPandVariableToReg(void * Variable, char * VariableName, int Dest) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0xdb0f);
|
PUTDST16(RecompPos, 0xdb0f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPandnRegToReg(int Dest, int Source) {
|
void MmxPandnRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pandn %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pandn %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -211,7 +236,8 @@ void MmxPandnRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -221,16 +247,18 @@ void MmxPandnRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xdf0f);
|
PUTDST16(RecompPos, 0xdf0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxXorRegToReg(int Dest, int Source) {
|
void MmxXorRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pxor %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pxor %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x00; break;
|
case x86_MM0: x86Command = 0x00; break;
|
||||||
case x86_MM1: x86Command = 0x08; break;
|
case x86_MM1: x86Command = 0x08; break;
|
||||||
case x86_MM2: x86Command = 0x10; break;
|
case x86_MM2: x86Command = 0x10; break;
|
||||||
|
@ -240,7 +268,8 @@ void MmxXorRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 0x30; break;
|
case x86_MM6: x86Command = 0x30; break;
|
||||||
case x86_MM7: x86Command = 0x38; break;
|
case x86_MM7: x86Command = 0x38; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command += 0x00; break;
|
case x86_MM0: x86Command += 0x00; break;
|
||||||
case x86_MM1: x86Command += 0x01; break;
|
case x86_MM1: x86Command += 0x01; break;
|
||||||
case x86_MM2: x86Command += 0x02; break;
|
case x86_MM2: x86Command += 0x02; break;
|
||||||
|
@ -250,16 +279,18 @@ void MmxXorRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command += 0x06; break;
|
case x86_MM6: x86Command += 0x06; break;
|
||||||
case x86_MM7: x86Command += 0x07; break;
|
case x86_MM7: x86Command += 0x07; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xef0f);
|
PUTDST16(RecompPos, 0xef0f);
|
||||||
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, BYTE Immed)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pshufw %s, [%s], %02X", mmx_Name(Dest), VariableName, Immed);
|
CPU_Message(" pshufw %s, [%s], %02X", mmx_Name(Dest), VariableName, Immed);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -270,18 +301,20 @@ void MmxShuffleMemoryToReg(int Dest, void * Variable, char * VariableName, BYTE
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x700f);
|
PUTDST16(RecompPos, 0x700f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPcmpeqwRegToReg(int Dest, int Source){
|
void MmxPcmpeqwRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pcmpeqw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pcmpeqw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -291,7 +324,8 @@ void MmxPcmpeqwRegToReg(int Dest, int Source){
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -305,12 +339,14 @@ void MmxPcmpeqwRegToReg(int Dest, int Source){
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPmullwRegToReg(int Dest, int Source) {
|
void MmxPmullwRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmullw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmullw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -320,7 +356,8 @@ void MmxPmullwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -330,16 +367,18 @@ void MmxPmullwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xd50f);
|
PUTDST16(RecompPos, 0xd50f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName) {
|
void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmullw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" pmullw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -349,17 +388,19 @@ void MmxPmullwVariableToReg(int Dest, void * Variable, char * VariableName) {
|
||||||
case x86_MM6: x86Command = 0x35; break;
|
case x86_MM6: x86Command = 0x35; break;
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xd50f);
|
PUTDST16(RecompPos, 0xd50f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPmulhuwRegToReg(int Dest, int Source) {
|
void MmxPmulhuwRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhuw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmulhuw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -369,7 +410,8 @@ void MmxPmulhuwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -379,16 +421,18 @@ void MmxPmulhuwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xe40f);
|
PUTDST16(RecompPos, 0xe40f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPmulhwRegToReg(int Dest, int Source) {
|
void MmxPmulhwRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pmulhw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -398,7 +442,8 @@ void MmxPmulhwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -408,16 +453,18 @@ void MmxPmulhwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xe50f);
|
PUTDST16(RecompPos, 0xe50f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName) {
|
void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pmulhw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" pmulhw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -427,18 +474,19 @@ void MmxPmulhwRegToVariable(int Dest, void * Variable, char * VariableName) {
|
||||||
case x86_MM6: x86Command = 0x35; break;
|
case x86_MM6: x86Command = 0x35; break;
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xe50f);
|
PUTDST16(RecompPos, 0xe50f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MmxPsrlwImmed(int Dest, BYTE Immed)
|
||||||
void MmxPsrlwImmed(int Dest, BYTE Immed) {
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psrlw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psrlw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0xD0; break;
|
case x86_MM0: x86Command = 0xD0; break;
|
||||||
case x86_MM1: x86Command = 0xD1; break;
|
case x86_MM1: x86Command = 0xD1; break;
|
||||||
case x86_MM2: x86Command = 0xD2; break;
|
case x86_MM2: x86Command = 0xD2; break;
|
||||||
|
@ -449,17 +497,19 @@ void MmxPsrlwImmed(int Dest, BYTE Immed) {
|
||||||
case x86_MM7: x86Command = 0xD7; break;
|
case x86_MM7: x86Command = 0xD7; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x710f);
|
PUTDST16(RecompPos, 0x710f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsrawImmed(int Dest, BYTE Immed) {
|
void MmxPsrawImmed(int Dest, BYTE Immed)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psraw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psraw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0xE0; break;
|
case x86_MM0: x86Command = 0xE0; break;
|
||||||
case x86_MM1: x86Command = 0xE1; break;
|
case x86_MM1: x86Command = 0xE1; break;
|
||||||
case x86_MM2: x86Command = 0xE2; break;
|
case x86_MM2: x86Command = 0xE2; break;
|
||||||
|
@ -470,17 +520,19 @@ void MmxPsrawImmed(int Dest, BYTE Immed) {
|
||||||
case x86_MM7: x86Command = 0xE7; break;
|
case x86_MM7: x86Command = 0xE7; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x710f);
|
PUTDST16(RecompPos, 0x710f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsllwImmed(int Dest, BYTE Immed) {
|
void MmxPsllwImmed(int Dest, BYTE Immed)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psllw %s, %i", mmx_Name(Dest), Immed);
|
CPU_Message(" psllw %s, %i", mmx_Name(Dest), Immed);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0xF0; break;
|
case x86_MM0: x86Command = 0xF0; break;
|
||||||
case x86_MM1: x86Command = 0xF1; break;
|
case x86_MM1: x86Command = 0xF1; break;
|
||||||
case x86_MM2: x86Command = 0xF2; break;
|
case x86_MM2: x86Command = 0xF2; break;
|
||||||
|
@ -491,17 +543,19 @@ void MmxPsllwImmed(int Dest, BYTE Immed) {
|
||||||
case x86_MM7: x86Command = 0xF7; break;
|
case x86_MM7: x86Command = 0xF7; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x710f);
|
PUTDST16(RecompPos, 0x710f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPaddswRegToReg(int Dest, int Source) {
|
void MmxPaddswRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" paddsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -511,7 +565,8 @@ void MmxPaddswRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -521,16 +576,18 @@ void MmxPaddswRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xed0f);
|
PUTDST16(RecompPos, 0xed0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsubswRegToReg(int Dest, int Source) {
|
void MmxPsubswRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psubsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" psubsw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -540,7 +597,8 @@ void MmxPsubswRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -550,16 +608,18 @@ void MmxPsubswRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xe90f);
|
PUTDST16(RecompPos, 0xe90f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName) {
|
void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddsw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" paddsw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -570,17 +630,19 @@ void MmxPaddswVariableToReg(int Dest, void * Variable, char * VariableName) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0xed0f);
|
PUTDST16(RecompPos, 0xed0f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName) {
|
void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" psubsw %s, [%s]", mmx_Name(Dest), VariableName);
|
CPU_Message(" psubsw %s, [%s]", mmx_Name(Dest), VariableName);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0x05; break;
|
case x86_MM0: x86Command = 0x05; break;
|
||||||
case x86_MM1: x86Command = 0x0D; break;
|
case x86_MM1: x86Command = 0x0D; break;
|
||||||
case x86_MM2: x86Command = 0x15; break;
|
case x86_MM2: x86Command = 0x15; break;
|
||||||
|
@ -591,17 +653,19 @@ void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName) {
|
||||||
case x86_MM7: x86Command = 0x3D; break;
|
case x86_MM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0xe90f);
|
PUTDST16(RecompPos, 0xe90f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPaddwRegToReg(int Dest, int Source) {
|
void MmxPaddwRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" paddw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" paddw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -611,7 +675,8 @@ void MmxPaddwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -621,16 +686,18 @@ void MmxPaddwRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xfd0f);
|
PUTDST16(RecompPos, 0xfd0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxPackSignedDwords(int Dest, int Source) {
|
void MmxPackSignedDwords(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" packssdw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" packssdw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -640,7 +707,8 @@ void MmxPackSignedDwords(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -650,16 +718,18 @@ void MmxPackSignedDwords(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x6b0f);
|
PUTDST16(RecompPos, 0x6b0f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxUnpackLowWord(int Dest, int Source) {
|
void MmxUnpackLowWord(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" punpcklwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" punpcklwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -669,7 +739,8 @@ void MmxUnpackLowWord(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -679,16 +750,18 @@ void MmxUnpackLowWord(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x610f);
|
PUTDST16(RecompPos, 0x610f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxUnpackHighWord(int Dest, int Source) {
|
void MmxUnpackHighWord(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" punpckhwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" punpckhwd %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -698,7 +771,8 @@ void MmxUnpackHighWord(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -708,16 +782,18 @@ void MmxUnpackHighWord(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x690f);
|
PUTDST16(RecompPos, 0x690f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmxCompareGreaterWordRegToReg(int Dest, int Source) {
|
void MmxCompareGreaterWordRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" pcmpgtw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
CPU_Message(" pcmpgtw %s, %s", mmx_Name(Dest), mmx_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command = 0 << 3; break;
|
case x86_MM0: x86Command = 0 << 3; break;
|
||||||
case x86_MM1: x86Command = 1 << 3; break;
|
case x86_MM1: x86Command = 1 << 3; break;
|
||||||
case x86_MM2: x86Command = 2 << 3; break;
|
case x86_MM2: x86Command = 2 << 3; break;
|
||||||
|
@ -727,7 +803,8 @@ void MmxCompareGreaterWordRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command = 6 << 3; break;
|
case x86_MM6: x86Command = 6 << 3; break;
|
||||||
case x86_MM7: x86Command = 7 << 3; break;
|
case x86_MM7: x86Command = 7 << 3; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_MM0: x86Command |= 0; break;
|
case x86_MM0: x86Command |= 0; break;
|
||||||
case x86_MM1: x86Command |= 1; break;
|
case x86_MM1: x86Command |= 1; break;
|
||||||
case x86_MM2: x86Command |= 2; break;
|
case x86_MM2: x86Command |= 2; break;
|
||||||
|
@ -737,6 +814,6 @@ void MmxCompareGreaterWordRegToReg(int Dest, int Source) {
|
||||||
case x86_MM6: x86Command |= 6; break;
|
case x86_MM6: x86Command |= 6; break;
|
||||||
case x86_MM7: x86Command |= 7; break;
|
case x86_MM7: x86Command |= 7; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x650f);
|
PUTDST16(RecompPos, 0x650f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,30 +4,35 @@
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable : 4201) // Non-standard extension used: nameless struct/union
|
#pragma warning(disable : 4201) // Non-standard extension used: nameless struct/union
|
||||||
|
|
||||||
typedef union tagOPCODE {
|
typedef union tagOPCODE
|
||||||
|
{
|
||||||
uint32_t Hex;
|
uint32_t Hex;
|
||||||
unsigned char Ascii[4];
|
unsigned char Ascii[4];
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
unsigned immediate : 16;
|
unsigned immediate : 16;
|
||||||
unsigned rt : 5;
|
unsigned rt : 5;
|
||||||
unsigned rs : 5;
|
unsigned rs : 5;
|
||||||
unsigned op : 6;
|
unsigned op : 6;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
unsigned offset : 16;
|
unsigned offset : 16;
|
||||||
unsigned : 5;
|
unsigned : 5;
|
||||||
unsigned base : 5;
|
unsigned base : 5;
|
||||||
unsigned : 6;
|
unsigned : 6;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
unsigned target : 26;
|
unsigned target : 26;
|
||||||
unsigned : 6;
|
unsigned : 6;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
unsigned funct : 6;
|
unsigned funct : 6;
|
||||||
unsigned sa : 5;
|
unsigned sa : 5;
|
||||||
unsigned rd : 5;
|
unsigned rd : 5;
|
||||||
|
@ -36,7 +41,8 @@ typedef union tagOPCODE {
|
||||||
unsigned : 6;
|
unsigned : 6;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
signed voffset : 7;
|
signed voffset : 7;
|
||||||
unsigned del : 4;
|
unsigned del : 4;
|
||||||
unsigned : 5;
|
unsigned : 5;
|
||||||
|
|
|
@ -1,33 +1,39 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
|
||||||
#include "profiling.h"
|
#include "profiling.h"
|
||||||
#pragma warning(disable:4786)
|
#pragma warning(disable : 4786)
|
||||||
#include <Common/StdString.h>
|
|
||||||
#include <Common/File.h>
|
#include <Common/File.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
|
#include <Common/StdString.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class CProfiling
|
class CProfiling
|
||||||
{
|
{
|
||||||
typedef std::map<DWORD, __int64 > PROFILE_ENRTIES;
|
typedef std::map<DWORD, __int64> PROFILE_ENRTIES;
|
||||||
typedef PROFILE_ENRTIES::iterator PROFILE_ENRTY;
|
typedef PROFILE_ENRTIES::iterator PROFILE_ENRTY;
|
||||||
typedef PROFILE_ENRTIES::value_type PROFILE_VALUE;
|
typedef PROFILE_ENRTIES::value_type PROFILE_VALUE;
|
||||||
typedef struct { SPECIAL_TIMERS Timer; char * Name; } TIMER_NAME;
|
typedef struct
|
||||||
|
{
|
||||||
|
SPECIAL_TIMERS Timer;
|
||||||
|
char * Name;
|
||||||
|
} TIMER_NAME;
|
||||||
|
|
||||||
DWORD m_CurrentTimerAddr, CurrentDisplayCount;
|
DWORD m_CurrentTimerAddr, CurrentDisplayCount;
|
||||||
DWORD m_StartTimeHi, m_StartTimeLo; // The current timer start time
|
DWORD m_StartTimeHi, m_StartTimeLo; // The current timer start time
|
||||||
PROFILE_ENRTIES m_Entries;
|
PROFILE_ENRTIES m_Entries;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CProfiling ()
|
CProfiling()
|
||||||
{
|
{
|
||||||
m_CurrentTimerAddr = Timer_None;
|
m_CurrentTimerAddr = Timer_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recording timing against current timer, returns the address of the timer stopped
|
// Recording timing against current timer, returns the address of the timer stopped
|
||||||
DWORD StartTimer ( DWORD Address )
|
DWORD StartTimer(DWORD Address)
|
||||||
{
|
{
|
||||||
DWORD OldTimerAddr = StopTimer();
|
DWORD OldTimerAddr = StopTimer();
|
||||||
m_CurrentTimerAddr = Address;
|
m_CurrentTimerAddr = Address;
|
||||||
|
@ -48,9 +54,12 @@ public:
|
||||||
#endif
|
#endif
|
||||||
return OldTimerAddr;
|
return OldTimerAddr;
|
||||||
}
|
}
|
||||||
DWORD StopTimer ( void )
|
DWORD StopTimer(void)
|
||||||
{
|
{
|
||||||
if (m_CurrentTimerAddr == Timer_None) { return m_CurrentTimerAddr; }
|
if (m_CurrentTimerAddr == Timer_None)
|
||||||
|
{
|
||||||
|
return m_CurrentTimerAddr;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(_M_IX86) && defined(_MSC_VER)
|
#if defined(_M_IX86) && defined(_MSC_VER)
|
||||||
DWORD HiValue, LoValue;
|
DWORD HiValue, LoValue;
|
||||||
|
@ -85,13 +94,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset all the counters back to 0
|
// Reset all the counters back to 0
|
||||||
void ResetCounters ( void )
|
void ResetCounters(void)
|
||||||
{
|
{
|
||||||
m_Entries.clear();
|
m_Entries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a log file with the current results, this will also reset the counters
|
// Generate a log file with the current results, this will also reset the counters
|
||||||
void GenerateLog ( void )
|
void GenerateLog(void)
|
||||||
{
|
{
|
||||||
stdstr LogFileName;
|
stdstr LogFileName;
|
||||||
{
|
{
|
||||||
|
@ -101,14 +110,14 @@ public:
|
||||||
|
|
||||||
// Get the total time
|
// Get the total time
|
||||||
__int64 TotalTime = 0;
|
__int64 TotalTime = 0;
|
||||||
for (PROFILE_ENRTY itemTime = m_Entries.begin(); itemTime != m_Entries.end(); itemTime++ )
|
for (PROFILE_ENRTY itemTime = m_Entries.begin(); itemTime != m_Entries.end(); itemTime++)
|
||||||
{
|
{
|
||||||
TotalTime += itemTime->second;
|
TotalTime += itemTime->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a sortable list of items
|
// Create a sortable list of items
|
||||||
std::vector<PROFILE_VALUE *> ItemList;
|
std::vector<PROFILE_VALUE *> ItemList;
|
||||||
for (PROFILE_ENRTY Entry = m_Entries.begin(); Entry != m_Entries.end(); Entry++ )
|
for (PROFILE_ENRTY Entry = m_Entries.begin(); Entry != m_Entries.end(); Entry++)
|
||||||
{
|
{
|
||||||
ItemList.push_back(&(*Entry));
|
ItemList.push_back(&(*Entry));
|
||||||
}
|
}
|
||||||
|
@ -116,9 +125,9 @@ public:
|
||||||
// Sort the list with a basic bubble sort
|
// Sort the list with a basic bubble sort
|
||||||
if (ItemList.size() > 0)
|
if (ItemList.size() > 0)
|
||||||
{
|
{
|
||||||
for (size_t OuterPass = 0; OuterPass < (ItemList.size() - 1); OuterPass++ )
|
for (size_t OuterPass = 0; OuterPass < (ItemList.size() - 1); OuterPass++)
|
||||||
{
|
{
|
||||||
for (size_t InnerPass = 0; InnerPass < (ItemList.size() - 1); InnerPass++ )
|
for (size_t InnerPass = 0; InnerPass < (ItemList.size() - 1); InnerPass++)
|
||||||
{
|
{
|
||||||
if (ItemList[InnerPass]->second < ItemList[InnerPass + 1]->second)
|
if (ItemList[InnerPass]->second < ItemList[InnerPass + 1]->second)
|
||||||
{
|
{
|
||||||
|
@ -137,62 +146,65 @@ public:
|
||||||
{Timer_RDP_Running, "RDP: Running"},
|
{Timer_RDP_Running, "RDP: Running"},
|
||||||
};
|
};
|
||||||
|
|
||||||
for (size_t count = 0; count < ItemList.size(); count++ )
|
for (size_t count = 0; count < ItemList.size(); count++)
|
||||||
{
|
{
|
||||||
char Buffer[255];
|
char Buffer[255];
|
||||||
float CpuUsage = (float)(((double)ItemList[count]->second / (double)TotalTime) * 100);
|
float CpuUsage = (float)(((double)ItemList[count]->second / (double)TotalTime) * 100);
|
||||||
|
|
||||||
if (CpuUsage <= 0.2) { continue; }
|
if (CpuUsage <= 0.2)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
sprintf(Buffer, "Function 0x%08X", ItemList[count]->first);
|
sprintf(Buffer, "Function 0x%08X", ItemList[count]->first);
|
||||||
for (int NameID = 0; NameID < (sizeof(TimerNames) / sizeof(TIMER_NAME)); NameID++)
|
for (int NameID = 0; NameID < (sizeof(TimerNames) / sizeof(TIMER_NAME)); NameID++)
|
||||||
{
|
{
|
||||||
if (ItemList[count]->first == (DWORD)TimerNames[NameID].Timer)
|
if (ItemList[count]->first == (DWORD)TimerNames[NameID].Timer)
|
||||||
{
|
{
|
||||||
strcpy(Buffer,TimerNames[NameID].Name);
|
strcpy(Buffer, TimerNames[NameID].Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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);
|
ShellExecuteA(NULL, "open", LogFileName.c_str(), NULL, NULL, SW_SHOW);
|
||||||
ResetCounters();
|
ResetCounters();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CProfiling & GetProfiler(void)
|
||||||
CProfiling& GetProfiler ( void )
|
|
||||||
{
|
{
|
||||||
static CProfiling Profile;
|
static CProfiling Profile;
|
||||||
return Profile;
|
return Profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetTimerList (void)
|
void ResetTimerList(void)
|
||||||
{
|
{
|
||||||
GetProfiler().ResetCounters();
|
GetProfiler().ResetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD StartTimer (DWORD Address)
|
DWORD StartTimer(DWORD Address)
|
||||||
{
|
{
|
||||||
return GetProfiler().StartTimer(Address);
|
return GetProfiler().StartTimer(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopTimer (void)
|
void StopTimer(void)
|
||||||
{
|
{
|
||||||
GetProfiler().StopTimer();
|
GetProfiler().StopTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateTimerResults (void)
|
void GenerateTimerResults(void)
|
||||||
{
|
{
|
||||||
GetProfiler().GenerateLog();
|
GetProfiler().GenerateLog();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef todelete
|
#ifdef todelete
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
char Label[100];
|
char Label[100];
|
||||||
__int64 TimeTotal;
|
__int64 TimeTotal;
|
||||||
} TIME_STAMP_ENTRY;
|
} TIME_STAMP_ENTRY;
|
||||||
|
@ -201,17 +213,20 @@ DWORD StartTimeHi, StartTimeLo, StopTimeHi, StopTimeLo, TSE_Count, TSE_Max;
|
||||||
TIME_STAMP_ENTRY * TS_Entries = NULL;
|
TIME_STAMP_ENTRY * TS_Entries = NULL;
|
||||||
char LastLabel[100];
|
char LastLabel[100];
|
||||||
|
|
||||||
void ResetTimerList (void)
|
void ResetTimerList(void)
|
||||||
{
|
{
|
||||||
if (TS_Entries) { free(TS_Entries); }
|
if (TS_Entries)
|
||||||
|
{
|
||||||
|
free(TS_Entries);
|
||||||
|
}
|
||||||
TS_Entries = NULL;
|
TS_Entries = NULL;
|
||||||
TSE_Count = 0;
|
TSE_Count = 0;
|
||||||
TSE_Max = 0;
|
TSE_Max = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartTimer (char * Label)
|
void StartTimer(char * Label)
|
||||||
{
|
{
|
||||||
strcpy(LastLabel,Label);
|
strcpy(LastLabel, Label);
|
||||||
_asm {
|
_asm {
|
||||||
pushad
|
pushad
|
||||||
rdtsc
|
rdtsc
|
||||||
|
@ -221,7 +236,7 @@ void StartTimer (char * Label)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopTimer (void)
|
void StopTimer(void)
|
||||||
{
|
{
|
||||||
_asm {
|
_asm {
|
||||||
pushad
|
pushad
|
||||||
|
@ -230,13 +245,16 @@ void StopTimer (void)
|
||||||
mov StopTimeLo, eax
|
mov StopTimeLo, eax
|
||||||
popad
|
popad
|
||||||
}
|
}
|
||||||
if (strlen(LastLabel) == 0) { return; }
|
if (strlen(LastLabel) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
{
|
{
|
||||||
DWORD count;
|
DWORD count;
|
||||||
|
|
||||||
for (count = 0; count < TSE_Count; count ++)
|
for (count = 0; count < TSE_Count; count++)
|
||||||
{
|
{
|
||||||
if (strcmp(LastLabel,TS_Entries[count].Label) == 0)
|
if (strcmp(LastLabel, TS_Entries[count].Label) == 0)
|
||||||
{
|
{
|
||||||
__int64 Time = ((unsigned __int64)StopTimeHi << 32) + (unsigned __int64)StopTimeLo;
|
__int64 Time = ((unsigned __int64)StopTimeHi << 32) + (unsigned __int64)StopTimeLo;
|
||||||
Time -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
Time -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
||||||
|
@ -250,68 +268,67 @@ void StopTimer (void)
|
||||||
TS_Entries = (TIME_STAMP_ENTRY *)malloc(sizeof(TIME_STAMP_ENTRY) * 100);
|
TS_Entries = (TIME_STAMP_ENTRY *)malloc(sizeof(TIME_STAMP_ENTRY) * 100);
|
||||||
if (TS_Entries == NULL)
|
if (TS_Entries == NULL)
|
||||||
{
|
{
|
||||||
MessageBox(NULL,"TIME_STAMP_ENTRY == NULL ??","ERROR",MB_OK|MB_ICONERROR|MB_SETFOREGROUND);
|
MessageBox(NULL, "TIME_STAMP_ENTRY == NULL ??", "ERROR", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
||||||
}
|
}
|
||||||
TSE_Max = 100;
|
TSE_Max = 100;
|
||||||
}
|
}
|
||||||
else if (TSE_Count == TSE_Max)
|
else if (TSE_Count == TSE_Max)
|
||||||
{
|
{
|
||||||
TSE_Max += 100;
|
TSE_Max += 100;
|
||||||
TS_Entries = (TIME_STAMP_ENTRY *)realloc(TS_Entries,sizeof(TIME_STAMP_ENTRY) * TSE_Max);
|
TS_Entries = (TIME_STAMP_ENTRY *)realloc(TS_Entries, sizeof(TIME_STAMP_ENTRY) * TSE_Max);
|
||||||
if (TS_Entries == NULL)
|
if (TS_Entries == NULL)
|
||||||
{
|
{
|
||||||
MessageBox(NULL,"TIME_STAMP_ENTRY == NULL ??","ERROR",MB_OK|MB_ICONERROR|MB_SETFOREGROUND);
|
MessageBox(NULL, "TIME_STAMP_ENTRY == NULL ??", "ERROR", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strcpy(TS_Entries[TSE_Count].Label,LastLabel);
|
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)StopTimeHi << 32) + (unsigned __int64)StopTimeLo;
|
||||||
TS_Entries[TSE_Count].TimeTotal -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
TS_Entries[TSE_Count].TimeTotal -= ((unsigned __int64)StartTimeHi << 32) + (unsigned __int64)StartTimeLo;
|
||||||
TSE_Count +=1;
|
TSE_Count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateTimerResults (void)
|
void GenerateTimerResults(void)
|
||||||
{
|
{
|
||||||
char buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR];
|
char buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
||||||
char fname[_MAX_FNAME],ext[_MAX_EXT], LogFileName[_MAX_PATH];
|
char fname[_MAX_FNAME], ext[_MAX_EXT], LogFileName[_MAX_PATH];
|
||||||
DWORD dwWritten, count, count2;
|
DWORD dwWritten, count, count2;
|
||||||
HANDLE hLogFile = NULL;
|
HANDLE hLogFile = NULL;
|
||||||
__int64 TotalTime;
|
__int64 TotalTime;
|
||||||
|
|
||||||
StopTimer();
|
StopTimer();
|
||||||
|
|
||||||
GetModuleFileName(NULL,buffer,sizeof(buffer));
|
GetModuleFileName(NULL, buffer, sizeof(buffer));
|
||||||
_splitpath( buffer, drive, dir, fname, ext );
|
_splitpath(buffer, drive, dir, fname, ext);
|
||||||
_makepath( LogFileName, drive, dir, "RSP Profiling", "log" );
|
_makepath(LogFileName, drive, dir, "RSP Profiling", "log");
|
||||||
|
|
||||||
hLogFile = CreateFile(LogFileName,GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
|
hLogFile = CreateFile(LogFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
|
||||||
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||||
SetFilePointer(hLogFile,0,NULL,FILE_BEGIN);
|
SetFilePointer(hLogFile, 0, NULL, FILE_BEGIN);
|
||||||
|
|
||||||
for (count = 0; count < TSE_Count; count ++)
|
for (count = 0; count < TSE_Count; count++)
|
||||||
{
|
{
|
||||||
for (count2 = 0; count2 < (TSE_Count - 1); count2 ++)
|
for (count2 = 0; count2 < (TSE_Count - 1); count2++)
|
||||||
{
|
{
|
||||||
if (TS_Entries[count2].TimeTotal < TS_Entries[count2 + 1].TimeTotal)
|
if (TS_Entries[count2].TimeTotal < TS_Entries[count2 + 1].TimeTotal)
|
||||||
{
|
{
|
||||||
TIME_STAMP_ENTRY Temp;
|
TIME_STAMP_ENTRY Temp;
|
||||||
memcpy(&Temp,&TS_Entries[count2],sizeof(TIME_STAMP_ENTRY));
|
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], &TS_Entries[count2 + 1], sizeof(TIME_STAMP_ENTRY));
|
||||||
memcpy(&TS_Entries[count2 + 1],&Temp,sizeof(TIME_STAMP_ENTRY));
|
memcpy(&TS_Entries[count2 + 1], &Temp, sizeof(TIME_STAMP_ENTRY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TotalTime = 0;
|
TotalTime = 0;
|
||||||
for (count = 0; count < TSE_Count; count ++)
|
for (count = 0; count < TSE_Count; count++)
|
||||||
{
|
{
|
||||||
TotalTime += TS_Entries[count].TimeTotal;
|
TotalTime += TS_Entries[count].TimeTotal;
|
||||||
}
|
}
|
||||||
for (count = 0; count < (TSE_Count < 50?TSE_Count:50); count ++)
|
for (count = 0; count < (TSE_Count < 50 ? TSE_Count : 50); count++)
|
||||||
{
|
{
|
||||||
sprintf(buffer,"%s - %0.2f%c\r\n",
|
sprintf(buffer, "%s - %0.2f%c\r\n",
|
||||||
TS_Entries[count].Label,
|
TS_Entries[count].Label,
|
||||||
(((double)TS_Entries[count].TimeTotal / (double)TotalTime) * 100),'%'
|
(((double)TS_Entries[count].TimeTotal / (double)TotalTime) * 100), '%');
|
||||||
);
|
WriteFile(hLogFile, buffer, strlen(buffer), &dwWritten, NULL);
|
||||||
WriteFile( hLogFile,buffer,strlen(buffer),&dwWritten,NULL );
|
|
||||||
}
|
}
|
||||||
CloseHandle(hLogFile);
|
CloseHandle(hLogFile);
|
||||||
ResetTimerList();
|
ResetTimerList();
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
enum SPECIAL_TIMERS {
|
enum SPECIAL_TIMERS
|
||||||
Timer_None = 0, Timer_Compiling = -1, Timer_RSP_Running = -2,
|
{
|
||||||
Timer_R4300_Running = -3, Timer_RDP_Running = -5, Timer_RefreshScreen = -6,
|
Timer_None = 0,
|
||||||
Timer_UpdateScreen = -7, Timer_UpdateFPS = -9, Timer_Idel = -10,
|
Timer_Compiling = -1,
|
||||||
Timer_FuncLookup = -11,Timer_Done = -13,
|
Timer_RSP_Running = -2,
|
||||||
|
Timer_R4300_Running = -3,
|
||||||
|
Timer_RDP_Running = -5,
|
||||||
|
Timer_RefreshScreen = -6,
|
||||||
|
Timer_UpdateScreen = -7,
|
||||||
|
Timer_UpdateFPS = -9,
|
||||||
|
Timer_Idel = -10,
|
||||||
|
Timer_FuncLookup = -11,
|
||||||
|
Timer_Done = -13,
|
||||||
};
|
};
|
||||||
|
|
||||||
void ResetTimerList ( void );
|
void ResetTimerList(void);
|
||||||
DWORD StartTimer ( DWORD Address );
|
DWORD StartTimer(DWORD Address);
|
||||||
void StopTimer ( void );
|
void StopTimer(void);
|
||||||
void GenerateTimerResults ( void );
|
void GenerateTimerResults(void);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,13 +1,13 @@
|
||||||
char * RSPOpcodeName ( DWORD OpCode, DWORD PC );
|
char * RSPOpcodeName(DWORD OpCode, DWORD PC);
|
||||||
|
|
||||||
void DumpRSPCode (void);
|
void DumpRSPCode(void);
|
||||||
void DumpRSPData (void);
|
void DumpRSPData(void);
|
||||||
void Disable_RSP_Commands_Window ( void );
|
void Disable_RSP_Commands_Window(void);
|
||||||
void Enable_RSP_Commands_Window ( void );
|
void Enable_RSP_Commands_Window(void);
|
||||||
void Enter_RSP_Commands_Window ( void );
|
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(unsigned int NewLocation);
|
||||||
|
|
||||||
extern DWORD Stepping_Commands, WaitingForStep;
|
extern DWORD Stepping_Commands, WaitingForStep;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -86,36 +86,45 @@ extern char * GPR_Strings[32];
|
||||||
(Reg) == 31 ? "RA" : "Unknown Register"
|
(Reg) == 31 ? "RA" : "Unknown Register"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define COP0_Name(Reg)\
|
#define COP0_Name(Reg) \
|
||||||
(Reg) == 0 ? "SP memory address" :\
|
(Reg) == 0 ? "SP memory address" : (Reg) == 1 ? "SP DRAM DMA address" \
|
||||||
(Reg) == 1 ? "SP DRAM DMA address" :\
|
: (Reg) == 2 ? "SP read DMA length" \
|
||||||
(Reg) == 2 ? "SP read DMA length" :\
|
: (Reg) == 3 ? "SP write DMA length" \
|
||||||
(Reg) == 3 ? "SP write DMA length" :\
|
: (Reg) == 4 ? "SP status" \
|
||||||
(Reg) == 4 ? "SP status" :\
|
: (Reg) == 5 ? "SP DMA full" \
|
||||||
(Reg) == 5 ? "SP DMA full" :\
|
: (Reg) == 6 ? "SP DMA busy" \
|
||||||
(Reg) == 6 ? "SP DMA busy" :\
|
: (Reg) == 7 ? "SP semaphore" \
|
||||||
(Reg) == 7 ? "SP semaphore" :\
|
: (Reg) == 8 ? "DP CMD DMA start" \
|
||||||
(Reg) == 8 ? "DP CMD DMA start" :\
|
: (Reg) == 9 ? "DP CMD DMA end" \
|
||||||
(Reg) == 9 ? "DP CMD DMA end" :\
|
: (Reg) == 10 ? "DP CMD DMA current" \
|
||||||
(Reg) == 10 ? "DP CMD DMA current" :\
|
: (Reg) == 11 ? "DP CMD status" \
|
||||||
(Reg) == 11 ? "DP CMD status" :\
|
: (Reg) == 12 ? "DP clock counter" \
|
||||||
(Reg) == 12 ? "DP clock counter" :\
|
: (Reg) == 13 ? "DP buffer busy counter" \
|
||||||
(Reg) == 13 ? "DP buffer busy counter" :\
|
: (Reg) == 14 ? "DP pipe busy counter" \
|
||||||
(Reg) == 14 ? "DP pipe busy counter" :\
|
: (Reg) == 15 ? "DP TMEM load counter" \
|
||||||
(Reg) == 15 ? "DP TMEM load counter" :\
|
: "Unknown Register"
|
||||||
"Unknown Register"
|
|
||||||
|
|
||||||
#define ElementSpecifier(Elem)\
|
#define ElementSpecifier(Elem) \
|
||||||
(Elem) == 0 ? "" : (Elem) == 1 ? "" : (Elem) == 2 ? " [0q]" :\
|
(Elem) == 0 ? "" : (Elem) == 1 ? "" \
|
||||||
(Elem) == 3 ? " [1q]" : (Elem) == 4 ? " [0h]" : (Elem) == 5 ? " [1h]" :\
|
: (Elem) == 2 ? " [0q]" \
|
||||||
(Elem) == 6 ? " [2h]" : (Elem) == 7 ? " [3h]" : (Elem) == 8 ? " [0]" :\
|
: (Elem) == 3 ? " [1q]" \
|
||||||
(Elem) == 9 ? " [1]" : (Elem) == 10 ? " [2]" : (Elem) == 11 ? " [3]" :\
|
: (Elem) == 4 ? " [0h]" \
|
||||||
(Elem) == 12 ? " [4]" : (Elem) == 13 ? " [5]" : (Elem) == 14 ? " [6]" :\
|
: (Elem) == 5 ? " [1h]" \
|
||||||
(Elem) == 15 ? " [7]" : "Unknown Element"
|
: (Elem) == 6 ? " [2h]" \
|
||||||
|
: (Elem) == 7 ? " [3h]" \
|
||||||
|
: (Elem) == 8 ? " [0]" \
|
||||||
|
: (Elem) == 9 ? " [1]" \
|
||||||
|
: (Elem) == 10 ? " [2]" \
|
||||||
|
: (Elem) == 11 ? " [3]" \
|
||||||
|
: (Elem) == 12 ? " [4]" \
|
||||||
|
: (Elem) == 13 ? " [5]" \
|
||||||
|
: (Elem) == 14 ? " [6]" \
|
||||||
|
: (Elem) == 15 ? " [7]" \
|
||||||
|
: "Unknown Element"
|
||||||
|
|
||||||
void Enter_RSP_Register_Window ( void );
|
void Enter_RSP_Register_Window(void);
|
||||||
void InitilizeRSPRegisters (void);
|
void InitilizeRSPRegisters(void);
|
||||||
void UpdateRSPRegistersScreen ( void );
|
void UpdateRSPRegistersScreen(void);
|
||||||
|
|
||||||
// RSP registers
|
// RSP registers
|
||||||
extern UWORD32 RSP_GPR[32], RSP_Flags[4];
|
extern UWORD32 RSP_GPR[32], RSP_Flags[4];
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,21 +1,21 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "Cpu.h"
|
#include "Cpu.h"
|
||||||
#include "Interpreter CPU.h"
|
#include "Interpreter CPU.h"
|
||||||
|
#include "Profiling.h"
|
||||||
|
#include "RSP Command.h"
|
||||||
|
#include "RSP registers.h"
|
||||||
#include "Recompiler CPU.h"
|
#include "Recompiler CPU.h"
|
||||||
#include "Recompiler Ops.h"
|
#include "Recompiler Ops.h"
|
||||||
#include "RSP registers.h"
|
#include "Rsp.h"
|
||||||
#include "RSP Command.h"
|
#include "Types.h"
|
||||||
|
#include "log.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "opcode.h"
|
#include "opcode.h"
|
||||||
#include "log.h"
|
|
||||||
#include "Profiling.h"
|
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include "Types.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
|
||||||
|
|
||||||
|
@ -31,19 +31,20 @@ Boolean ChangedPC;
|
||||||
RSP_BLOCK CurrentBlock;
|
RSP_BLOCK CurrentBlock;
|
||||||
RSP_CODE RspCode;
|
RSP_CODE RspCode;
|
||||||
|
|
||||||
BYTE * pLastSecondary = NULL, * pLastPrimary = NULL;
|
BYTE *pLastSecondary = NULL, *pLastPrimary = NULL;
|
||||||
|
|
||||||
void BuildRecompilerCPU ( void ) {
|
void BuildRecompilerCPU(void)
|
||||||
RSP_Opcode[ 0] = Compile_SPECIAL;
|
{
|
||||||
RSP_Opcode[ 1] = Compile_REGIMM;
|
RSP_Opcode[0] = Compile_SPECIAL;
|
||||||
RSP_Opcode[ 2] = Compile_J;
|
RSP_Opcode[1] = Compile_REGIMM;
|
||||||
RSP_Opcode[ 3] = Compile_JAL;
|
RSP_Opcode[2] = Compile_J;
|
||||||
RSP_Opcode[ 4] = Compile_BEQ;
|
RSP_Opcode[3] = Compile_JAL;
|
||||||
RSP_Opcode[ 5] = Compile_BNE;
|
RSP_Opcode[4] = Compile_BEQ;
|
||||||
RSP_Opcode[ 6] = Compile_BLEZ;
|
RSP_Opcode[5] = Compile_BNE;
|
||||||
RSP_Opcode[ 7] = Compile_BGTZ;
|
RSP_Opcode[6] = Compile_BLEZ;
|
||||||
RSP_Opcode[ 8] = Compile_ADDI;
|
RSP_Opcode[7] = Compile_BGTZ;
|
||||||
RSP_Opcode[ 9] = Compile_ADDIU;
|
RSP_Opcode[8] = Compile_ADDI;
|
||||||
|
RSP_Opcode[9] = Compile_ADDIU;
|
||||||
RSP_Opcode[10] = Compile_SLTI;
|
RSP_Opcode[10] = Compile_SLTI;
|
||||||
RSP_Opcode[11] = Compile_SLTIU;
|
RSP_Opcode[11] = Compile_SLTIU;
|
||||||
RSP_Opcode[12] = Compile_ANDI;
|
RSP_Opcode[12] = Compile_ANDI;
|
||||||
|
@ -99,16 +100,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Opcode[62] = Compile_UnknownOpcode;
|
RSP_Opcode[62] = Compile_UnknownOpcode;
|
||||||
RSP_Opcode[63] = Compile_UnknownOpcode;
|
RSP_Opcode[63] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Special[ 0] = Compile_Special_SLL;
|
RSP_Special[0] = Compile_Special_SLL;
|
||||||
RSP_Special[ 1] = Compile_UnknownOpcode;
|
RSP_Special[1] = Compile_UnknownOpcode;
|
||||||
RSP_Special[ 2] = Compile_Special_SRL;
|
RSP_Special[2] = Compile_Special_SRL;
|
||||||
RSP_Special[ 3] = Compile_Special_SRA;
|
RSP_Special[3] = Compile_Special_SRA;
|
||||||
RSP_Special[ 4] = Compile_Special_SLLV;
|
RSP_Special[4] = Compile_Special_SLLV;
|
||||||
RSP_Special[ 5] = Compile_UnknownOpcode;
|
RSP_Special[5] = Compile_UnknownOpcode;
|
||||||
RSP_Special[ 6] = Compile_Special_SRLV;
|
RSP_Special[6] = Compile_Special_SRLV;
|
||||||
RSP_Special[ 7] = Compile_Special_SRAV;
|
RSP_Special[7] = Compile_Special_SRAV;
|
||||||
RSP_Special[ 8] = Compile_Special_JR;
|
RSP_Special[8] = Compile_Special_JR;
|
||||||
RSP_Special[ 9] = Compile_Special_JALR;
|
RSP_Special[9] = Compile_Special_JALR;
|
||||||
RSP_Special[10] = Compile_UnknownOpcode;
|
RSP_Special[10] = Compile_UnknownOpcode;
|
||||||
RSP_Special[11] = Compile_UnknownOpcode;
|
RSP_Special[11] = Compile_UnknownOpcode;
|
||||||
RSP_Special[12] = Compile_UnknownOpcode;
|
RSP_Special[12] = Compile_UnknownOpcode;
|
||||||
|
@ -164,16 +165,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Special[62] = Compile_UnknownOpcode;
|
RSP_Special[62] = Compile_UnknownOpcode;
|
||||||
RSP_Special[63] = Compile_UnknownOpcode;
|
RSP_Special[63] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_RegImm[ 0] = Compile_RegImm_BLTZ;
|
RSP_RegImm[0] = Compile_RegImm_BLTZ;
|
||||||
RSP_RegImm[ 1] = Compile_RegImm_BGEZ;
|
RSP_RegImm[1] = Compile_RegImm_BGEZ;
|
||||||
RSP_RegImm[ 2] = Compile_UnknownOpcode;
|
RSP_RegImm[2] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 3] = Compile_UnknownOpcode;
|
RSP_RegImm[3] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 4] = Compile_UnknownOpcode;
|
RSP_RegImm[4] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 5] = Compile_UnknownOpcode;
|
RSP_RegImm[5] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 6] = Compile_UnknownOpcode;
|
RSP_RegImm[6] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 7] = Compile_UnknownOpcode;
|
RSP_RegImm[7] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 8] = Compile_UnknownOpcode;
|
RSP_RegImm[8] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[ 9] = Compile_UnknownOpcode;
|
RSP_RegImm[9] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[10] = Compile_UnknownOpcode;
|
RSP_RegImm[10] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[11] = Compile_UnknownOpcode;
|
RSP_RegImm[11] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[12] = Compile_UnknownOpcode;
|
RSP_RegImm[12] = Compile_UnknownOpcode;
|
||||||
|
@ -197,16 +198,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_RegImm[30] = Compile_UnknownOpcode;
|
RSP_RegImm[30] = Compile_UnknownOpcode;
|
||||||
RSP_RegImm[31] = Compile_UnknownOpcode;
|
RSP_RegImm[31] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Cop0[ 0] = Compile_Cop0_MF;
|
RSP_Cop0[0] = Compile_Cop0_MF;
|
||||||
RSP_Cop0[ 1] = Compile_UnknownOpcode;
|
RSP_Cop0[1] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 2] = Compile_UnknownOpcode;
|
RSP_Cop0[2] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 3] = Compile_UnknownOpcode;
|
RSP_Cop0[3] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 4] = Compile_Cop0_MT;
|
RSP_Cop0[4] = Compile_Cop0_MT;
|
||||||
RSP_Cop0[ 5] = Compile_UnknownOpcode;
|
RSP_Cop0[5] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 6] = Compile_UnknownOpcode;
|
RSP_Cop0[6] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 7] = Compile_UnknownOpcode;
|
RSP_Cop0[7] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 8] = Compile_UnknownOpcode;
|
RSP_Cop0[8] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[ 9] = Compile_UnknownOpcode;
|
RSP_Cop0[9] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[10] = Compile_UnknownOpcode;
|
RSP_Cop0[10] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[11] = Compile_UnknownOpcode;
|
RSP_Cop0[11] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[12] = Compile_UnknownOpcode;
|
RSP_Cop0[12] = Compile_UnknownOpcode;
|
||||||
|
@ -230,16 +231,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Cop0[30] = Compile_UnknownOpcode;
|
RSP_Cop0[30] = Compile_UnknownOpcode;
|
||||||
RSP_Cop0[31] = Compile_UnknownOpcode;
|
RSP_Cop0[31] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Cop2[ 0] = Compile_Cop2_MF;
|
RSP_Cop2[0] = Compile_Cop2_MF;
|
||||||
RSP_Cop2[ 1] = Compile_UnknownOpcode;
|
RSP_Cop2[1] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[ 2] = Compile_Cop2_CF;
|
RSP_Cop2[2] = Compile_Cop2_CF;
|
||||||
RSP_Cop2[ 3] = Compile_UnknownOpcode;
|
RSP_Cop2[3] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[ 4] = Compile_Cop2_MT;
|
RSP_Cop2[4] = Compile_Cop2_MT;
|
||||||
RSP_Cop2[ 5] = Compile_UnknownOpcode;
|
RSP_Cop2[5] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[ 6] = Compile_Cop2_CT;
|
RSP_Cop2[6] = Compile_Cop2_CT;
|
||||||
RSP_Cop2[ 7] = Compile_UnknownOpcode;
|
RSP_Cop2[7] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[ 8] = Compile_UnknownOpcode;
|
RSP_Cop2[8] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[ 9] = Compile_UnknownOpcode;
|
RSP_Cop2[9] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[10] = Compile_UnknownOpcode;
|
RSP_Cop2[10] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[11] = Compile_UnknownOpcode;
|
RSP_Cop2[11] = Compile_UnknownOpcode;
|
||||||
RSP_Cop2[12] = Compile_UnknownOpcode;
|
RSP_Cop2[12] = Compile_UnknownOpcode;
|
||||||
|
@ -263,16 +264,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Cop2[30] = Compile_COP2_VECTOR;
|
RSP_Cop2[30] = Compile_COP2_VECTOR;
|
||||||
RSP_Cop2[31] = Compile_COP2_VECTOR;
|
RSP_Cop2[31] = Compile_COP2_VECTOR;
|
||||||
|
|
||||||
RSP_Vector[ 0] = Compile_Vector_VMULF;
|
RSP_Vector[0] = Compile_Vector_VMULF;
|
||||||
RSP_Vector[ 1] = Compile_Vector_VMULU;
|
RSP_Vector[1] = Compile_Vector_VMULU;
|
||||||
RSP_Vector[ 2] = Compile_UnknownOpcode;
|
RSP_Vector[2] = Compile_UnknownOpcode;
|
||||||
RSP_Vector[ 3] = Compile_UnknownOpcode;
|
RSP_Vector[3] = Compile_UnknownOpcode;
|
||||||
RSP_Vector[ 4] = Compile_Vector_VMUDL;
|
RSP_Vector[4] = Compile_Vector_VMUDL;
|
||||||
RSP_Vector[ 5] = Compile_Vector_VMUDM;
|
RSP_Vector[5] = Compile_Vector_VMUDM;
|
||||||
RSP_Vector[ 6] = Compile_Vector_VMUDN;
|
RSP_Vector[6] = Compile_Vector_VMUDN;
|
||||||
RSP_Vector[ 7] = Compile_Vector_VMUDH;
|
RSP_Vector[7] = Compile_Vector_VMUDH;
|
||||||
RSP_Vector[ 8] = Compile_Vector_VMACF;
|
RSP_Vector[8] = Compile_Vector_VMACF;
|
||||||
RSP_Vector[ 9] = Compile_Vector_VMACU;
|
RSP_Vector[9] = Compile_Vector_VMACU;
|
||||||
RSP_Vector[10] = Compile_UnknownOpcode;
|
RSP_Vector[10] = Compile_UnknownOpcode;
|
||||||
RSP_Vector[11] = Compile_Vector_VMACQ;
|
RSP_Vector[11] = Compile_Vector_VMACQ;
|
||||||
RSP_Vector[12] = Compile_Vector_VMADL;
|
RSP_Vector[12] = Compile_Vector_VMADL;
|
||||||
|
@ -328,16 +329,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Vector[62] = Compile_UnknownOpcode;
|
RSP_Vector[62] = Compile_UnknownOpcode;
|
||||||
RSP_Vector[63] = Compile_UnknownOpcode;
|
RSP_Vector[63] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Lc2[ 0] = Compile_Opcode_LBV;
|
RSP_Lc2[0] = Compile_Opcode_LBV;
|
||||||
RSP_Lc2[ 1] = Compile_Opcode_LSV;
|
RSP_Lc2[1] = Compile_Opcode_LSV;
|
||||||
RSP_Lc2[ 2] = Compile_Opcode_LLV;
|
RSP_Lc2[2] = Compile_Opcode_LLV;
|
||||||
RSP_Lc2[ 3] = Compile_Opcode_LDV;
|
RSP_Lc2[3] = Compile_Opcode_LDV;
|
||||||
RSP_Lc2[ 4] = Compile_Opcode_LQV;
|
RSP_Lc2[4] = Compile_Opcode_LQV;
|
||||||
RSP_Lc2[ 5] = Compile_Opcode_LRV;
|
RSP_Lc2[5] = Compile_Opcode_LRV;
|
||||||
RSP_Lc2[ 6] = Compile_Opcode_LPV;
|
RSP_Lc2[6] = Compile_Opcode_LPV;
|
||||||
RSP_Lc2[ 7] = Compile_Opcode_LUV;
|
RSP_Lc2[7] = Compile_Opcode_LUV;
|
||||||
RSP_Lc2[ 8] = Compile_Opcode_LHV;
|
RSP_Lc2[8] = Compile_Opcode_LHV;
|
||||||
RSP_Lc2[ 9] = Compile_Opcode_LFV;
|
RSP_Lc2[9] = Compile_Opcode_LFV;
|
||||||
RSP_Lc2[10] = Compile_UnknownOpcode;
|
RSP_Lc2[10] = Compile_UnknownOpcode;
|
||||||
RSP_Lc2[11] = Compile_Opcode_LTV;
|
RSP_Lc2[11] = Compile_Opcode_LTV;
|
||||||
RSP_Lc2[12] = Compile_UnknownOpcode;
|
RSP_Lc2[12] = Compile_UnknownOpcode;
|
||||||
|
@ -361,16 +362,16 @@ void BuildRecompilerCPU ( void ) {
|
||||||
RSP_Lc2[30] = Compile_UnknownOpcode;
|
RSP_Lc2[30] = Compile_UnknownOpcode;
|
||||||
RSP_Lc2[31] = Compile_UnknownOpcode;
|
RSP_Lc2[31] = Compile_UnknownOpcode;
|
||||||
|
|
||||||
RSP_Sc2[ 0] = Compile_Opcode_SBV;
|
RSP_Sc2[0] = Compile_Opcode_SBV;
|
||||||
RSP_Sc2[ 1] = Compile_Opcode_SSV;
|
RSP_Sc2[1] = Compile_Opcode_SSV;
|
||||||
RSP_Sc2[ 2] = Compile_Opcode_SLV;
|
RSP_Sc2[2] = Compile_Opcode_SLV;
|
||||||
RSP_Sc2[ 3] = Compile_Opcode_SDV;
|
RSP_Sc2[3] = Compile_Opcode_SDV;
|
||||||
RSP_Sc2[ 4] = Compile_Opcode_SQV;
|
RSP_Sc2[4] = Compile_Opcode_SQV;
|
||||||
RSP_Sc2[ 5] = Compile_Opcode_SRV;
|
RSP_Sc2[5] = Compile_Opcode_SRV;
|
||||||
RSP_Sc2[ 6] = Compile_Opcode_SPV;
|
RSP_Sc2[6] = Compile_Opcode_SPV;
|
||||||
RSP_Sc2[ 7] = Compile_Opcode_SUV;
|
RSP_Sc2[7] = Compile_Opcode_SUV;
|
||||||
RSP_Sc2[ 8] = Compile_Opcode_SHV;
|
RSP_Sc2[8] = Compile_Opcode_SHV;
|
||||||
RSP_Sc2[ 9] = Compile_Opcode_SFV;
|
RSP_Sc2[9] = Compile_Opcode_SFV;
|
||||||
RSP_Sc2[10] = Compile_Opcode_SWV;
|
RSP_Sc2[10] = Compile_Opcode_SWV;
|
||||||
RSP_Sc2[11] = Compile_Opcode_STV;
|
RSP_Sc2[11] = Compile_Opcode_STV;
|
||||||
RSP_Sc2[12] = Compile_UnknownOpcode;
|
RSP_Sc2[12] = Compile_UnknownOpcode;
|
||||||
|
@ -396,9 +397,9 @@ void BuildRecompilerCPU ( void ) {
|
||||||
|
|
||||||
BlockID = 0;
|
BlockID = 0;
|
||||||
ChangedPC = FALSE;
|
ChangedPC = FALSE;
|
||||||
#ifdef Log_x86Code
|
#ifdef Log_x86Code
|
||||||
Start_x86_Log();
|
Start_x86_Log();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -409,48 +410,64 @@ between branches labels, and actual branches, whichever
|
||||||
occurs first in code
|
occurs first in code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ReOrderInstructions(DWORD StartPC, DWORD EndPC) {
|
void ReOrderInstructions(DWORD StartPC, DWORD EndPC)
|
||||||
|
{
|
||||||
DWORD InstructionCount = EndPC - StartPC;
|
DWORD InstructionCount = EndPC - StartPC;
|
||||||
DWORD Count, ReorderedOps, CurrentPC;
|
DWORD Count, ReorderedOps, CurrentPC;
|
||||||
OPCODE PreviousOp, CurrentOp, RspOp;
|
OPCODE PreviousOp, CurrentOp, RspOp;
|
||||||
|
|
||||||
PreviousOp.Hex = *(DWORD*)(RSPInfo.IMEM + StartPC);
|
PreviousOp.Hex = *(DWORD *)(RSPInfo.IMEM + StartPC);
|
||||||
|
|
||||||
if (TRUE == IsOpcodeBranch(StartPC, PreviousOp)) {
|
if (TRUE == IsOpcodeBranch(StartPC, PreviousOp))
|
||||||
|
{
|
||||||
// The sub block ends here anyway
|
// The sub block ends here anyway
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsOpcodeNop(StartPC) && IsOpcodeNop(StartPC + 4) && IsOpcodeNop(StartPC + 8)) {
|
if (IsOpcodeNop(StartPC) && IsOpcodeNop(StartPC + 4) && IsOpcodeNop(StartPC + 8))
|
||||||
|
{
|
||||||
// Don't even bother
|
// Don't even bother
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU_Message("***** Doing reorder (%X to %X) *****", StartPC, EndPC);
|
CPU_Message("***** Doing reorder (%X to %X) *****", StartPC, EndPC);
|
||||||
|
|
||||||
if (InstructionCount < 0x0010) { return; }
|
if (InstructionCount < 0x0010)
|
||||||
if (InstructionCount > 0x0A00) { return; }
|
{
|
||||||
|
return;
|
||||||
CPU_Message(" Before:");
|
}
|
||||||
for (Count = StartPC; Count < EndPC; Count += 4) {
|
if (InstructionCount > 0x0A00)
|
||||||
RSP_LW_IMEM(Count, &RspOp.Hex);
|
{
|
||||||
CPU_Message(" %X %s",Count,RSPOpcodeName(RspOp.Hex,Count));
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Count = 0; Count < InstructionCount; Count += 4) {
|
CPU_Message(" Before:");
|
||||||
|
for (Count = StartPC; Count < EndPC; Count += 4)
|
||||||
|
{
|
||||||
|
RSP_LW_IMEM(Count, &RspOp.Hex);
|
||||||
|
CPU_Message(" %X %s", Count, RSPOpcodeName(RspOp.Hex, Count));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Count = 0; Count < InstructionCount; Count += 4)
|
||||||
|
{
|
||||||
CurrentPC = StartPC;
|
CurrentPC = StartPC;
|
||||||
PreviousOp.Hex = *(DWORD*)(RSPInfo.IMEM + CurrentPC);
|
PreviousOp.Hex = *(DWORD *)(RSPInfo.IMEM + CurrentPC);
|
||||||
ReorderedOps = 0;
|
ReorderedOps = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;)
|
||||||
|
{
|
||||||
CurrentPC += 4;
|
CurrentPC += 4;
|
||||||
if (CurrentPC >= EndPC) { break; }
|
if (CurrentPC >= EndPC)
|
||||||
CurrentOp.Hex = *(DWORD*)(RSPInfo.IMEM + CurrentPC);
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CurrentOp.Hex = *(DWORD *)(RSPInfo.IMEM + CurrentPC);
|
||||||
|
|
||||||
if (TRUE == CompareInstructions(CurrentPC, &PreviousOp, &CurrentOp)) {
|
if (TRUE == CompareInstructions(CurrentPC, &PreviousOp, &CurrentOp))
|
||||||
|
{
|
||||||
// Move current opcode up
|
// Move current opcode up
|
||||||
*(DWORD*)(RSPInfo.IMEM + CurrentPC - 4) = CurrentOp.Hex;
|
*(DWORD *)(RSPInfo.IMEM + CurrentPC - 4) = CurrentOp.Hex;
|
||||||
*(DWORD*)(RSPInfo.IMEM + CurrentPC) = PreviousOp.Hex;
|
*(DWORD *)(RSPInfo.IMEM + CurrentPC) = PreviousOp.Hex;
|
||||||
|
|
||||||
ReorderedOps++;
|
ReorderedOps++;
|
||||||
|
|
||||||
|
@ -458,48 +475,60 @@ void ReOrderInstructions(DWORD StartPC, DWORD EndPC) {
|
||||||
CPU_Message("Swapped %X and %X", CurrentPC - 4, CurrentPC);
|
CPU_Message("Swapped %X and %X", CurrentPC - 4, CurrentPC);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
PreviousOp.Hex = *(DWORD*)(RSPInfo.IMEM + CurrentPC);
|
PreviousOp.Hex = *(DWORD *)(RSPInfo.IMEM + CurrentPC);
|
||||||
|
|
||||||
if (IsOpcodeNop(CurrentPC) && IsOpcodeNop(CurrentPC + 4) && IsOpcodeNop(CurrentPC + 8)) {
|
if (IsOpcodeNop(CurrentPC) && IsOpcodeNop(CurrentPC + 4) && IsOpcodeNop(CurrentPC + 8))
|
||||||
|
{
|
||||||
CurrentPC = EndPC;
|
CurrentPC = EndPC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ReorderedOps == 0) {
|
if (ReorderedOps == 0)
|
||||||
|
{
|
||||||
Count = InstructionCount;
|
Count = InstructionCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU_Message(" After:");
|
CPU_Message(" After:");
|
||||||
for (Count = StartPC; Count < EndPC; Count += 4) {
|
for (Count = StartPC; Count < EndPC; Count += 4)
|
||||||
|
{
|
||||||
RSP_LW_IMEM(Count, &RspOp.Hex);
|
RSP_LW_IMEM(Count, &RspOp.Hex);
|
||||||
CPU_Message(" %X %s",Count,RSPOpcodeName(RspOp.Hex,Count));
|
CPU_Message(" %X %s", Count, RSPOpcodeName(RspOp.Hex, Count));
|
||||||
}
|
}
|
||||||
CPU_Message("");
|
CPU_Message("");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReOrderSubBlock(RSP_BLOCK * Block) {
|
void ReOrderSubBlock(RSP_BLOCK * Block)
|
||||||
|
{
|
||||||
DWORD end = 0x0ffc;
|
DWORD end = 0x0ffc;
|
||||||
DWORD count;
|
DWORD count;
|
||||||
|
|
||||||
if (!Compiler.bReOrdering) {
|
if (!Compiler.bReOrdering)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Block->CurrPC > 0xFF0) {
|
if (Block->CurrPC > 0xFF0)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the label or jump closest to us
|
// Find the label or jump closest to us
|
||||||
if (RspCode.LabelCount) {
|
if (RspCode.LabelCount)
|
||||||
for (count = 0; count < RspCode.LabelCount; count++) {
|
{
|
||||||
if (RspCode.BranchLabels[count] < end && RspCode.BranchLabels[count] > Block->CurrPC) {
|
for (count = 0; count < RspCode.LabelCount; count++)
|
||||||
|
{
|
||||||
|
if (RspCode.BranchLabels[count] < end && RspCode.BranchLabels[count] > Block->CurrPC)
|
||||||
|
{
|
||||||
end = RspCode.BranchLabels[count];
|
end = RspCode.BranchLabels[count];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (RspCode.BranchCount) {
|
if (RspCode.BranchCount)
|
||||||
for (count = 0; count < RspCode.BranchCount; count++) {
|
{
|
||||||
if (RspCode.BranchLocations[count] < end && RspCode.BranchLocations[count] > Block->CurrPC) {
|
for (count = 0; count < RspCode.BranchCount; count++)
|
||||||
|
{
|
||||||
|
if (RspCode.BranchLocations[count] < end && RspCode.BranchLocations[count] > Block->CurrPC)
|
||||||
|
{
|
||||||
end = RspCode.BranchLocations[count];
|
end = RspCode.BranchLocations[count];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -515,13 +544,15 @@ This needs to be called on a sub-block basis, like
|
||||||
after every time we hit a branch and delay slot
|
after every time we hit a branch and delay slot
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void DetectGPRConstants(RSP_CODE * code) {
|
void DetectGPRConstants(RSP_CODE * code)
|
||||||
|
{
|
||||||
DWORD Count, Constant = 0;
|
DWORD Count, Constant = 0;
|
||||||
|
|
||||||
memset(&code->bIsRegConst, 0, sizeof(Boolean) * 0x20);
|
memset(&code->bIsRegConst, 0, sizeof(Boolean) * 0x20);
|
||||||
memset(&code->MipsRegConst, 0, sizeof(DWORD) * 0x20);
|
memset(&code->MipsRegConst, 0, sizeof(DWORD) * 0x20);
|
||||||
|
|
||||||
if (!Compiler.bGPRConstants) {
|
if (!Compiler.bGPRConstants)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CPU_Message("***** Detecting constants *****");
|
CPU_Message("***** Detecting constants *****");
|
||||||
|
@ -531,8 +562,10 @@ void DetectGPRConstants(RSP_CODE * code) {
|
||||||
code->MipsRegConst[0] = 0;
|
code->MipsRegConst[0] = 0;
|
||||||
|
|
||||||
// Do your global search for them
|
// Do your global search for them
|
||||||
for (Count = 1; Count < 31; Count++) {
|
for (Count = 1; Count < 31; Count++)
|
||||||
if (IsRegisterConstant(Count, &Constant) == TRUE) {
|
{
|
||||||
|
if (IsRegisterConstant(Count, &Constant) == TRUE)
|
||||||
|
{
|
||||||
CPU_Message("Global: %s is a constant of: %08X", GPR_Name(Count), Constant);
|
CPU_Message("Global: %s is a constant of: %08X", GPR_Name(Count), Constant);
|
||||||
code->bIsRegConst[Count] = TRUE;
|
code->bIsRegConst[Count] = TRUE;
|
||||||
code->MipsRegConst[Count] = Constant;
|
code->MipsRegConst[Count] = Constant;
|
||||||
|
@ -549,22 +582,28 @@ taken branches like alignment
|
||||||
2: Clears all the x86 code, jump tables etc.
|
2: Clears all the x86 code, jump tables etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void CompilerToggleBuffer(void) {
|
void CompilerToggleBuffer(void)
|
||||||
if (dwBuffer == MainBuffer) {
|
{
|
||||||
|
if (dwBuffer == MainBuffer)
|
||||||
|
{
|
||||||
dwBuffer = SecondaryBuffer;
|
dwBuffer = SecondaryBuffer;
|
||||||
pLastPrimary = RecompPos;
|
pLastPrimary = RecompPos;
|
||||||
|
|
||||||
if (pLastSecondary == NULL) {
|
if (pLastSecondary == NULL)
|
||||||
|
{
|
||||||
pLastSecondary = RecompCodeSecondary;
|
pLastSecondary = RecompCodeSecondary;
|
||||||
}
|
}
|
||||||
|
|
||||||
RecompPos = pLastSecondary;
|
RecompPos = pLastSecondary;
|
||||||
CPU_Message(" (Secondary buffer active 0x%08X)", pLastSecondary);
|
CPU_Message(" (Secondary buffer active 0x%08X)", pLastSecondary);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
dwBuffer = MainBuffer;
|
dwBuffer = MainBuffer;
|
||||||
pLastSecondary = RecompPos;
|
pLastSecondary = RecompPos;
|
||||||
|
|
||||||
if (pLastPrimary == NULL) {
|
if (pLastPrimary == NULL)
|
||||||
|
{
|
||||||
pLastPrimary = RecompCode;
|
pLastPrimary = RecompCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,13 +612,14 @@ void CompilerToggleBuffer(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearAllx86Code (void) {
|
void ClearAllx86Code(void)
|
||||||
|
{
|
||||||
extern DWORD NoOfMaps, MapsCRC[32];
|
extern DWORD NoOfMaps, MapsCRC[32];
|
||||||
extern BYTE *JumpTables;
|
extern BYTE * JumpTables;
|
||||||
|
|
||||||
memset(&MapsCRC, 0, sizeof(DWORD) * 0x20);
|
memset(&MapsCRC, 0, sizeof(DWORD) * 0x20);
|
||||||
NoOfMaps = 0;
|
NoOfMaps = 0;
|
||||||
memset(JumpTables,0,0x1000*32);
|
memset(JumpTables, 0, 0x1000 * 32);
|
||||||
|
|
||||||
RecompPos = RecompCode;
|
RecompPos = RecompCode;
|
||||||
|
|
||||||
|
@ -593,23 +633,27 @@ Description:
|
||||||
Resolves all the collected branches, x86 style
|
Resolves all the collected branches, x86 style
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void LinkBranches(RSP_BLOCK * Block) {
|
void LinkBranches(RSP_BLOCK * Block)
|
||||||
|
{
|
||||||
DWORD OrigPrgCount = *PrgCount;
|
DWORD OrigPrgCount = *PrgCount;
|
||||||
DWORD Count, Target;
|
DWORD Count, Target;
|
||||||
DWORD * JumpWord;
|
DWORD * JumpWord;
|
||||||
BYTE * X86Code;
|
BYTE * X86Code;
|
||||||
RSP_BLOCK Save;
|
RSP_BLOCK Save;
|
||||||
|
|
||||||
if (!CurrentBlock.ResolveCount) {
|
if (!CurrentBlock.ResolveCount)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CPU_Message("***** Linking branches (%i) *****", CurrentBlock.ResolveCount);
|
CPU_Message("***** Linking branches (%i) *****", CurrentBlock.ResolveCount);
|
||||||
|
|
||||||
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 = (BYTE *)*(JumpTable + (Target >> 2));
|
||||||
|
|
||||||
if (!X86Code) {
|
if (!X86Code)
|
||||||
|
{
|
||||||
*PrgCount = Target;
|
*PrgCount = Target;
|
||||||
CPU_Message("");
|
CPU_Message("");
|
||||||
CPU_Message("===== (Generate code: %04X) =====", Target);
|
CPU_Message("===== (Generate code: %04X) =====", Target);
|
||||||
|
@ -626,7 +670,7 @@ void LinkBranches(RSP_BLOCK * Block) {
|
||||||
}
|
}
|
||||||
|
|
||||||
JumpWord = CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
JumpWord = CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
||||||
x86_SetBranch32b(JumpWord, (DWORD*)X86Code);
|
x86_SetBranch32b(JumpWord, (DWORD *)X86Code);
|
||||||
|
|
||||||
CPU_Message("Linked RSP branch from x86: %08X, to RSP: %X / x86: %08X",
|
CPU_Message("Linked RSP branch from x86: %08X, to RSP: %X / x86: %08X",
|
||||||
JumpWord, Target, X86Code);
|
JumpWord, Target, X86Code);
|
||||||
|
@ -644,7 +688,8 @@ sections as well as set the jump table to points
|
||||||
within a block that are safe.
|
within a block that are safe.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void BuildBranchLabels(void) {
|
void BuildBranchLabels(void)
|
||||||
|
{
|
||||||
OPCODE RspOp;
|
OPCODE RspOp;
|
||||||
DWORD i, Dest;
|
DWORD i, Dest;
|
||||||
|
|
||||||
|
@ -652,23 +697,30 @@ void BuildBranchLabels(void) {
|
||||||
CPU_Message("***** Building branch labels *****");
|
CPU_Message("***** Building branch labels *****");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < 0x1000; i += 4) {
|
for (i = 0; i < 0x1000; i += 4)
|
||||||
RspOp.Hex = *(DWORD*)(RSPInfo.IMEM + i);
|
{
|
||||||
|
RspOp.Hex = *(DWORD *)(RSPInfo.IMEM + i);
|
||||||
|
|
||||||
if (TRUE == IsOpcodeBranch(i, RspOp)) {
|
if (TRUE == IsOpcodeBranch(i, RspOp))
|
||||||
if (RspCode.LabelCount >= (sizeof(RspCode.BranchLabels) / sizeof(RspCode.BranchLabels[0])) - 1) {
|
{
|
||||||
|
if (RspCode.LabelCount >= (sizeof(RspCode.BranchLabels) / sizeof(RspCode.BranchLabels[0])) - 1)
|
||||||
|
{
|
||||||
CompilerWarning("Out of space for branch labels");
|
CompilerWarning("Out of space for branch labels");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RspCode.BranchCount >= (sizeof(RspCode.BranchLocations) / sizeof(RspCode.BranchLocations[0])) - 1) {
|
if (RspCode.BranchCount >= (sizeof(RspCode.BranchLocations) / sizeof(RspCode.BranchLocations[0])) - 1)
|
||||||
|
{
|
||||||
CompilerWarning("Out of space for branch locations");
|
CompilerWarning("Out of space for branch locations");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RspCode.BranchLocations[RspCode.BranchCount++] = i;
|
RspCode.BranchLocations[RspCode.BranchCount++] = i;
|
||||||
if (RspOp.op == RSP_SPECIAL) {
|
if (RspOp.op == RSP_SPECIAL)
|
||||||
|
{
|
||||||
// Register jump not predictable
|
// Register jump not predictable
|
||||||
} else if (RspOp.op == RSP_J || RspOp.op == RSP_JAL) {
|
}
|
||||||
|
else if (RspOp.op == RSP_J || RspOp.op == RSP_JAL)
|
||||||
|
{
|
||||||
// For JAL its a sub-block for returns
|
// For JAL its a sub-block for returns
|
||||||
Dest = (RspOp.target << 2) & 0xFFC;
|
Dest = (RspOp.target << 2) & 0xFFC;
|
||||||
RspCode.BranchLabels[RspCode.LabelCount] = Dest;
|
RspCode.BranchLabels[RspCode.LabelCount] = Dest;
|
||||||
|
@ -676,7 +728,9 @@ void BuildBranchLabels(void) {
|
||||||
#ifdef BUILD_BRANCHLABELS_VERBOSE
|
#ifdef BUILD_BRANCHLABELS_VERBOSE
|
||||||
CPU_Message("[%02i] Added branch at %X to %X", RspCode.LabelCount, i, Dest);
|
CPU_Message("[%02i] Added branch at %X to %X", RspCode.LabelCount, i, Dest);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
Dest = (i + ((short)RspOp.offset << 2) + 4) & 0xFFC;
|
Dest = (i + ((short)RspOp.offset << 2) + 4) & 0xFFC;
|
||||||
RspCode.BranchLabels[RspCode.LabelCount] = Dest;
|
RspCode.BranchLabels[RspCode.LabelCount] = Dest;
|
||||||
RspCode.LabelCount += 1;
|
RspCode.LabelCount += 1;
|
||||||
|
@ -697,19 +751,23 @@ Boolean IsJumpLabel(DWORD PC)
|
||||||
{
|
{
|
||||||
DWORD Count;
|
DWORD Count;
|
||||||
|
|
||||||
if (!RspCode.LabelCount) {
|
if (!RspCode.LabelCount)
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Count = 0; Count < RspCode.LabelCount; Count++) {
|
for (Count = 0; Count < RspCode.LabelCount; Count++)
|
||||||
if (PC == RspCode.BranchLabels[Count]) {
|
{
|
||||||
|
if (PC == RspCode.BranchLabels[Count])
|
||||||
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompilerLinkBlocks(void) {
|
void CompilerLinkBlocks(void)
|
||||||
|
{
|
||||||
BYTE * KnownCode = (BYTE *)*(JumpTable + (CompilePC >> 2));
|
BYTE * KnownCode = (BYTE *)*(JumpTable + (CompilePC >> 2));
|
||||||
|
|
||||||
CPU_Message("***** Linking block to X86: %08X *****", KnownCode);
|
CPU_Message("***** Linking block to X86: %08X *****", KnownCode);
|
||||||
|
@ -738,19 +796,21 @@ void CompilerRSPBlock(void)
|
||||||
register size_t Count;
|
register size_t Count;
|
||||||
const size_t Padding = (8 - (X86BaseAddress & 7)) & 7;
|
const size_t Padding = (8 - (X86BaseAddress & 7)) & 7;
|
||||||
|
|
||||||
for (Count = 0; Count < Padding; Count++) {
|
for (Count = 0; Count < Padding; Count++)
|
||||||
|
{
|
||||||
CPU_Message("%08X: nop", RecompPos);
|
CPU_Message("%08X: nop", RecompPos);
|
||||||
*(RecompPos++) = 0x90;
|
*(RecompPos++) = 0x90;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU_Message("====== Block %d ======", BlockID++);
|
CPU_Message("====== Block %d ======", BlockID++);
|
||||||
CPU_Message("x86 code at: %X",RecompPos);
|
CPU_Message("x86 code at: %X", RecompPos);
|
||||||
CPU_Message("Jump table: %X",Table );
|
CPU_Message("Jump table: %X", Table);
|
||||||
CPU_Message("Start of block: %X",CurrentBlock.StartPC );
|
CPU_Message("Start of block: %X", CurrentBlock.StartPC);
|
||||||
CPU_Message("====== Recompiled code ======");
|
CPU_Message("====== Recompiled code ======");
|
||||||
|
|
||||||
if (Compiler.bReOrdering == TRUE) {
|
if (Compiler.bReOrdering == TRUE)
|
||||||
|
{
|
||||||
memcpy(IMEM_SAVE, RSPInfo.IMEM, 0x1000);
|
memcpy(IMEM_SAVE, RSPInfo.IMEM, 0x1000);
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&CurrentBlock);
|
||||||
}
|
}
|
||||||
|
@ -758,14 +818,17 @@ void CompilerRSPBlock(void)
|
||||||
// This is for the block about to be compiled
|
// This is for the block about to be compiled
|
||||||
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
|
|
||||||
// Reordering is setup to allow us to have loop labels
|
// Reordering is setup to allow us to have loop labels
|
||||||
// so here we see if this is one and put it in the jump table
|
// so here we see if this is one and put it in the jump table
|
||||||
|
|
||||||
if (NextInstruction == NORMAL && IsJumpLabel(CompilePC)) {
|
if (NextInstruction == NORMAL && IsJumpLabel(CompilePC))
|
||||||
|
{
|
||||||
// Jumps come around twice
|
// Jumps come around twice
|
||||||
if (NULL == *(JumpTable + (CompilePC >> 2))) {
|
if (NULL == *(JumpTable + (CompilePC >> 2)))
|
||||||
|
{
|
||||||
CPU_Message("***** Adding jump table entry for PC: %04X at X86: %08X *****", CompilePC, RecompPos);
|
CPU_Message("***** Adding jump table entry for PC: %04X at X86: %08X *****", CompilePC, RecompPos);
|
||||||
CPU_Message("");
|
CPU_Message("");
|
||||||
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
||||||
|
@ -773,43 +836,52 @@ void CompilerRSPBlock(void)
|
||||||
// Reorder from here to next label or branch
|
// Reorder from here to next label or branch
|
||||||
CurrentBlock.CurrPC = CompilePC;
|
CurrentBlock.CurrPC = CompilePC;
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&CurrentBlock);
|
||||||
} else if (NextInstruction != DELAY_SLOT_DONE) {
|
}
|
||||||
|
else if (NextInstruction != DELAY_SLOT_DONE)
|
||||||
|
{
|
||||||
|
|
||||||
// We could link the blocks here, but performance-wise it might be better to just let it run
|
// We could link the blocks here, but performance-wise it might be better to just let it run
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Compiler.bSections == TRUE) {
|
if (Compiler.bSections == TRUE)
|
||||||
if (TRUE == RSP_DoSections()) {
|
{
|
||||||
|
if (TRUE == RSP_DoSections())
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef X86_RECOMP_VERBOSE
|
#ifdef X86_RECOMP_VERBOSE
|
||||||
if (FALSE == IsOpcodeNop(CompilePC)) {
|
if (FALSE == IsOpcodeNop(CompilePC))
|
||||||
|
{
|
||||||
CPU_Message("X86 Address: %08X", RecompPos);
|
CPU_Message("X86 Address: %08X", RecompPos);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RSP_LW_IMEM(CompilePC, &RSPOpC.Hex);
|
RSP_LW_IMEM(CompilePC, &RSPOpC.Hex);
|
||||||
|
|
||||||
if (LogRDP && NextInstruction != DELAY_SLOT_DONE){
|
if (LogRDP && NextInstruction != DELAY_SLOT_DONE)
|
||||||
|
{
|
||||||
char str[40];
|
char str[40];
|
||||||
sprintf(str,"%X",CompilePC);
|
sprintf(str, "%X", CompilePC);
|
||||||
PushImm32(str,CompilePC);
|
PushImm32(str, CompilePC);
|
||||||
Call_Direct(RDP_LogLoc,"RDP_LogLoc");
|
Call_Direct(RDP_LogLoc, "RDP_LogLoc");
|
||||||
AddConstToX86Reg(x86_ESP, 4);
|
AddConstToX86Reg(x86_ESP, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RSPOpC.Hex == 0xFFFFFFFF) {
|
if (RSPOpC.Hex == 0xFFFFFFFF)
|
||||||
|
{
|
||||||
// I think this pops up an unknown OP dialog
|
// I think this pops up an unknown OP dialog
|
||||||
// NextInstruction = FINISH_BLOCK;
|
// NextInstruction = FINISH_BLOCK;
|
||||||
} else {
|
}
|
||||||
RSP_Opcode[ RSPOpC.op ]();
|
else
|
||||||
|
{
|
||||||
|
RSP_Opcode[RSPOpC.op]();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (NextInstruction) {
|
switch (NextInstruction)
|
||||||
|
{
|
||||||
case NORMAL:
|
case NORMAL:
|
||||||
CompilePC += 4;
|
CompilePC += 4;
|
||||||
break;
|
break;
|
||||||
|
@ -828,9 +900,12 @@ void CompilerRSPBlock(void)
|
||||||
case FINISH_SUB_BLOCK:
|
case FINISH_SUB_BLOCK:
|
||||||
NextInstruction = NORMAL;
|
NextInstruction = NORMAL;
|
||||||
CompilePC += 8;
|
CompilePC += 8;
|
||||||
if (CompilePC >= 0x1000) {
|
if (CompilePC >= 0x1000)
|
||||||
|
{
|
||||||
NextInstruction = FINISH_BLOCK;
|
NextInstruction = FINISH_BLOCK;
|
||||||
} else if (NULL == *(JumpTable + (CompilePC >> 2))) {
|
}
|
||||||
|
else if (NULL == *(JumpTable + (CompilePC >> 2)))
|
||||||
|
{
|
||||||
// This is for the new block being compiled now
|
// This is for the new block being compiled now
|
||||||
CPU_Message("***** Continuing static SubBlock (jump table entry added for PC: %04X at X86: %08X) *****", CompilePC, RecompPos);
|
CPU_Message("***** Continuing static SubBlock (jump table entry added for PC: %04X at X86: %08X) *****", CompilePC, RecompPos);
|
||||||
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
||||||
|
@ -838,27 +913,31 @@ void CompilerRSPBlock(void)
|
||||||
CurrentBlock.CurrPC = CompilePC;
|
CurrentBlock.CurrPC = CompilePC;
|
||||||
// Reorder from after delay to next label or branch
|
// Reorder from after delay to next label or branch
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&CurrentBlock);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
CompilerLinkBlocks();
|
CompilerLinkBlocks();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FINISH_BLOCK: break;
|
case FINISH_BLOCK: break;
|
||||||
default:
|
default:
|
||||||
DisplayError("RSP main loop\n\nWTF NextInstruction = %d",NextInstruction);
|
DisplayError("RSP main loop\n\nWTF NextInstruction = %d", NextInstruction);
|
||||||
CompilePC += 4;
|
CompilePC += 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (NextInstruction != FINISH_BLOCK && (CompilePC < 0x1000 || NextInstruction == DELAY_SLOT));
|
} while (NextInstruction != FINISH_BLOCK && (CompilePC < 0x1000 || NextInstruction == DELAY_SLOT));
|
||||||
CPU_Message("===== End of recompiled code =====");
|
CPU_Message("===== End of recompiled code =====");
|
||||||
|
|
||||||
if (Compiler.bReOrdering == TRUE) {
|
if (Compiler.bReOrdering == TRUE)
|
||||||
|
{
|
||||||
memcpy(RSPInfo.IMEM, IMEM_SAVE, 0x1000);
|
memcpy(RSPInfo.IMEM, IMEM_SAVE, 0x1000);
|
||||||
}
|
}
|
||||||
free(IMEM_SAVE);
|
free(IMEM_SAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD RunRecompilerCPU ( DWORD Cycles ) {
|
DWORD RunRecompilerCPU(DWORD Cycles)
|
||||||
|
{
|
||||||
BYTE * Block;
|
BYTE * Block;
|
||||||
|
|
||||||
RSP_Running = TRUE;
|
RSP_Running = TRUE;
|
||||||
|
@ -868,18 +947,23 @@ DWORD RunRecompilerCPU ( DWORD Cycles ) {
|
||||||
{
|
{
|
||||||
Block = (BYTE *)*(JumpTable + (*PrgCount >> 2));
|
Block = (BYTE *)*(JumpTable + (*PrgCount >> 2));
|
||||||
|
|
||||||
if (Block == NULL) {
|
if (Block == NULL)
|
||||||
if (Profiling && !IndvidualBlock) {
|
{
|
||||||
|
if (Profiling && !IndvidualBlock)
|
||||||
|
{
|
||||||
StartTimer((DWORD)Timer_Compiling);
|
StartTimer((DWORD)Timer_Compiling);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&RspCode, 0, sizeof(RspCode));
|
memset(&RspCode, 0, sizeof(RspCode));
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
__try {
|
__try
|
||||||
|
{
|
||||||
BuildBranchLabels();
|
BuildBranchLabels();
|
||||||
DetectGPRConstants(&RspCode);
|
DetectGPRConstants(&RspCode);
|
||||||
CompilerRSPBlock();
|
CompilerRSPBlock();
|
||||||
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
}
|
||||||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
DisplayError("Error CompilePC = %08X", CompilePC);
|
DisplayError("Error CompilePC = %08X", CompilePC);
|
||||||
ClearAllx86Code();
|
ClearAllx86Code();
|
||||||
continue;
|
continue;
|
||||||
|
@ -897,12 +981,14 @@ DWORD RunRecompilerCPU ( DWORD Cycles ) {
|
||||||
// that go out of it, let's rock
|
// that go out of it, let's rock
|
||||||
|
|
||||||
LinkBranches(&CurrentBlock);
|
LinkBranches(&CurrentBlock);
|
||||||
if (Profiling && !IndvidualBlock) {
|
if (Profiling && !IndvidualBlock)
|
||||||
|
{
|
||||||
StopTimer();
|
StopTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Profiling && IndvidualBlock) {
|
if (Profiling && IndvidualBlock)
|
||||||
|
{
|
||||||
StartTimer(*PrgCount);
|
StartTimer(*PrgCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,7 +1001,8 @@ DWORD RunRecompilerCPU ( DWORD Cycles ) {
|
||||||
#else
|
#else
|
||||||
DebugBreak();
|
DebugBreak();
|
||||||
#endif
|
#endif
|
||||||
if (Profiling && IndvidualBlock) {
|
if (Profiling && IndvidualBlock)
|
||||||
|
{
|
||||||
StopTimer();
|
StopTimer();
|
||||||
}
|
}
|
||||||
if (RSP_NextInstruction == SINGLE_STEP)
|
if (RSP_NextInstruction == SINGLE_STEP)
|
||||||
|
@ -924,7 +1011,8 @@ DWORD RunRecompilerCPU ( DWORD Cycles ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsMmxEnabled == TRUE) {
|
if (IsMmxEnabled == TRUE)
|
||||||
|
{
|
||||||
#if defined(_M_IX86) && defined(_MSC_VER)
|
#if defined(_M_IX86) && defined(_MSC_VER)
|
||||||
_asm emms
|
_asm emms
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
||||||
extern Boolean ChangedPC;
|
extern Boolean ChangedPC;
|
||||||
|
|
||||||
#define CompilerWarning if (ShowErrors) DisplayError
|
#define CompilerWarning \
|
||||||
|
if (ShowErrors) DisplayError
|
||||||
|
|
||||||
#define High16BitAccum 1
|
#define High16BitAccum 1
|
||||||
#define Middle16BitAccum 2
|
#define Middle16BitAccum 2
|
||||||
#define Low16BitAccum 4
|
#define Low16BitAccum 4
|
||||||
#define EntireAccum (Low16BitAccum|Middle16BitAccum|High16BitAccum)
|
#define EntireAccum (Low16BitAccum | Middle16BitAccum | High16BitAccum)
|
||||||
|
|
||||||
Boolean WriteToAccum(int Location, int PC);
|
Boolean WriteToAccum(int Location, int PC);
|
||||||
Boolean WriteToVectorDest(DWORD DestReg, int PC);
|
Boolean WriteToVectorDest(DWORD DestReg, int PC);
|
||||||
|
@ -29,17 +30,19 @@ void RSP_MultiElement2Mmx(int MmxReg1, int MmxReg2);
|
||||||
#define MainBuffer 0
|
#define MainBuffer 0
|
||||||
#define SecondaryBuffer 1
|
#define SecondaryBuffer 1
|
||||||
|
|
||||||
DWORD RunRecompilerCPU ( DWORD Cycles );
|
DWORD RunRecompilerCPU(DWORD Cycles);
|
||||||
void BuildRecompilerCPU ( void );
|
void BuildRecompilerCPU(void);
|
||||||
|
|
||||||
void CompilerRSPBlock ( void );
|
void CompilerRSPBlock(void);
|
||||||
void CompilerToggleBuffer (void);
|
void CompilerToggleBuffer(void);
|
||||||
Boolean RSP_DoSections(void);
|
Boolean RSP_DoSections(void);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
DWORD StartPC, CurrPC; // Block start
|
DWORD StartPC, CurrPC; // Block start
|
||||||
|
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
DWORD TargetPC; // Target for this unknown branch
|
DWORD TargetPC; // Target for this unknown branch
|
||||||
DWORD * X86JumpLoc; // Our x86 DWORD to fill
|
DWORD * X86JumpLoc; // Our x86 DWORD to fill
|
||||||
} BranchesToResolve[200]; // Branches inside or outside block
|
} BranchesToResolve[200]; // Branches inside or outside block
|
||||||
|
@ -49,7 +52,8 @@ typedef struct {
|
||||||
|
|
||||||
extern RSP_BLOCK CurrentBlock;
|
extern RSP_BLOCK CurrentBlock;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
Boolean bIsRegConst[32]; // Boolean toggle for constant
|
Boolean bIsRegConst[32]; // Boolean toggle for constant
|
||||||
DWORD MipsRegConst[32]; // Value of register 32-bit
|
DWORD MipsRegConst[32]; // Value of register 32-bit
|
||||||
DWORD BranchLabels[250];
|
DWORD BranchLabels[250];
|
||||||
|
@ -63,7 +67,8 @@ extern RSP_CODE RspCode;
|
||||||
#define IsRegConst(i) (RspCode.bIsRegConst[i])
|
#define IsRegConst(i) (RspCode.bIsRegConst[i])
|
||||||
#define MipsRegConst(i) (RspCode.MipsRegConst[i])
|
#define MipsRegConst(i) (RspCode.MipsRegConst[i])
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
Boolean mmx, mmx2, sse; // CPU specs and compiling
|
Boolean mmx, mmx2, sse; // CPU specs and compiling
|
||||||
Boolean bFlags; // RSP flag analysis
|
Boolean bFlags; // RSP flag analysis
|
||||||
Boolean bReOrdering; // Instruction reordering
|
Boolean bReOrdering; // Instruction reordering
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,149 +1,149 @@
|
||||||
// Opcode functions
|
// Opcode functions
|
||||||
|
|
||||||
void Compile_SPECIAL ( void );
|
void Compile_SPECIAL(void);
|
||||||
void Compile_REGIMM ( void );
|
void Compile_REGIMM(void);
|
||||||
void Compile_J ( void );
|
void Compile_J(void);
|
||||||
void Compile_JAL ( void );
|
void Compile_JAL(void);
|
||||||
void Compile_BEQ ( void );
|
void Compile_BEQ(void);
|
||||||
void Compile_BNE ( void );
|
void Compile_BNE(void);
|
||||||
void Compile_BLEZ ( void );
|
void Compile_BLEZ(void);
|
||||||
void Compile_BGTZ ( void );
|
void Compile_BGTZ(void);
|
||||||
void Compile_ADDI ( void );
|
void Compile_ADDI(void);
|
||||||
void Compile_ADDIU ( void );
|
void Compile_ADDIU(void);
|
||||||
void Compile_SLTI ( void );
|
void Compile_SLTI(void);
|
||||||
void Compile_SLTIU ( void );
|
void Compile_SLTIU(void);
|
||||||
void Compile_ANDI ( void );
|
void Compile_ANDI(void);
|
||||||
void Compile_ORI ( void );
|
void Compile_ORI(void);
|
||||||
void Compile_XORI ( void );
|
void Compile_XORI(void);
|
||||||
void Compile_LUI ( void );
|
void Compile_LUI(void);
|
||||||
void Compile_COP0 ( void );
|
void Compile_COP0(void);
|
||||||
void Compile_COP2 ( void );
|
void Compile_COP2(void);
|
||||||
void Compile_LB ( void );
|
void Compile_LB(void);
|
||||||
void Compile_LH ( void );
|
void Compile_LH(void);
|
||||||
void Compile_LW ( void );
|
void Compile_LW(void);
|
||||||
void Compile_LBU ( void );
|
void Compile_LBU(void);
|
||||||
void Compile_LHU ( void );
|
void Compile_LHU(void);
|
||||||
void Compile_SB ( void );
|
void Compile_SB(void);
|
||||||
void Compile_SH ( void );
|
void Compile_SH(void);
|
||||||
void Compile_SW ( void );
|
void Compile_SW(void);
|
||||||
void Compile_LC2 ( void );
|
void Compile_LC2(void);
|
||||||
void Compile_SC2 ( void );
|
void Compile_SC2(void);
|
||||||
|
|
||||||
// R4300i Opcodes: Special
|
// R4300i Opcodes: Special
|
||||||
|
|
||||||
void Compile_Special_SLL ( void );
|
void Compile_Special_SLL(void);
|
||||||
void Compile_Special_SRL ( void );
|
void Compile_Special_SRL(void);
|
||||||
void Compile_Special_SRA ( void );
|
void Compile_Special_SRA(void);
|
||||||
void Compile_Special_SLLV ( void );
|
void Compile_Special_SLLV(void);
|
||||||
void Compile_Special_SRLV ( void );
|
void Compile_Special_SRLV(void);
|
||||||
void Compile_Special_SRAV ( void );
|
void Compile_Special_SRAV(void);
|
||||||
void Compile_Special_JR ( void );
|
void Compile_Special_JR(void);
|
||||||
void Compile_Special_JALR ( void );
|
void Compile_Special_JALR(void);
|
||||||
void Compile_Special_BREAK ( void );
|
void Compile_Special_BREAK(void);
|
||||||
void Compile_Special_ADD ( void );
|
void Compile_Special_ADD(void);
|
||||||
void Compile_Special_ADDU ( void );
|
void Compile_Special_ADDU(void);
|
||||||
void Compile_Special_SUB ( void );
|
void Compile_Special_SUB(void);
|
||||||
void Compile_Special_SUBU ( void );
|
void Compile_Special_SUBU(void);
|
||||||
void Compile_Special_AND ( void );
|
void Compile_Special_AND(void);
|
||||||
void Compile_Special_OR ( void );
|
void Compile_Special_OR(void);
|
||||||
void Compile_Special_XOR ( void );
|
void Compile_Special_XOR(void);
|
||||||
void Compile_Special_NOR ( void );
|
void Compile_Special_NOR(void);
|
||||||
void Compile_Special_SLT ( void );
|
void Compile_Special_SLT(void);
|
||||||
void Compile_Special_SLTU ( void );
|
void Compile_Special_SLTU(void);
|
||||||
|
|
||||||
// R4300i Opcodes: RegImm
|
// R4300i Opcodes: RegImm
|
||||||
|
|
||||||
void Compile_RegImm_BLTZ ( void );
|
void Compile_RegImm_BLTZ(void);
|
||||||
void Compile_RegImm_BGEZ ( void );
|
void Compile_RegImm_BGEZ(void);
|
||||||
void Compile_RegImm_BLTZAL ( void );
|
void Compile_RegImm_BLTZAL(void);
|
||||||
void Compile_RegImm_BGEZAL ( void );
|
void Compile_RegImm_BGEZAL(void);
|
||||||
|
|
||||||
// COP0 functions
|
// COP0 functions
|
||||||
|
|
||||||
void Compile_Cop0_MF ( void );
|
void Compile_Cop0_MF(void);
|
||||||
void Compile_Cop0_MT ( void );
|
void Compile_Cop0_MT(void);
|
||||||
|
|
||||||
// COP2 functions
|
// COP2 functions
|
||||||
|
|
||||||
void Compile_Cop2_MF ( void );
|
void Compile_Cop2_MF(void);
|
||||||
void Compile_Cop2_CF ( void );
|
void Compile_Cop2_CF(void);
|
||||||
void Compile_Cop2_MT ( void );
|
void Compile_Cop2_MT(void);
|
||||||
void Compile_Cop2_CT ( void );
|
void Compile_Cop2_CT(void);
|
||||||
void Compile_COP2_VECTOR ( void );
|
void Compile_COP2_VECTOR(void);
|
||||||
|
|
||||||
// Vector functions
|
// Vector functions
|
||||||
|
|
||||||
void Compile_Vector_VMULF ( void );
|
void Compile_Vector_VMULF(void);
|
||||||
void Compile_Vector_VMULU ( void );
|
void Compile_Vector_VMULU(void);
|
||||||
void Compile_Vector_VMUDL ( void );
|
void Compile_Vector_VMUDL(void);
|
||||||
void Compile_Vector_VMUDM ( void );
|
void Compile_Vector_VMUDM(void);
|
||||||
void Compile_Vector_VMUDN ( void );
|
void Compile_Vector_VMUDN(void);
|
||||||
void Compile_Vector_VMUDH ( void );
|
void Compile_Vector_VMUDH(void);
|
||||||
void Compile_Vector_VMACF ( void );
|
void Compile_Vector_VMACF(void);
|
||||||
void Compile_Vector_VMACU ( void );
|
void Compile_Vector_VMACU(void);
|
||||||
void Compile_Vector_VMACQ ( void );
|
void Compile_Vector_VMACQ(void);
|
||||||
void Compile_Vector_VMADL ( void );
|
void Compile_Vector_VMADL(void);
|
||||||
void Compile_Vector_VMADM ( void );
|
void Compile_Vector_VMADM(void);
|
||||||
void Compile_Vector_VMADN ( void );
|
void Compile_Vector_VMADN(void);
|
||||||
void Compile_Vector_VMADH ( void );
|
void Compile_Vector_VMADH(void);
|
||||||
void Compile_Vector_VADD ( void );
|
void Compile_Vector_VADD(void);
|
||||||
void Compile_Vector_VSUB ( void );
|
void Compile_Vector_VSUB(void);
|
||||||
void Compile_Vector_VABS ( void );
|
void Compile_Vector_VABS(void);
|
||||||
void Compile_Vector_VADDC ( void );
|
void Compile_Vector_VADDC(void);
|
||||||
void Compile_Vector_VSUBC ( void );
|
void Compile_Vector_VSUBC(void);
|
||||||
void Compile_Vector_VSAW ( void );
|
void Compile_Vector_VSAW(void);
|
||||||
void Compile_Vector_VLT ( void );
|
void Compile_Vector_VLT(void);
|
||||||
void Compile_Vector_VEQ ( void );
|
void Compile_Vector_VEQ(void);
|
||||||
void Compile_Vector_VNE ( void );
|
void Compile_Vector_VNE(void);
|
||||||
void Compile_Vector_VGE ( void );
|
void Compile_Vector_VGE(void);
|
||||||
void Compile_Vector_VCL ( void );
|
void Compile_Vector_VCL(void);
|
||||||
void Compile_Vector_VCH ( void );
|
void Compile_Vector_VCH(void);
|
||||||
void Compile_Vector_VCR ( void );
|
void Compile_Vector_VCR(void);
|
||||||
void Compile_Vector_VMRG ( void );
|
void Compile_Vector_VMRG(void);
|
||||||
void Compile_Vector_VAND ( void );
|
void Compile_Vector_VAND(void);
|
||||||
void Compile_Vector_VNAND ( void );
|
void Compile_Vector_VNAND(void);
|
||||||
void Compile_Vector_VOR ( void );
|
void Compile_Vector_VOR(void);
|
||||||
void Compile_Vector_VNOR ( void );
|
void Compile_Vector_VNOR(void);
|
||||||
void Compile_Vector_VXOR ( void );
|
void Compile_Vector_VXOR(void);
|
||||||
void Compile_Vector_VNXOR ( void );
|
void Compile_Vector_VNXOR(void);
|
||||||
void Compile_Vector_VRCP ( void );
|
void Compile_Vector_VRCP(void);
|
||||||
void Compile_Vector_VRCPL ( void );
|
void Compile_Vector_VRCPL(void);
|
||||||
void Compile_Vector_VRCPH ( void );
|
void Compile_Vector_VRCPH(void);
|
||||||
void Compile_Vector_VMOV ( void );
|
void Compile_Vector_VMOV(void);
|
||||||
void Compile_Vector_VRSQ ( void );
|
void Compile_Vector_VRSQ(void);
|
||||||
void Compile_Vector_VRSQL ( void );
|
void Compile_Vector_VRSQL(void);
|
||||||
void Compile_Vector_VRSQH ( void );
|
void Compile_Vector_VRSQH(void);
|
||||||
void Compile_Vector_VNOOP ( void );
|
void Compile_Vector_VNOOP(void);
|
||||||
|
|
||||||
// LC2 functions
|
// LC2 functions
|
||||||
|
|
||||||
void Compile_Opcode_LBV ( void );
|
void Compile_Opcode_LBV(void);
|
||||||
void Compile_Opcode_LSV ( void );
|
void Compile_Opcode_LSV(void);
|
||||||
void Compile_Opcode_LLV ( void );
|
void Compile_Opcode_LLV(void);
|
||||||
void Compile_Opcode_LDV ( void );
|
void Compile_Opcode_LDV(void);
|
||||||
void Compile_Opcode_LQV ( void );
|
void Compile_Opcode_LQV(void);
|
||||||
void Compile_Opcode_LRV ( void );
|
void Compile_Opcode_LRV(void);
|
||||||
void Compile_Opcode_LPV ( void );
|
void Compile_Opcode_LPV(void);
|
||||||
void Compile_Opcode_LUV ( void );
|
void Compile_Opcode_LUV(void);
|
||||||
void Compile_Opcode_LHV ( void );
|
void Compile_Opcode_LHV(void);
|
||||||
void Compile_Opcode_LFV ( void );
|
void Compile_Opcode_LFV(void);
|
||||||
void Compile_Opcode_LTV ( void );
|
void Compile_Opcode_LTV(void);
|
||||||
|
|
||||||
// SC2 functions
|
// SC2 functions
|
||||||
|
|
||||||
void Compile_Opcode_SBV ( void );
|
void Compile_Opcode_SBV(void);
|
||||||
void Compile_Opcode_SSV ( void );
|
void Compile_Opcode_SSV(void);
|
||||||
void Compile_Opcode_SLV ( void );
|
void Compile_Opcode_SLV(void);
|
||||||
void Compile_Opcode_SDV ( void );
|
void Compile_Opcode_SDV(void);
|
||||||
void Compile_Opcode_SQV ( void );
|
void Compile_Opcode_SQV(void);
|
||||||
void Compile_Opcode_SRV ( void );
|
void Compile_Opcode_SRV(void);
|
||||||
void Compile_Opcode_SPV ( void );
|
void Compile_Opcode_SPV(void);
|
||||||
void Compile_Opcode_SUV ( void );
|
void Compile_Opcode_SUV(void);
|
||||||
void Compile_Opcode_SHV ( void );
|
void Compile_Opcode_SHV(void);
|
||||||
void Compile_Opcode_SFV ( void );
|
void Compile_Opcode_SFV(void);
|
||||||
void Compile_Opcode_SWV ( void );
|
void Compile_Opcode_SWV(void);
|
||||||
void Compile_Opcode_STV ( void );
|
void Compile_Opcode_STV(void);
|
||||||
|
|
||||||
// Other functions
|
// Other functions
|
||||||
|
|
||||||
void Compile_UnknownOpcode (void);
|
void Compile_UnknownOpcode(void);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,8 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Project64-plugin-spec/Rsp.h>
|
#include <Project64-plugin-spec/Rsp.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
// Profiling
|
// Profiling
|
||||||
#define Default_ProfilingOn FALSE
|
#define Default_ProfilingOn FALSE
|
||||||
|
|
|
@ -1,30 +1,38 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "x86.h"
|
|
||||||
#include "memory.h"
|
|
||||||
#include "RSP registers.h"
|
#include "RSP registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#define PUTDST8(dest,value) (*((BYTE *)(dest))=(BYTE)(value)); dest += 1;
|
#define PUTDST8(dest, value) \
|
||||||
#define PUTDST16(dest,value) (*((WORD *)(dest))=(WORD)(value)); dest += 2;
|
(*((BYTE *)(dest)) = (BYTE)(value)); \
|
||||||
#define PUTDST32(dest,value) (*((DWORD *)(dest))=(DWORD)(value)); dest += 4;
|
dest += 1;
|
||||||
|
#define PUTDST16(dest, value) \
|
||||||
|
(*((WORD *)(dest)) = (WORD)(value)); \
|
||||||
|
dest += 2;
|
||||||
|
#define PUTDST32(dest, value) \
|
||||||
|
(*((DWORD *)(dest)) = (DWORD)(value)); \
|
||||||
|
dest += 4;
|
||||||
#define PUTDSTPTR(dest, value) \
|
#define PUTDSTPTR(dest, value) \
|
||||||
*(void **)(dest) = (void *)(value); dest += sizeof(void *);
|
*(void **)(dest) = (void *)(value); \
|
||||||
|
dest += sizeof(void *);
|
||||||
|
|
||||||
char * sse_Strings[8] = {
|
char * sse_Strings[8] = {
|
||||||
"xmm0", "xmm1", "xmm2", "xmm3",
|
"xmm0", "xmm1", "xmm2", "xmm3",
|
||||||
"xmm4", "xmm5", "xmm6", "xmm7"
|
"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;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps %s, xmmword ptr [%s]",sse_Name(sseReg), VariableName);
|
CPU_Message(" movaps %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x05; break;
|
case x86_XMM0: x86Command = 0x05; break;
|
||||||
case x86_XMM1: x86Command = 0x0D; break;
|
case x86_XMM1: x86Command = 0x0D; break;
|
||||||
case x86_XMM2: x86Command = 0x15; break;
|
case x86_XMM2: x86Command = 0x15; break;
|
||||||
|
@ -35,17 +43,19 @@ void SseMoveAlignedVariableToReg(void *Variable, char *VariableName, int sseReg)
|
||||||
case x86_XMM7: x86Command = 0x3D; break;
|
case x86_XMM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x280f);
|
PUTDST16(RecompPos, 0x280f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg) {
|
void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE 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));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x80; break;
|
case x86_XMM0: x86Command = 0x80; break;
|
||||||
case x86_XMM1: x86Command = 0x88; break;
|
case x86_XMM1: x86Command = 0x88; break;
|
||||||
case x86_XMM2: x86Command = 0x90; break;
|
case x86_XMM2: x86Command = 0x90; break;
|
||||||
|
@ -55,7 +65,8 @@ void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg) {
|
||||||
case x86_XMM6: x86Command = 0xB0; break;
|
case x86_XMM6: x86Command = 0xB0; break;
|
||||||
case x86_XMM7: x86Command = 0xB8; break;
|
case x86_XMM7: x86Command = 0xB8; break;
|
||||||
}
|
}
|
||||||
switch (AddrReg) {
|
switch (AddrReg)
|
||||||
|
{
|
||||||
case x86_EAX: x86Command += 0x00; break;
|
case x86_EAX: x86Command += 0x00; break;
|
||||||
case x86_EBX: x86Command += 0x03; break;
|
case x86_EBX: x86Command += 0x03; break;
|
||||||
case x86_ECX: x86Command += 0x01; break;
|
case x86_ECX: x86Command += 0x01; break;
|
||||||
|
@ -66,17 +77,19 @@ void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg) {
|
||||||
case x86_EBP: x86Command += 0x05; break;
|
case x86_EBP: x86Command += 0x05; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x280f);
|
PUTDST16(RecompPos, 0x280f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveAlignedRegToVariable(int sseReg, void *Variable, char *VariableName) {
|
void SseMoveAlignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps xmmword ptr [%s], %s",VariableName, sse_Name(sseReg));
|
CPU_Message(" movaps xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x05; break;
|
case x86_XMM0: x86Command = 0x05; break;
|
||||||
case x86_XMM1: x86Command = 0x0D; break;
|
case x86_XMM1: x86Command = 0x0D; break;
|
||||||
case x86_XMM2: x86Command = 0x15; break;
|
case x86_XMM2: x86Command = 0x15; break;
|
||||||
|
@ -87,17 +100,19 @@ void SseMoveAlignedRegToVariable(int sseReg, void *Variable, char *VariableName)
|
||||||
case x86_XMM7: x86Command = 0x3D; break;
|
case x86_XMM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x290f);
|
PUTDST16(RecompPos, 0x290f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg) {
|
void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE 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));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x80; break;
|
case x86_XMM0: x86Command = 0x80; break;
|
||||||
case x86_XMM1: x86Command = 0x88; break;
|
case x86_XMM1: x86Command = 0x88; break;
|
||||||
case x86_XMM2: x86Command = 0x90; break;
|
case x86_XMM2: x86Command = 0x90; break;
|
||||||
|
@ -107,7 +122,8 @@ void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg) {
|
||||||
case x86_XMM6: x86Command = 0xB0; break;
|
case x86_XMM6: x86Command = 0xB0; break;
|
||||||
case x86_XMM7: x86Command = 0xB8; break;
|
case x86_XMM7: x86Command = 0xB8; break;
|
||||||
}
|
}
|
||||||
switch (AddrReg) {
|
switch (AddrReg)
|
||||||
|
{
|
||||||
case x86_EAX: x86Command += 0x00; break;
|
case x86_EAX: x86Command += 0x00; break;
|
||||||
case x86_EBX: x86Command += 0x03; break;
|
case x86_EBX: x86Command += 0x03; break;
|
||||||
case x86_ECX: x86Command += 0x01; break;
|
case x86_ECX: x86Command += 0x01; break;
|
||||||
|
@ -118,17 +134,19 @@ void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg) {
|
||||||
case x86_EBP: x86Command += 0x05; break;
|
case x86_EBP: x86Command += 0x05; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x290f);
|
PUTDST16(RecompPos, 0x290f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveUnalignedVariableToReg(void *Variable, char *VariableName, int sseReg) {
|
void SseMoveUnalignedVariableToReg(void * Variable, char * VariableName, int sseReg)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups %s, xmmword ptr [%s]",sse_Name(sseReg), VariableName);
|
CPU_Message(" movups %s, xmmword ptr [%s]", sse_Name(sseReg), VariableName);
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x05; break;
|
case x86_XMM0: x86Command = 0x05; break;
|
||||||
case x86_XMM1: x86Command = 0x0D; break;
|
case x86_XMM1: x86Command = 0x0D; break;
|
||||||
case x86_XMM2: x86Command = 0x15; break;
|
case x86_XMM2: x86Command = 0x15; break;
|
||||||
|
@ -139,17 +157,19 @@ void SseMoveUnalignedVariableToReg(void *Variable, char *VariableName, int sseRe
|
||||||
case x86_XMM7: x86Command = 0x3D; break;
|
case x86_XMM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x100f);
|
PUTDST16(RecompPos, 0x100f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg) {
|
void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE 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));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x80; break;
|
case x86_XMM0: x86Command = 0x80; break;
|
||||||
case x86_XMM1: x86Command = 0x88; break;
|
case x86_XMM1: x86Command = 0x88; break;
|
||||||
case x86_XMM2: x86Command = 0x90; break;
|
case x86_XMM2: x86Command = 0x90; break;
|
||||||
|
@ -159,7 +179,8 @@ void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg) {
|
||||||
case x86_XMM6: x86Command = 0xB0; break;
|
case x86_XMM6: x86Command = 0xB0; break;
|
||||||
case x86_XMM7: x86Command = 0xB8; break;
|
case x86_XMM7: x86Command = 0xB8; break;
|
||||||
}
|
}
|
||||||
switch (AddrReg) {
|
switch (AddrReg)
|
||||||
|
{
|
||||||
case x86_EAX: x86Command += 0x00; break;
|
case x86_EAX: x86Command += 0x00; break;
|
||||||
case x86_EBX: x86Command += 0x03; break;
|
case x86_EBX: x86Command += 0x03; break;
|
||||||
case x86_ECX: x86Command += 0x01; break;
|
case x86_ECX: x86Command += 0x01; break;
|
||||||
|
@ -170,17 +191,19 @@ void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg) {
|
||||||
case x86_EBP: x86Command += 0x05; break;
|
case x86_EBP: x86Command += 0x05; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x100f);
|
PUTDST16(RecompPos, 0x100f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveUnalignedRegToVariable(int sseReg, void *Variable, char *VariableName) {
|
void SseMoveUnalignedRegToVariable(int sseReg, void * Variable, char * VariableName)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movups xmmword ptr [%s], %s",VariableName, sse_Name(sseReg));
|
CPU_Message(" movups xmmword ptr [%s], %s", VariableName, sse_Name(sseReg));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x05; break;
|
case x86_XMM0: x86Command = 0x05; break;
|
||||||
case x86_XMM1: x86Command = 0x0D; break;
|
case x86_XMM1: x86Command = 0x0D; break;
|
||||||
case x86_XMM2: x86Command = 0x15; break;
|
case x86_XMM2: x86Command = 0x15; break;
|
||||||
|
@ -191,17 +214,19 @@ void SseMoveUnalignedRegToVariable(int sseReg, void *Variable, char *VariableNam
|
||||||
case x86_XMM7: x86Command = 0x3D; break;
|
case x86_XMM7: x86Command = 0x3D; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x110f);
|
PUTDST16(RecompPos, 0x110f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, Variable);
|
PUTDSTPTR(RecompPos, Variable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg) {
|
void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE 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));
|
||||||
|
|
||||||
switch (sseReg) {
|
switch (sseReg)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x80; break;
|
case x86_XMM0: x86Command = 0x80; break;
|
||||||
case x86_XMM1: x86Command = 0x88; break;
|
case x86_XMM1: x86Command = 0x88; break;
|
||||||
case x86_XMM2: x86Command = 0x90; break;
|
case x86_XMM2: x86Command = 0x90; break;
|
||||||
|
@ -211,7 +236,8 @@ void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg) {
|
||||||
case x86_XMM6: x86Command = 0xB0; break;
|
case x86_XMM6: x86Command = 0xB0; break;
|
||||||
case x86_XMM7: x86Command = 0xB8; break;
|
case x86_XMM7: x86Command = 0xB8; break;
|
||||||
}
|
}
|
||||||
switch (AddrReg) {
|
switch (AddrReg)
|
||||||
|
{
|
||||||
case x86_EAX: x86Command += 0x00; break;
|
case x86_EAX: x86Command += 0x00; break;
|
||||||
case x86_EBX: x86Command += 0x03; break;
|
case x86_EBX: x86Command += 0x03; break;
|
||||||
case x86_ECX: x86Command += 0x01; break;
|
case x86_ECX: x86Command += 0x01; break;
|
||||||
|
@ -222,17 +248,19 @@ void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg) {
|
||||||
case x86_EBP: x86Command += 0x05; break;
|
case x86_EBP: x86Command += 0x05; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x110f);
|
PUTDST16(RecompPos, 0x110f);
|
||||||
PUTDST8(RecompPos, x86Command);
|
PUTDST8(RecompPos, x86Command);
|
||||||
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
PUTDSTPTR(RecompPos, RSPInfo.DMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseMoveRegToReg(int Dest, int Source) {
|
void SseMoveRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" movaps %s, %s", sse_Name(Dest), sse_Name(Source));
|
CPU_Message(" movaps %s, %s", sse_Name(Dest), sse_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x00; break;
|
case x86_XMM0: x86Command = 0x00; break;
|
||||||
case x86_XMM1: x86Command = 0x08; break;
|
case x86_XMM1: x86Command = 0x08; break;
|
||||||
case x86_XMM2: x86Command = 0x10; break;
|
case x86_XMM2: x86Command = 0x10; break;
|
||||||
|
@ -242,7 +270,8 @@ void SseMoveRegToReg(int Dest, int Source) {
|
||||||
case x86_XMM6: x86Command = 0x30; break;
|
case x86_XMM6: x86Command = 0x30; break;
|
||||||
case x86_XMM7: x86Command = 0x38; break;
|
case x86_XMM7: x86Command = 0x38; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command += 0x00; break;
|
case x86_XMM0: x86Command += 0x00; break;
|
||||||
case x86_XMM1: x86Command += 0x01; break;
|
case x86_XMM1: x86Command += 0x01; break;
|
||||||
case x86_XMM2: x86Command += 0x02; break;
|
case x86_XMM2: x86Command += 0x02; break;
|
||||||
|
@ -253,16 +282,18 @@ void SseMoveRegToReg(int Dest, int Source) {
|
||||||
case x86_XMM7: x86Command += 0x07; break;
|
case x86_XMM7: x86Command += 0x07; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUTDST16(RecompPos,0x280f);
|
PUTDST16(RecompPos, 0x280f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseXorRegToReg(int Dest, int Source) {
|
void SseXorRegToReg(int Dest, int Source)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE x86Command = 0;
|
||||||
|
|
||||||
CPU_Message(" xorps %s, %s", sse_Name(Dest), sse_Name(Source));
|
CPU_Message(" xorps %s, %s", sse_Name(Dest), sse_Name(Source));
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x00; break;
|
case x86_XMM0: x86Command = 0x00; break;
|
||||||
case x86_XMM1: x86Command = 0x08; break;
|
case x86_XMM1: x86Command = 0x08; break;
|
||||||
case x86_XMM2: x86Command = 0x10; break;
|
case x86_XMM2: x86Command = 0x10; break;
|
||||||
|
@ -272,7 +303,8 @@ void SseXorRegToReg(int Dest, int Source) {
|
||||||
case x86_XMM6: x86Command = 0x30; break;
|
case x86_XMM6: x86Command = 0x30; break;
|
||||||
case x86_XMM7: x86Command = 0x38; break;
|
case x86_XMM7: x86Command = 0x38; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command += 0x00; break;
|
case x86_XMM0: x86Command += 0x00; break;
|
||||||
case x86_XMM1: x86Command += 0x01; break;
|
case x86_XMM1: x86Command += 0x01; break;
|
||||||
case x86_XMM2: x86Command += 0x02; break;
|
case x86_XMM2: x86Command += 0x02; break;
|
||||||
|
@ -282,16 +314,18 @@ void SseXorRegToReg(int Dest, int Source) {
|
||||||
case x86_XMM6: x86Command += 0x06; break;
|
case x86_XMM6: x86Command += 0x06; break;
|
||||||
case x86_XMM7: x86Command += 0x07; break;
|
case x86_XMM7: x86Command += 0x07; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0x570f);
|
PUTDST16(RecompPos, 0x570f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SseShuffleReg(int Dest, int Source, BYTE Immed) {
|
void SseShuffleReg(int Dest, int Source, BYTE Immed)
|
||||||
|
{
|
||||||
BYTE x86Command = 0;
|
BYTE 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);
|
||||||
|
|
||||||
switch (Dest) {
|
switch (Dest)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command = 0x00; break;
|
case x86_XMM0: x86Command = 0x00; break;
|
||||||
case x86_XMM1: x86Command = 0x08; break;
|
case x86_XMM1: x86Command = 0x08; break;
|
||||||
case x86_XMM2: x86Command = 0x10; break;
|
case x86_XMM2: x86Command = 0x10; break;
|
||||||
|
@ -301,7 +335,8 @@ void SseShuffleReg(int Dest, int Source, BYTE Immed) {
|
||||||
case x86_XMM6: x86Command = 0x30; break;
|
case x86_XMM6: x86Command = 0x30; break;
|
||||||
case x86_XMM7: x86Command = 0x38; break;
|
case x86_XMM7: x86Command = 0x38; break;
|
||||||
}
|
}
|
||||||
switch (Source) {
|
switch (Source)
|
||||||
|
{
|
||||||
case x86_XMM0: x86Command += 0x00; break;
|
case x86_XMM0: x86Command += 0x00; break;
|
||||||
case x86_XMM1: x86Command += 0x01; break;
|
case x86_XMM1: x86Command += 0x01; break;
|
||||||
case x86_XMM2: x86Command += 0x02; break;
|
case x86_XMM2: x86Command += 0x02; break;
|
||||||
|
@ -311,7 +346,7 @@ void SseShuffleReg(int Dest, int Source, BYTE Immed) {
|
||||||
case x86_XMM6: x86Command += 0x06; break;
|
case x86_XMM6: x86Command += 0x06; break;
|
||||||
case x86_XMM7: x86Command += 0x07; break;
|
case x86_XMM7: x86Command += 0x07; break;
|
||||||
}
|
}
|
||||||
PUTDST16(RecompPos,0xC60f);
|
PUTDST16(RecompPos, 0xC60f);
|
||||||
PUTDST8(RecompPos, 0xC0 | x86Command);
|
PUTDST8(RecompPos, 0xC0 | x86Command);
|
||||||
PUTDST8(RecompPos, Immed);
|
PUTDST8(RecompPos, Immed);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
// Pointer to RSP operation code functions or "func"
|
// Pointer to RSP operation code functions or "func"
|
||||||
// This is the type of all RSP interpreter and recompiler functions
|
// This is the type of all RSP interpreter and recompiler functions
|
||||||
|
|
||||||
typedef void(*p_func)(void);
|
typedef void (*p_func)(void);
|
||||||
|
|
||||||
// TODO: Rewrite/remove/address?
|
// TODO: Rewrite/remove/address?
|
||||||
/*
|
/*
|
||||||
|
@ -25,7 +25,8 @@ typedef int Boolean;
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef union tagUWORD {
|
typedef union tagUWORD
|
||||||
|
{
|
||||||
int32_t W;
|
int32_t W;
|
||||||
uint32_t UW;
|
uint32_t UW;
|
||||||
int16_t HW[2];
|
int16_t HW[2];
|
||||||
|
@ -36,7 +37,8 @@ typedef union tagUWORD {
|
||||||
float F;
|
float F;
|
||||||
} UWORD32;
|
} UWORD32;
|
||||||
|
|
||||||
typedef union tagUDWORD {
|
typedef union tagUDWORD
|
||||||
|
{
|
||||||
int64_t DW;
|
int64_t DW;
|
||||||
uint64_t UDW;
|
uint64_t UDW;
|
||||||
int32_t W[2];
|
int32_t W[2];
|
||||||
|
@ -50,7 +52,8 @@ typedef union tagUDWORD {
|
||||||
float F[2];
|
float F[2];
|
||||||
} UDWORD;
|
} UDWORD;
|
||||||
|
|
||||||
typedef union tagVect {
|
typedef union tagVect
|
||||||
|
{
|
||||||
int64_t DW[2];
|
int64_t DW[2];
|
||||||
uint64_t UDW[2];
|
uint64_t UDW[2];
|
||||||
int32_t W[4];
|
int32_t W[4];
|
||||||
|
|
2679
Source/RSP/X86.cpp
2679
Source/RSP/X86.cpp
File diff suppressed because it is too large
Load Diff
457
Source/RSP/X86.h
457
Source/RSP/X86.h
|
@ -1,244 +1,267 @@
|
||||||
enum x86RegValues {
|
enum x86RegValues
|
||||||
x86_EAX = 0, x86_EBX = 1, x86_ECX = 2, x86_EDX = 3,
|
{
|
||||||
x86_ESI = 4, x86_EDI = 5, x86_EBP = 6, x86_ESP = 7
|
x86_EAX = 0,
|
||||||
|
x86_EBX = 1,
|
||||||
|
x86_ECX = 2,
|
||||||
|
x86_EDX = 3,
|
||||||
|
x86_ESI = 4,
|
||||||
|
x86_EDI = 5,
|
||||||
|
x86_EBP = 6,
|
||||||
|
x86_ESP = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
enum mmxRegValues {
|
enum mmxRegValues
|
||||||
x86_MM0 = 0, x86_MM1 = 1, x86_MM2 = 2, x86_MM3 = 3,
|
{
|
||||||
x86_MM4 = 4, x86_MM5 = 5, x86_MM6 = 6, x86_MM7 = 7
|
x86_MM0 = 0,
|
||||||
|
x86_MM1 = 1,
|
||||||
|
x86_MM2 = 2,
|
||||||
|
x86_MM3 = 3,
|
||||||
|
x86_MM4 = 4,
|
||||||
|
x86_MM5 = 5,
|
||||||
|
x86_MM6 = 6,
|
||||||
|
x86_MM7 = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sseRegValues {
|
enum sseRegValues
|
||||||
x86_XMM0 = 0, x86_XMM1 = 1, x86_XMM2 = 2, x86_XMM3 = 3,
|
{
|
||||||
x86_XMM4 = 4, x86_XMM5 = 5, x86_XMM6 = 6, x86_XMM7 = 7
|
x86_XMM0 = 0,
|
||||||
|
x86_XMM1 = 1,
|
||||||
|
x86_XMM2 = 2,
|
||||||
|
x86_XMM3 = 3,
|
||||||
|
x86_XMM4 = 4,
|
||||||
|
x86_XMM5 = 5,
|
||||||
|
x86_XMM6 = 6,
|
||||||
|
x86_XMM7 = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
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(BYTE Constant, int x86reg);
|
||||||
void AdcConstToVariable ( void *Variable, char *VariableName, BYTE Constant );
|
void AdcConstToVariable(void * Variable, char * VariableName, BYTE Constant);
|
||||||
void AdcConstHalfToVariable ( void *Variable, char *VariableName, BYTE Constant );
|
void AdcConstHalfToVariable(void * Variable, char * VariableName, BYTE Constant);
|
||||||
void AddConstToVariable ( DWORD Const, void *Variable, char *VariableName );
|
void AddConstToVariable(DWORD 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(DWORD Const, void * Variable, char * VariableName);
|
||||||
void AndConstToX86Reg ( int x86Reg, DWORD Const );
|
void AndConstToX86Reg(int x86Reg, DWORD 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(LPCSTR 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);
|
||||||
void CondMoveEqual ( int Destination, int Source );
|
void CondMoveEqual(int Destination, int Source);
|
||||||
void CondMoveNotEqual ( int Destination, int Source );
|
void CondMoveNotEqual(int Destination, int Source);
|
||||||
void CondMoveGreater ( int Destination, int Source );
|
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(DWORD Const, void * Variable, char * VariableName);
|
||||||
void CompConstHalfToVariable ( WORD Const, void * Variable, char * VariableName );
|
void CompConstHalfToVariable(WORD Const, void * Variable, char * VariableName);
|
||||||
void CompConstToX86reg ( int x86Reg, DWORD Const );
|
void CompConstToX86reg(int x86Reg, DWORD 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);
|
||||||
void Cwd ( void );
|
void Cwd(void);
|
||||||
void Cwde ( void );
|
void Cwde(void);
|
||||||
void DecX86reg ( int x86Reg );
|
void DecX86reg(int x86Reg);
|
||||||
void DivX86reg ( int x86reg );
|
void DivX86reg(int x86reg);
|
||||||
void idivX86reg ( int x86reg );
|
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, DWORD Value);
|
||||||
void JaLabel8 ( char * Label, BYTE Value );
|
void JaLabel8(char * Label, BYTE Value);
|
||||||
void JaLabel32 ( char * Label, DWORD Value );
|
void JaLabel32(char * Label, DWORD Value);
|
||||||
void JbLabel8 ( char * Label, BYTE Value );
|
void JbLabel8(char * Label, BYTE Value);
|
||||||
void JbLabel32 ( char * Label, DWORD Value );
|
void JbLabel32(char * Label, DWORD Value);
|
||||||
void JeLabel8 ( char * Label, BYTE Value );
|
void JeLabel8(char * Label, BYTE Value);
|
||||||
void JeLabel32 ( char * Label, DWORD Value );
|
void JeLabel32(char * Label, DWORD Value);
|
||||||
void JgeLabel8 ( char * Label, BYTE Value );
|
void JgeLabel8(char * Label, BYTE Value);
|
||||||
void JgeLabel32 ( char * Label, DWORD Value );
|
void JgeLabel32(char * Label, DWORD Value);
|
||||||
void JgLabel8 ( char * Label, BYTE Value );
|
void JgLabel8(char * Label, BYTE Value);
|
||||||
void JgLabel32 ( char * Label, DWORD Value );
|
void JgLabel32(char * Label, DWORD Value);
|
||||||
void JleLabel8 ( char * Label, BYTE Value );
|
void JleLabel8(char * Label, BYTE Value);
|
||||||
void JleLabel32 ( char * Label, DWORD Value );
|
void JleLabel32(char * Label, DWORD Value);
|
||||||
void JlLabel8 ( char * Label, BYTE Value );
|
void JlLabel8(char * Label, BYTE Value);
|
||||||
void JlLabel32 ( char * Label, DWORD Value );
|
void JlLabel32(char * Label, DWORD Value);
|
||||||
void JumpX86Reg ( int x86reg );
|
void JumpX86Reg(int x86reg);
|
||||||
void JmpLabel8 ( char * Label, BYTE Value );
|
void JmpLabel8(char * Label, BYTE Value);
|
||||||
void JmpLabel32 ( char * Label, DWORD Value );
|
void JmpLabel32(char * Label, DWORD Value);
|
||||||
void JneLabel8 ( char * Label, BYTE Value );
|
void JneLabel8(char * Label, BYTE Value);
|
||||||
void JneLabel32 ( char * Label, DWORD Value );
|
void JneLabel32(char * Label, DWORD Value);
|
||||||
void JnsLabel8 ( char * Label, BYTE Value );
|
void JnsLabel8(char * Label, BYTE Value);
|
||||||
void JnsLabel32 ( char * Label, DWORD Value );
|
void JnsLabel32(char * Label, DWORD Value);
|
||||||
void JsLabel32 ( char * Label, DWORD Value );
|
void JsLabel32(char * Label, DWORD 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(BYTE Const, int AddrReg);
|
||||||
void MoveConstHalfToN64Mem ( WORD Const, int AddrReg );
|
void MoveConstHalfToN64Mem(WORD Const, int AddrReg);
|
||||||
void MoveConstByteToVariable ( BYTE Const,void *Variable, char *VariableName );
|
void MoveConstByteToVariable(BYTE Const, void * Variable, char * VariableName);
|
||||||
void MoveConstHalfToVariable ( WORD Const, void *Variable, char *VariableName );
|
void MoveConstHalfToVariable(WORD Const, void * Variable, char * VariableName);
|
||||||
void MoveConstToN64Mem ( DWORD Const, int AddrReg );
|
void MoveConstToN64Mem(DWORD Const, int AddrReg);
|
||||||
void MoveConstToN64MemDisp ( DWORD Const, int AddrReg, BYTE Disp );
|
void MoveConstToN64MemDisp(DWORD Const, int AddrReg, BYTE Disp);
|
||||||
void MoveConstToVariable ( DWORD Const, void *Variable, char *VariableName );
|
void MoveConstToVariable(DWORD Const, void * Variable, char * VariableName);
|
||||||
void MoveConstToX86reg ( DWORD Const, int x86reg );
|
void MoveConstToX86reg(DWORD 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, BYTE 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, BYTE 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, BYTE 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);
|
||||||
void MoveX86regByteToN64Mem ( int x86reg, int AddrReg );
|
void MoveX86regByteToN64Mem(int x86reg, int AddrReg);
|
||||||
void MoveX86regByteToVariable ( int x86reg, void * Variable, char * VariableName );
|
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, BYTE 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, BYTE 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, BYTE 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);
|
||||||
void MoveZxVariableToX86regHalf ( void *Variable, char *VariableName, int x86reg );
|
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(DWORD Const, void * Variable, char * VariableName);
|
||||||
void OrConstToX86Reg ( DWORD Const, int x86Reg );
|
void OrConstToX86Reg(DWORD 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);
|
||||||
void OrX86RegToX86Reg ( int Destination, int Source );
|
void OrX86RegToX86Reg(int Destination, int Source);
|
||||||
void Popad ( void );
|
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, DWORD Value);
|
||||||
void Ret ( void );
|
void Ret(void);
|
||||||
void Seta ( int x86reg );
|
void Seta(int x86reg);
|
||||||
void Setae ( int x86reg );
|
void Setae(int x86reg);
|
||||||
void Setl ( int x86reg );
|
void Setl(int x86reg);
|
||||||
void Setb ( int x86reg );
|
void Setb(int x86reg);
|
||||||
void Setg ( int x86reg );
|
void Setg(int x86reg);
|
||||||
void Setz ( int x86reg );
|
void Setz(int x86reg);
|
||||||
void Setnz ( int x86reg );
|
void Setnz(int x86reg);
|
||||||
void SetlVariable ( void * Variable, char * VariableName );
|
void SetlVariable(void * Variable, char * VariableName);
|
||||||
void SetleVariable ( void * Variable, char * VariableName );
|
void SetleVariable(void * Variable, char * VariableName);
|
||||||
void SetgVariable ( void * Variable, char * VariableName );
|
void SetgVariable(void * Variable, char * VariableName);
|
||||||
void SetgeVariable ( void * Variable, char * VariableName );
|
void SetgeVariable(void * Variable, char * VariableName);
|
||||||
void SetbVariable ( void * Variable, char * VariableName );
|
void SetbVariable(void * Variable, char * VariableName);
|
||||||
void SetaVariable ( void * Variable, char * VariableName );
|
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, BYTE Immediate);
|
||||||
void ShiftLeftSignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
|
void ShiftLeftSignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
||||||
void ShiftRightSignImmed ( int x86reg, BYTE Immediate );
|
void ShiftRightSignImmed(int x86reg, BYTE Immediate);
|
||||||
void ShiftRightSignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
|
void ShiftRightSignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
||||||
void ShiftRightUnsign ( int x86reg );
|
void ShiftRightUnsign(int x86reg);
|
||||||
void ShiftRightUnsignImmed ( int x86reg, BYTE Immediate );
|
void ShiftRightUnsignImmed(int x86reg, BYTE Immediate);
|
||||||
void ShiftRightUnsignVariableImmed ( void *Variable, char *VariableName, BYTE Immediate );
|
void ShiftRightUnsignVariableImmed(void * Variable, char * VariableName, BYTE Immediate);
|
||||||
void ShiftLeftDoubleImmed ( int Destination, int Source, BYTE Immediate );
|
void ShiftLeftDoubleImmed(int Destination, int Source, BYTE Immediate);
|
||||||
void ShiftRightDoubleImmed ( int Destination, int Source, BYTE Immediate );
|
void ShiftRightDoubleImmed(int Destination, int Source, BYTE Immediate);
|
||||||
void SubConstFromVariable ( DWORD Const, void *Variable, char *VariableName );
|
void SubConstFromVariable(DWORD Const, void * Variable, char * VariableName);
|
||||||
void SubConstFromX86Reg ( int x86Reg, DWORD Const );
|
void SubConstFromX86Reg(int x86Reg, DWORD 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(DWORD Const, void * Variable, char * VariableName);
|
||||||
void TestConstToX86Reg ( DWORD Const, int x86reg );
|
void TestConstToX86Reg(DWORD 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, DWORD 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, DWORD Const);
|
||||||
|
|
||||||
#define _MMX_SHUFFLE(a, b, c, d) \
|
#define _MMX_SHUFFLE(a, b, c, d) \
|
||||||
((BYTE)(((a) << 6) | ((b) << 4) | ((c) << 2) | (d)))
|
((BYTE)(((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);
|
||||||
void MmxMoveQwordVariableToReg ( int Dest, void *Variable, char *VariableName );
|
void MmxMoveQwordVariableToReg(int Dest, void * Variable, char * VariableName);
|
||||||
void MmxPandRegToReg ( int Dest, int Source );
|
void MmxPandRegToReg(int Dest, int Source);
|
||||||
void MmxPandnRegToReg ( int Dest, int Source );
|
void MmxPandnRegToReg(int Dest, int Source);
|
||||||
void MmxPandVariableToReg ( void * Variable, char * VariableName, int Dest );
|
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, BYTE 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, BYTE Immed);
|
||||||
void MmxPsrawImmed ( int Dest, BYTE Immed );
|
void MmxPsrawImmed(int Dest, BYTE Immed);
|
||||||
void MmxPsllwImmed ( int Dest, BYTE Immed );
|
void MmxPsllwImmed(int Dest, BYTE 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);
|
||||||
void MmxPsubswVariableToReg ( int Dest, void * Variable, char * VariableName );
|
void MmxPsubswVariableToReg(int Dest, void * Variable, char * VariableName);
|
||||||
void MmxPsubswRegToReg ( int Dest, int Source );
|
void MmxPsubswRegToReg(int Dest, int Source);
|
||||||
void MmxPackSignedDwords ( int Dest, int Source );
|
void MmxPackSignedDwords(int Dest, int Source);
|
||||||
void MmxUnpackLowWord ( int Dest, int Source );
|
void MmxUnpackLowWord(int Dest, int Source);
|
||||||
void MmxUnpackHighWord ( int Dest, int Source );
|
void MmxUnpackHighWord(int Dest, int Source);
|
||||||
void MmxCompareGreaterWordRegToReg ( int Dest, int Source );
|
void MmxCompareGreaterWordRegToReg(int Dest, int Source);
|
||||||
void MmxEmptyMultimediaState ( void );
|
void MmxEmptyMultimediaState(void);
|
||||||
|
|
||||||
void SseMoveAlignedVariableToReg ( void *Variable, char *VariableName, int sseReg );
|
void SseMoveAlignedVariableToReg(void * Variable, char * VariableName, int sseReg);
|
||||||
void SseMoveAlignedRegToVariable ( int sseReg, void *Variable, char *VariableName );
|
void SseMoveAlignedRegToVariable(int sseReg, void * Variable, char * VariableName);
|
||||||
void SseMoveAlignedN64MemToReg ( int sseReg, int AddrReg );
|
void SseMoveAlignedN64MemToReg(int sseReg, int AddrReg);
|
||||||
void SseMoveAlignedRegToN64Mem ( int sseReg, int AddrReg );
|
void SseMoveAlignedRegToN64Mem(int sseReg, int AddrReg);
|
||||||
void SseMoveUnalignedVariableToReg ( void *Variable, char *VariableName, int sseReg );
|
void SseMoveUnalignedVariableToReg(void * Variable, char * VariableName, int sseReg);
|
||||||
void SseMoveUnalignedRegToVariable ( int sseReg, void *Variable, char *VariableName );
|
void SseMoveUnalignedRegToVariable(int sseReg, void * Variable, char * VariableName);
|
||||||
void SseMoveUnalignedN64MemToReg ( int sseReg, int AddrReg );
|
void SseMoveUnalignedN64MemToReg(int sseReg, int AddrReg);
|
||||||
void SseMoveUnalignedRegToN64Mem ( int sseReg, int AddrReg );
|
void SseMoveUnalignedRegToN64Mem(int sseReg, int AddrReg);
|
||||||
void SseMoveRegToReg ( int Dest, int Source );
|
void SseMoveRegToReg(int Dest, int Source);
|
||||||
void SseXorRegToReg ( int Dest, int Source );
|
void SseXorRegToReg(int Dest, int Source);
|
||||||
|
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable : 4201) // Non-standard extension used: nameless struct/union
|
#pragma warning(disable : 4201) // Non-standard extension used: nameless struct/union
|
||||||
|
|
||||||
typedef union {
|
typedef union
|
||||||
struct {
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
unsigned Reg0 : 2;
|
unsigned Reg0 : 2;
|
||||||
unsigned Reg1 : 2;
|
unsigned Reg1 : 2;
|
||||||
unsigned Reg2 : 2;
|
unsigned Reg2 : 2;
|
||||||
unsigned Reg3 : 2;
|
unsigned Reg3 : 2;
|
||||||
};
|
};
|
||||||
unsigned UB:8;
|
unsigned UB : 8;
|
||||||
} SHUFFLE;
|
} SHUFFLE;
|
||||||
|
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
||||||
void SseShuffleReg ( int Dest, int Source, BYTE Immed );
|
void SseShuffleReg(int Dest, int Source, BYTE Immed);
|
||||||
|
|
||||||
void x86_SetBranch32b(void * JumpByte, void * Destination);
|
void x86_SetBranch32b(void * JumpByte, void * Destination);
|
||||||
void x86_SetBranch8b(void * JumpByte, void * Destination);
|
void x86_SetBranch8b(void * JumpByte, void * Destination);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "CPU.h"
|
|
||||||
#include "breakpoint.h"
|
#include "breakpoint.h"
|
||||||
|
#include "CPU.h"
|
||||||
|
#include "Rsp.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#define IDC_LOCATION_EDIT 105
|
#define IDC_LOCATION_EDIT 105
|
||||||
HWND BPoint_Win_hDlg, hRSPLocation = NULL;
|
HWND BPoint_Win_hDlg, hRSPLocation = NULL;
|
||||||
|
@ -10,18 +10,19 @@ HWND BPoint_Win_hDlg, hRSPLocation = NULL;
|
||||||
BPOINT BPoint[MaxBPoints];
|
BPOINT BPoint[MaxBPoints];
|
||||||
int NoOfBpoints;
|
int NoOfBpoints;
|
||||||
|
|
||||||
void Add_BPoint ( void )
|
void Add_BPoint(void)
|
||||||
{
|
{
|
||||||
char Title[10];
|
char Title[10];
|
||||||
|
|
||||||
GetWindowTextA(hRSPLocation,Title,sizeof(Title));
|
GetWindowTextA(hRSPLocation, Title, sizeof(Title));
|
||||||
if (!AddRSP_BPoint(AsciiToHex(Title),TRUE )) {
|
if (!AddRSP_BPoint(AsciiToHex(Title), TRUE))
|
||||||
SendMessage(hRSPLocation,EM_SETSEL,(WPARAM)0,(LPARAM)-1);
|
{
|
||||||
|
SendMessage(hRSPLocation, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
||||||
SetFocus(hRSPLocation);
|
SetFocus(hRSPLocation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int AddRSP_BPoint( DWORD Location, int Confirm )
|
int AddRSP_BPoint(DWORD Location, int Confirm)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
|
@ -31,7 +32,7 @@ int AddRSP_BPoint( DWORD Location, int Confirm )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (count = 0; count < NoOfBpoints; count ++)
|
for (count = 0; count < NoOfBpoints; count++)
|
||||||
{
|
{
|
||||||
if (BPoint[count].Location == Location)
|
if (BPoint[count].Location == Location)
|
||||||
{
|
{
|
||||||
|
@ -45,7 +46,7 @@ int AddRSP_BPoint( DWORD Location, int Confirm )
|
||||||
char Message[150];
|
char Message[150];
|
||||||
int Response;
|
int Response;
|
||||||
|
|
||||||
sprintf(Message,"Break when:\n\nRSP's program counter = 0x%03X\n\nIs this correct?",
|
sprintf(Message, "Break when:\n\nRSP's program counter = 0x%03X\n\nIs this correct?",
|
||||||
Location);
|
Location);
|
||||||
Response = MessageBoxA(BPoint_Win_hDlg, Message, "Breakpoint", MB_YESNO | MB_ICONINFORMATION);
|
Response = MessageBoxA(BPoint_Win_hDlg, Message, "Breakpoint", MB_YESNO | MB_ICONINFORMATION);
|
||||||
if (Response == IDNO)
|
if (Response == IDNO)
|
||||||
|
@ -62,11 +63,11 @@ int AddRSP_BPoint( DWORD Location, int Confirm )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CheckForRSPBPoint ( DWORD Location )
|
int CheckForRSPBPoint(DWORD Location)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
for (count = 0; count < NoOfBpoints; count ++)
|
for (count = 0; count < NoOfBpoints; count++)
|
||||||
{
|
{
|
||||||
if (BPoint[count].Location == Location)
|
if (BPoint[count].Location == Location)
|
||||||
{
|
{
|
||||||
|
@ -76,66 +77,69 @@ int CheckForRSPBPoint ( DWORD Location )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreateBPPanel ( void * hDlg, rectangle rcBox )
|
void CreateBPPanel(void * hDlg, rectangle rcBox)
|
||||||
{
|
{
|
||||||
if (hRSPLocation != NULL) { return; }
|
if (hRSPLocation != NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rcBox = rcBox; // Remove warning of unused
|
rcBox = rcBox; // Remove warning of unused
|
||||||
|
|
||||||
BPoint_Win_hDlg = (HWND)hDlg;
|
BPoint_Win_hDlg = (HWND)hDlg;
|
||||||
|
|
||||||
hRSPLocation = CreateWindowExA(0,"EDIT","", WS_CHILD | WS_BORDER | ES_UPPERCASE | WS_TABSTOP,
|
hRSPLocation = CreateWindowExA(0, "EDIT", "", WS_CHILD | WS_BORDER | ES_UPPERCASE | WS_TABSTOP,
|
||||||
83,90,100,17, (HWND)hDlg,(HMENU)IDC_LOCATION_EDIT,(HINSTANCE)RSPInfo.hInst,NULL);
|
83, 90, 100, 17, (HWND)hDlg, (HMENU)IDC_LOCATION_EDIT, (HINSTANCE)RSPInfo.hInst, NULL);
|
||||||
if (hRSPLocation)
|
if (hRSPLocation)
|
||||||
{
|
{
|
||||||
char Title[20];
|
char Title[20];
|
||||||
SendMessage(hRSPLocation,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
|
SendMessage(hRSPLocation, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
|
||||||
SendMessage(hRSPLocation,EM_SETLIMITTEXT,(WPARAM)3,(LPARAM)0);
|
SendMessage(hRSPLocation, EM_SETLIMITTEXT, (WPARAM)3, (LPARAM)0);
|
||||||
sprintf(Title,"%03X",*PrgCount);
|
sprintf(Title, "%03X", *PrgCount);
|
||||||
SetWindowTextA(hRSPLocation,Title);
|
SetWindowTextA(hRSPLocation, Title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HideBPPanel ( void )
|
void HideBPPanel(void)
|
||||||
{
|
{
|
||||||
ShowWindow(hRSPLocation,FALSE);
|
ShowWindow(hRSPLocation, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaintBPPanel ( window_paint ps )
|
void PaintBPPanel(window_paint ps)
|
||||||
{
|
{
|
||||||
TextOutA((HDC)ps.hdc, 29,60,"Break when the program counter equals",37);
|
TextOutA((HDC)ps.hdc, 29, 60, "Break when the program counter equals", 37);
|
||||||
TextOutA((HDC)ps.hdc, 59,85,"0x",2);
|
TextOutA((HDC)ps.hdc, 59, 85, "0x", 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowBPPanel ( void )
|
void ShowBPPanel(void)
|
||||||
{
|
{
|
||||||
ShowWindow(hRSPLocation,TRUE);
|
ShowWindow(hRSPLocation, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefreshBpoints ( void * hList )
|
void RefreshBpoints(void * hList)
|
||||||
{
|
{
|
||||||
char Message[100];
|
char Message[100];
|
||||||
LRESULT location;
|
LRESULT location;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
for (count = 0; count < NoOfBpoints; count ++ ) {
|
for (count = 0; count < NoOfBpoints; count++)
|
||||||
sprintf(Message," at 0x%03X (RSP)", BPoint[count].Location);
|
{
|
||||||
|
sprintf(Message, " at 0x%03X (RSP)", BPoint[count].Location);
|
||||||
location = SendMessageA((HWND)hList, LB_ADDSTRING, 0, (LPARAM)Message);
|
location = SendMessageA((HWND)hList, LB_ADDSTRING, 0, (LPARAM)Message);
|
||||||
SendMessageA(
|
SendMessageA(
|
||||||
(HWND)hList,
|
(HWND)hList,
|
||||||
LB_SETITEMDATA,
|
LB_SETITEMDATA,
|
||||||
(WPARAM)location,
|
(WPARAM)location,
|
||||||
(LPARAM)BPoint[count].Location
|
(LPARAM)BPoint[count].Location);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveAllBpoint ( void )
|
void RemoveAllBpoint(void)
|
||||||
{
|
{
|
||||||
NoOfBpoints = 0;
|
NoOfBpoints = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveBpoint (void * hList, int index )
|
void RemoveBpoint(void * hList, int index)
|
||||||
{
|
{
|
||||||
LRESULT response;
|
LRESULT response;
|
||||||
uint32_t location;
|
uint32_t location;
|
||||||
|
@ -145,18 +149,17 @@ void RemoveBpoint (void * hList, int index )
|
||||||
{
|
{
|
||||||
DisplayError(
|
DisplayError(
|
||||||
"LB_GETITEMDATA response for %i out of DWORD range.",
|
"LB_GETITEMDATA response for %i out of DWORD range.",
|
||||||
index
|
index);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
location = (uint32_t)response;
|
location = (uint32_t)response;
|
||||||
RemoveRSPBreakPoint(location);
|
RemoveRSPBreakPoint(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveRSPBreakPoint (DWORD Location)
|
void RemoveRSPBreakPoint(DWORD Location)
|
||||||
{
|
{
|
||||||
int count, location = -1;
|
int count, location = -1;
|
||||||
|
|
||||||
for (count = 0; count < NoOfBpoints; count ++)
|
for (count = 0; count < NoOfBpoints; count++)
|
||||||
{
|
{
|
||||||
if (BPoint[count].Location == Location)
|
if (BPoint[count].Location == Location)
|
||||||
{
|
{
|
||||||
|
@ -167,7 +170,7 @@ void RemoveRSPBreakPoint (DWORD Location)
|
||||||
|
|
||||||
if (location >= 0)
|
if (location >= 0)
|
||||||
{
|
{
|
||||||
for (count = location; count < NoOfBpoints - 1; count ++ )
|
for (count = location; count < NoOfBpoints - 1; count++)
|
||||||
{
|
{
|
||||||
BPoint[count].Location = BPoint[count + 1].Location;
|
BPoint[count].Location = BPoint[count + 1].Location;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,25 @@
|
||||||
#include "Rsp.h"
|
#include "Rsp.h"
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
#define MaxBPoints 0x30
|
#define MaxBPoints 0x30
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
unsigned int Location;
|
unsigned int Location;
|
||||||
} BPOINT;
|
} BPOINT;
|
||||||
|
|
||||||
extern BPOINT BPoint[MaxBPoints];
|
extern BPOINT BPoint[MaxBPoints];
|
||||||
extern int NoOfBpoints;
|
extern int NoOfBpoints;
|
||||||
|
|
||||||
void Add_BPoint ( void );
|
void Add_BPoint(void);
|
||||||
void CreateBPPanel ( void * hDlg, rectangle rcBox );
|
void CreateBPPanel(void * hDlg, rectangle rcBox);
|
||||||
void HideBPPanel ( void );
|
void HideBPPanel(void);
|
||||||
void PaintBPPanel ( window_paint ps );
|
void PaintBPPanel(window_paint ps);
|
||||||
void ShowBPPanel ( void );
|
void ShowBPPanel(void);
|
||||||
void RefreshBpoints ( void * hList );
|
void RefreshBpoints(void * hList);
|
||||||
void RemoveBpoint ( void * hList, int index );
|
void RemoveBpoint(void * hList, int index);
|
||||||
void RemoveAllBpoint ( void );
|
void RemoveAllBpoint(void);
|
||||||
|
|
||||||
int AddRSP_BPoint ( DWORD Location, int Confirm );
|
int AddRSP_BPoint(DWORD Location, int Confirm);
|
||||||
int CheckForRSPBPoint ( DWORD Location );
|
int CheckForRSPBPoint(DWORD Location);
|
||||||
void RemoveRSPBreakPoint (DWORD Location);
|
void RemoveRSPBreakPoint(DWORD Location);
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "RSP Registers.h"
|
#include "RSP Registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
// #define RSP_SAFE_DMA // Unoptimized DMA transfers
|
// #define RSP_SAFE_DMA // Unoptimized DMA transfers
|
||||||
|
|
||||||
void SP_DMA_READ (void)
|
void SP_DMA_READ(void)
|
||||||
{
|
{
|
||||||
uint32_t i, j, Length, Skip, Count, End, addr;
|
uint32_t i, j, Length, Skip, Count, End, addr;
|
||||||
uint8_t *Dest, *Source;
|
uint8_t *Dest, *Source;
|
||||||
|
@ -35,9 +35,9 @@ void SP_DMA_READ (void)
|
||||||
Source = RSPInfo.RDRAM + (addr & ~7);
|
Source = RSPInfo.RDRAM + (addr & ~7);
|
||||||
|
|
||||||
#if defined(RSP_SAFE_DMA)
|
#if defined(RSP_SAFE_DMA)
|
||||||
for (j = 0 ; j < Count; j++)
|
for (j = 0; j < Count; j++)
|
||||||
{
|
{
|
||||||
for (i = 0 ; i < Length; i++)
|
for (i = 0; i < Length; i++)
|
||||||
{
|
{
|
||||||
*(uint8_t *)(((size_t)Dest + j * Length + i) ^ 3) = *(uint8_t *)(((size_t)Source + j * Skip + i) ^ 3);
|
*(uint8_t *)(((size_t)Dest + j * Length + i) ^ 3) = *(uint8_t *)(((size_t)Source + j * Skip + i) ^ 3);
|
||||||
}
|
}
|
||||||
|
@ -54,9 +54,9 @@ void SP_DMA_READ (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (j = 0 ; j < Count; j++)
|
for (j = 0; j < Count; j++)
|
||||||
{
|
{
|
||||||
for (i = 0 ; i < Length; i++)
|
for (i = 0; i < Length; i++)
|
||||||
{
|
{
|
||||||
*(uint8_t *)(((size_t)Dest + i) ^ 3) = *(uint8_t *)(((size_t)Source + i) ^ 3);
|
*(uint8_t *)(((size_t)Dest + i) ^ 3) = *(uint8_t *)(((size_t)Source + i) ^ 3);
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ void SP_DMA_READ (void)
|
||||||
*RSPInfo.SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
*RSPInfo.SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SP_DMA_WRITE (void)
|
void SP_DMA_WRITE(void)
|
||||||
{
|
{
|
||||||
uint32_t i, j, Length, Skip, Count, addr;
|
uint32_t i, j, Length, Skip, Count, addr;
|
||||||
uint8_t *Dest, *Source;
|
uint8_t *Dest, *Source;
|
||||||
|
@ -102,9 +102,9 @@ void SP_DMA_WRITE (void)
|
||||||
Source = ((*RSPInfo.SP_MEM_ADDR_REG & 0x1000) != 0 ? RSPInfo.IMEM : RSPInfo.DMEM) + ((*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) & ~7);
|
Source = ((*RSPInfo.SP_MEM_ADDR_REG & 0x1000) != 0 ? RSPInfo.IMEM : RSPInfo.DMEM) + ((*RSPInfo.SP_MEM_ADDR_REG & 0xFFF) & ~7);
|
||||||
|
|
||||||
#if defined(RSP_SAFE_DMA)
|
#if defined(RSP_SAFE_DMA)
|
||||||
for (j = 0 ; j < Count; j++)
|
for (j = 0; j < Count; j++)
|
||||||
{
|
{
|
||||||
for (i = 0 ; i < Length; i++)
|
for (i = 0; i < Length; i++)
|
||||||
{
|
{
|
||||||
*(uint8_t *)(((size_t)Dest + j * Skip + i) ^ 3) = *(uint8_t *)(((size_t)Source + j * Length + i) ^ 3);
|
*(uint8_t *)(((size_t)Dest + j * Skip + i) ^ 3) = *(uint8_t *)(((size_t)Source + j * Length + i) ^ 3);
|
||||||
}
|
}
|
||||||
|
@ -121,9 +121,9 @@ void SP_DMA_WRITE (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (j = 0 ; j < Count; j++)
|
for (j = 0; j < Count; j++)
|
||||||
{
|
{
|
||||||
for (i = 0 ; i < Length; i++)
|
for (i = 0; i < Length; i++)
|
||||||
{
|
{
|
||||||
*(uint8_t *)(((size_t)Dest + i) ^ 3) = *(uint8_t *)(((size_t)Source + i) ^ 3);
|
*(uint8_t *)(((size_t)Dest + i) ^ 3) = *(uint8_t *)(((size_t)Source + i) ^ 3);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
void SP_DMA_READ ( void );
|
void SP_DMA_READ(void);
|
||||||
void SP_DMA_WRITE ( void );
|
void SP_DMA_WRITE(void);
|
||||||
|
|
|
@ -1,23 +1,22 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#include <Common/StdString.h>
|
|
||||||
#include <Common/File.h>
|
#include <Common/File.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
|
#include <Common/StdString.h>
|
||||||
#include <Common/path.h>
|
#include <Common/path.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Rsp.h"
|
|
||||||
#include "Rsp Registers.h"
|
#include "Rsp Registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
|
|
||||||
CLog * RDPLog = NULL;
|
CLog * RDPLog = NULL;
|
||||||
CLog * CPULog = NULL;
|
CLog * CPULog = NULL;
|
||||||
|
|
||||||
void StartCPULog ( void )
|
void StartCPULog(void)
|
||||||
{
|
{
|
||||||
if (CPULog == NULL)
|
if (CPULog == NULL)
|
||||||
{
|
{
|
||||||
CPath LogFile(CPath::MODULE_DIRECTORY,"RSP_x86Log.txt");
|
CPath LogFile(CPath::MODULE_DIRECTORY, "RSP_x86Log.txt");
|
||||||
LogFile.AppendDirectory("Logs");
|
LogFile.AppendDirectory("Logs");
|
||||||
|
|
||||||
CPULog = new CLog;
|
CPULog = new CLog;
|
||||||
|
@ -25,7 +24,7 @@ void StartCPULog ( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopCPULog ( void )
|
void StopCPULog(void)
|
||||||
{
|
{
|
||||||
if (CPULog != NULL)
|
if (CPULog != NULL)
|
||||||
{
|
{
|
||||||
|
@ -34,7 +33,7 @@ void StopCPULog ( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPU_Message ( const char * Message, ...)
|
void CPU_Message(const char * Message, ...)
|
||||||
{
|
{
|
||||||
if (CPULog == NULL)
|
if (CPULog == NULL)
|
||||||
{
|
{
|
||||||
|
@ -45,7 +44,7 @@ void CPU_Message ( const char * Message, ...)
|
||||||
|
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, Message);
|
va_start(args, Message);
|
||||||
Msg.ArgFormat(Message,args);
|
Msg.ArgFormat(Message, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
Msg += "\r\n";
|
Msg += "\r\n";
|
||||||
|
@ -53,21 +52,21 @@ void CPU_Message ( const char * Message, ...)
|
||||||
CPULog->Log(Msg.c_str());
|
CPULog->Log(Msg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartRDPLog ( void )
|
void StartRDPLog(void)
|
||||||
{
|
{
|
||||||
if (RDPLog == NULL)
|
if (RDPLog == NULL)
|
||||||
{
|
{
|
||||||
CPath LogFile(CPath::MODULE_DIRECTORY,"RDP_Log.txt");
|
CPath LogFile(CPath::MODULE_DIRECTORY, "RDP_Log.txt");
|
||||||
LogFile.AppendDirectory("Logs");
|
LogFile.AppendDirectory("Logs");
|
||||||
|
|
||||||
RDPLog = new CLog;
|
RDPLog = new CLog;
|
||||||
RDPLog->Open(LogFile);
|
RDPLog->Open(LogFile);
|
||||||
RDPLog->SetMaxFileSize(400 * 1024 * 1024);
|
RDPLog->SetMaxFileSize(400 * 1024 * 1024);
|
||||||
// RDPLog->SetFlush(true);
|
// RDPLog->SetFlush(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopRDPLog ( void )
|
void StopRDPLog(void)
|
||||||
{
|
{
|
||||||
if (RDPLog != NULL)
|
if (RDPLog != NULL)
|
||||||
{
|
{
|
||||||
|
@ -76,7 +75,7 @@ void StopRDPLog ( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_Message ( const char * Message, ...)
|
void RDP_Message(const char * Message, ...)
|
||||||
{
|
{
|
||||||
if (RDPLog == NULL)
|
if (RDPLog == NULL)
|
||||||
{
|
{
|
||||||
|
@ -87,7 +86,7 @@ void RDP_Message ( const char * Message, ...)
|
||||||
|
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, Message);
|
va_start(args, Message);
|
||||||
Msg.ArgFormat(Message,args);
|
Msg.ArgFormat(Message, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
Msg += "\r\n";
|
Msg += "\r\n";
|
||||||
|
@ -95,49 +94,50 @@ 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(DWORD PC, int Reg, DWORD Value)
|
||||||
{
|
{
|
||||||
if (RDPLog == NULL)
|
if (RDPLog == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (Reg) {
|
switch (Reg)
|
||||||
case 0: RDP_Message("%03X: Stored 0x%08X into SP_MEM_ADDR_REG",PC,Value); break;
|
{
|
||||||
case 1: RDP_Message("%03X: Stored 0x%08X into SP_DRAM_ADDR_REG",PC,Value); break;
|
case 0: RDP_Message("%03X: Stored 0x%08X into SP_MEM_ADDR_REG", PC, Value); break;
|
||||||
case 2: RDP_Message("%03X: Stored 0x%08X into SP_RD_LEN_REG",PC,Value); break;
|
case 1: RDP_Message("%03X: Stored 0x%08X into SP_DRAM_ADDR_REG", PC, Value); break;
|
||||||
case 3: RDP_Message("%03X: Stored 0x%08X into SP_WR_LEN_REG",PC,Value); break;
|
case 2: RDP_Message("%03X: Stored 0x%08X into SP_RD_LEN_REG", PC, Value); break;
|
||||||
case 4: RDP_Message("%03X: Stored 0x%08X into SP_STATUS_REG",PC,Value); break;
|
case 3: RDP_Message("%03X: Stored 0x%08X into SP_WR_LEN_REG", PC, Value); break;
|
||||||
case 5: RDP_Message("%03X: Stored 0x%08X into Reg 5 ???",PC,Value); break;
|
case 4: RDP_Message("%03X: Stored 0x%08X into SP_STATUS_REG", PC, Value); break;
|
||||||
case 6: RDP_Message("%03X: Stored 0x%08X into Reg 6 ???",PC,Value); break;
|
case 5: RDP_Message("%03X: Stored 0x%08X into Reg 5 ???", PC, Value); break;
|
||||||
case 7: RDP_Message("%03X: Stored 0x%08X into SP_SEMAPHORE_REG",PC,Value); break;
|
case 6: RDP_Message("%03X: Stored 0x%08X into Reg 6 ???", PC, Value); break;
|
||||||
case 8: RDP_Message("%03X: Stored 0x%08X into DPC_START_REG",PC,Value); break;
|
case 7: RDP_Message("%03X: Stored 0x%08X into SP_SEMAPHORE_REG", PC, Value); break;
|
||||||
case 9: RDP_Message("%03X: Stored 0x%08X into DPC_END_REG",PC,Value); break;
|
case 8: RDP_Message("%03X: Stored 0x%08X into DPC_START_REG", PC, Value); break;
|
||||||
case 10: RDP_Message("%03X: Stored 0x%08X into DPC_CURRENT_REG",PC,Value); break;
|
case 9: RDP_Message("%03X: Stored 0x%08X into DPC_END_REG", PC, Value); break;
|
||||||
case 11: RDP_Message("%03X: Stored 0x%08X into DPC_STATUS_REG",PC,Value); break;
|
case 10: RDP_Message("%03X: Stored 0x%08X into DPC_CURRENT_REG", PC, Value); break;
|
||||||
case 12: RDP_Message("%03X: Stored 0x%08X into DPC_CLOCK_REG",PC,Value); break;
|
case 11: RDP_Message("%03X: Stored 0x%08X into DPC_STATUS_REG", PC, Value); break;
|
||||||
|
case 12: RDP_Message("%03X: Stored 0x%08X into DPC_CLOCK_REG", PC, Value); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LogMF0 ( DWORD PC, int Reg )
|
void RDP_LogMF0(DWORD PC, int Reg)
|
||||||
{
|
{
|
||||||
switch (Reg) {
|
switch (Reg)
|
||||||
case 8: RDP_Message("%03X: Read 0x%08X from DPC_START_REG",PC,*RSPInfo.DPC_START_REG); break;
|
{
|
||||||
case 9: RDP_Message("%03X: Read 0x%08X from DPC_END_REG",PC,*RSPInfo.DPC_END_REG); break;
|
case 8: RDP_Message("%03X: Read 0x%08X from DPC_START_REG", PC, *RSPInfo.DPC_START_REG); break;
|
||||||
case 10: RDP_Message("%03X: Read 0x%08X from DPC_CURRENT_REG",PC,*RSPInfo.DPC_CURRENT_REG); break;
|
case 9: RDP_Message("%03X: Read 0x%08X from DPC_END_REG", PC, *RSPInfo.DPC_END_REG); break;
|
||||||
case 11: RDP_Message("%03X: Read 0x%08X from DPC_STATUS_REG",PC,*RSPInfo.DPC_STATUS_REG); break;
|
case 10: RDP_Message("%03X: Read 0x%08X from DPC_CURRENT_REG", PC, *RSPInfo.DPC_CURRENT_REG); break;
|
||||||
case 12: RDP_Message("%03X: Read 0x%08X from DPC_CLOCK_REG",PC,*RSPInfo.DPC_CLOCK_REG); break;
|
case 11: RDP_Message("%03X: Read 0x%08X from DPC_STATUS_REG", PC, *RSPInfo.DPC_STATUS_REG); break;
|
||||||
|
case 12: RDP_Message("%03X: Read 0x%08X from DPC_CLOCK_REG", PC, *RSPInfo.DPC_CLOCK_REG); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RDP_LogDlist(void)
|
||||||
void RDP_LogDlist ( void )
|
|
||||||
{
|
{
|
||||||
if (RDPLog == NULL)
|
if (RDPLog == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DWORD Length = *RSPInfo.DPC_END_REG - *RSPInfo.DPC_CURRENT_REG;
|
DWORD 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;
|
DWORD Pos = *RSPInfo.DPC_CURRENT_REG;
|
||||||
while (Pos < *RSPInfo.DPC_END_REG)
|
while (Pos < *RSPInfo.DPC_END_REG)
|
||||||
|
@ -145,8 +145,8 @@ void RDP_LogDlist ( void )
|
||||||
char Hex[100], Ascii[30];
|
char Hex[100], Ascii[30];
|
||||||
DWORD count;
|
DWORD 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;
|
BYTE * 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)
|
||||||
|
@ -154,43 +154,48 @@ void RDP_LogDlist ( void )
|
||||||
Mem = RSPInfo.RDRAM;
|
Mem = RSPInfo.RDRAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (count = 0; count < 0x10; count ++, Pos++ ) {
|
for (count = 0; count < 0x10; count++, Pos++)
|
||||||
|
{
|
||||||
char tmp[3];
|
char tmp[3];
|
||||||
if ((count % 4) != 0 || count == 0) {
|
if ((count % 4) != 0 || count == 0)
|
||||||
sprintf(tmp,"%02X",Mem[Pos]);
|
{
|
||||||
strcat(Hex," ");
|
sprintf(tmp, "%02X", Mem[Pos]);
|
||||||
strcat(Hex,tmp);
|
strcat(Hex, " ");
|
||||||
} else {
|
strcat(Hex, tmp);
|
||||||
sprintf(tmp,"%02X",Mem[Pos]);
|
}
|
||||||
strcat(Hex," - ");
|
else
|
||||||
strcat(Hex,tmp);
|
{
|
||||||
|
sprintf(tmp, "%02X", Mem[Pos]);
|
||||||
|
strcat(Hex, " - ");
|
||||||
|
strcat(Hex, tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Mem[Pos] < 30 || Mem[Pos] > 127)
|
||||||
if (Mem[Pos] < 30 || Mem[Pos] > 127) {
|
{
|
||||||
strcat(Ascii,".");
|
strcat(Ascii, ".");
|
||||||
} else {
|
}
|
||||||
sprintf(tmp,"%c",Mem[Pos]);
|
else
|
||||||
strcat(Ascii,tmp);
|
{
|
||||||
|
sprintf(tmp, "%c", Mem[Pos]);
|
||||||
|
strcat(Ascii, tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RDP_Message(" %s %s",Hex, Ascii);
|
RDP_Message(" %s %s", Hex, Ascii);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LogLoc ( DWORD /*PC*/ )
|
void RDP_LogLoc(DWORD /*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, *(DWORD *)&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
|
#ifdef old
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "RSP Registers.h"
|
#include "RSP Registers.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
#ifdef Log_x86Code
|
||||||
static HANDLE hCPULogFile = NULL;
|
static HANDLE hCPULogFile = NULL;
|
||||||
|
@ -201,61 +206,66 @@ static HANDLE hLogFile = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
#ifdef Log_x86Code
|
||||||
void CPU_Message (char * Message, ...) {
|
void CPU_Message(char * Message, ...)
|
||||||
|
{
|
||||||
DWORD dwWritten;
|
DWORD dwWritten;
|
||||||
char Msg[400];
|
char Msg[400];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start( ap, Message );
|
va_start(ap, Message);
|
||||||
vsprintf( Msg, Message, ap );
|
vsprintf(Msg, Message, ap);
|
||||||
va_end( ap );
|
va_end(ap);
|
||||||
|
|
||||||
strcat(Msg,"\r\n");
|
strcat(Msg, "\r\n");
|
||||||
WriteFile( hCPULogFile,Msg,strlen(Msg),&dwWritten,NULL );
|
WriteFile(hCPULogFile, Msg, strlen(Msg), &dwWritten, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GenerateLog
|
#ifdef GenerateLog
|
||||||
void Log_Message (char * Message, ...) {
|
void Log_Message(char * Message, ...)
|
||||||
|
{
|
||||||
DWORD dwWritten;
|
DWORD dwWritten;
|
||||||
char Msg[400];
|
char Msg[400];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start( ap, Message );
|
va_start(ap, Message);
|
||||||
vsprintf( Msg, Message, ap );
|
vsprintf(Msg, Message, ap);
|
||||||
va_end( ap );
|
va_end(ap);
|
||||||
|
|
||||||
strcat(Msg,"\r\n");
|
strcat(Msg, "\r\n");
|
||||||
|
|
||||||
WriteFile( hLogFile,Msg,strlen(Msg),&dwWritten,NULL );
|
WriteFile(hLogFile, Msg, strlen(Msg), &dwWritten, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
#ifdef Log_x86Code
|
||||||
void Start_x86_Log (void) {
|
void Start_x86_Log(void)
|
||||||
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR];
|
{
|
||||||
|
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
||||||
char File[_MAX_PATH];
|
char File[_MAX_PATH];
|
||||||
|
|
||||||
GetModuleFileName(NULL,path_buffer,_MAX_PATH);
|
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
|
||||||
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
||||||
|
|
||||||
sprintf(File, "%s%s\\RSPx86Log.log", drive, dir);
|
sprintf(File, "%s%s\\RSPx86Log.log", drive, dir);
|
||||||
|
|
||||||
hCPULogFile = CreateFile(File,GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS,
|
hCPULogFile = CreateFile(File, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||||
SetFilePointer(hCPULogFile,0,NULL,FILE_BEGIN);
|
SetFilePointer(hCPULogFile, 0, NULL, FILE_BEGIN);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GenerateLog
|
#ifdef GenerateLog
|
||||||
void Log_MT_CP0 ( unsigned int PC, int CP0Reg, int Value ) {
|
void Log_MT_CP0(unsigned int PC, int CP0Reg, int Value)
|
||||||
switch (CP0Reg) {
|
{
|
||||||
|
switch (CP0Reg)
|
||||||
|
{
|
||||||
//case 0: Log_Message("%03X: Stored 0x%08X in SP_MEM_ADDR_REG",PC,Value); break;
|
//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 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 2: Log_Message("%03X: Stored 0x%08X in SP_RD_LEN_REG",PC,Value); break;
|
||||||
case 3:
|
case 3:
|
||||||
//Log_Message("%03X: Stored 0x%08X in SP_WR_LEN_REG",PC,Value);
|
//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("Instruction: %08X%08X", RSP_GPR[25].UW, RSP_GPR[24].UW);
|
||||||
//Log_Message("");
|
//Log_Message("");
|
||||||
break;
|
break;
|
||||||
/*case 4: Log_Message("%03X: Stored 0x%08X in SP_STATUS_REG",PC,Value); break;
|
/*case 4: Log_Message("%03X: Stored 0x%08X in SP_STATUS_REG",PC,Value); break;
|
||||||
|
@ -276,22 +286,25 @@ void Log_MT_CP0 ( unsigned int PC, int CP0Reg, int Value ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Start_Log (void) {
|
void Start_Log(void)
|
||||||
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR];
|
{
|
||||||
|
char path_buffer[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR];
|
||||||
char File[_MAX_PATH];
|
char File[_MAX_PATH];
|
||||||
|
|
||||||
GetModuleFileName(NULL,path_buffer,_MAX_PATH);
|
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
|
||||||
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
_splitpath(path_buffer, drive, dir, NULL, NULL);
|
||||||
|
|
||||||
sprintf(File, "%s%s\\RSP.log", drive, dir);
|
sprintf(File, "%s%s\\RSP.log", drive, dir);
|
||||||
|
|
||||||
hLogFile = CreateFile(File,GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS,
|
hLogFile = CreateFile(File, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
|
||||||
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||||
SetFilePointer(hLogFile,0,NULL,FILE_BEGIN);
|
SetFilePointer(hLogFile, 0, NULL, FILE_BEGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stop_Log (void) {
|
void Stop_Log(void)
|
||||||
if (hLogFile) {
|
{
|
||||||
|
if (hLogFile)
|
||||||
|
{
|
||||||
CloseHandle(hLogFile);
|
CloseHandle(hLogFile);
|
||||||
hLogFile = NULL;
|
hLogFile = NULL;
|
||||||
}
|
}
|
||||||
|
@ -299,8 +312,10 @@ void Stop_Log (void) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Log_x86Code
|
#ifdef Log_x86Code
|
||||||
void Stop_x86_Log (void) {
|
void Stop_x86_Log(void)
|
||||||
if (hCPULogFile) {
|
{
|
||||||
|
if (hCPULogFile)
|
||||||
|
{
|
||||||
CloseHandle(hCPULogFile);
|
CloseHandle(hCPULogFile);
|
||||||
hCPULogFile = NULL;
|
hCPULogFile = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
void StartCPULog ( void );
|
#include <windows.h>
|
||||||
void StopCPULog ( void );
|
|
||||||
void CPU_Message ( const char * Message, ...);
|
|
||||||
|
|
||||||
void StartRDPLog ( void );
|
void StartCPULog(void);
|
||||||
void StopRDPLog ( void );
|
void StopCPULog(void);
|
||||||
void RDP_Message ( const char * Message, ...);
|
void CPU_Message(const char * Message, ...);
|
||||||
void RDP_LogDlist ( void );
|
|
||||||
void RDP_LogMT0 ( DWORD PC, int Reg, DWORD Value );
|
void StartRDPLog(void);
|
||||||
void RDP_LogMF0 ( DWORD PC, int Reg );
|
void StopRDPLog(void);
|
||||||
void RDP_LogLoc ( DWORD PC );
|
void RDP_Message(const char * Message, ...);
|
||||||
|
void RDP_LogDlist(void);
|
||||||
|
void RDP_LogMT0(DWORD PC, int Reg, DWORD Value);
|
||||||
|
void RDP_LogMF0(DWORD PC, int Reg);
|
||||||
|
void RDP_LogLoc(DWORD PC);
|
|
@ -1,36 +1,46 @@
|
||||||
enum { MaxMaps = 32 };
|
enum
|
||||||
|
{
|
||||||
|
MaxMaps = 32
|
||||||
|
};
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "Rsp.h"
|
|
||||||
#include "RSP Registers.h"
|
#include "RSP Registers.h"
|
||||||
|
#include "Rsp.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
DWORD NoOfMaps, MapsCRC[MaxMaps];
|
DWORD NoOfMaps, MapsCRC[MaxMaps];
|
||||||
uint32_t Table;
|
uint32_t Table;
|
||||||
BYTE * RecompCode, * RecompCodeSecondary, * RecompPos, *JumpTables;
|
BYTE *RecompCode, *RecompCodeSecondary, *RecompPos, *JumpTables;
|
||||||
void ** JumpTable;
|
void ** JumpTable;
|
||||||
|
|
||||||
int AllocateMemory (void) {
|
int AllocateMemory(void)
|
||||||
if (RecompCode == NULL){
|
{
|
||||||
RecompCode=(BYTE *) VirtualAlloc( NULL, 0x00400004, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
if (RecompCode == NULL)
|
||||||
RecompCode=(BYTE *) VirtualAlloc( RecompCode, 0x00400000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
{
|
||||||
|
RecompCode = (BYTE *)VirtualAlloc(NULL, 0x00400004, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
||||||
|
RecompCode = (BYTE *)VirtualAlloc(RecompCode, 0x00400000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||||
|
|
||||||
if(RecompCode == NULL) {
|
if (RecompCode == NULL)
|
||||||
|
{
|
||||||
DisplayError("Not enough memory for RSP RecompCode!");
|
DisplayError("Not enough memory for RSP RecompCode!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RecompCodeSecondary == NULL){
|
if (RecompCodeSecondary == NULL)
|
||||||
RecompCodeSecondary = (BYTE *)VirtualAlloc( NULL, 0x00200000, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
|
{
|
||||||
if(RecompCodeSecondary == NULL) {
|
RecompCodeSecondary = (BYTE *)VirtualAlloc(NULL, 0x00200000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
||||||
|
if (RecompCodeSecondary == NULL)
|
||||||
|
{
|
||||||
DisplayError("Not enough memory for RSP RecompCode Secondary!");
|
DisplayError("Not enough memory for RSP RecompCode Secondary!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JumpTables == NULL){
|
if (JumpTables == NULL)
|
||||||
JumpTables = (BYTE *)VirtualAlloc( NULL, 0x1000 * MaxMaps, MEM_COMMIT, PAGE_READWRITE );
|
{
|
||||||
if( JumpTables == NULL ) {
|
JumpTables = (BYTE *)VirtualAlloc(NULL, 0x1000 * MaxMaps, MEM_COMMIT, PAGE_READWRITE);
|
||||||
|
if (JumpTables == NULL)
|
||||||
|
{
|
||||||
DisplayError("Not enough memory for jump table!");
|
DisplayError("Not enough memory for jump table!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -42,24 +52,26 @@ int AllocateMemory (void) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreeMemory (void) {
|
void FreeMemory(void)
|
||||||
VirtualFree( RecompCode, 0 , MEM_RELEASE);
|
{
|
||||||
VirtualFree( JumpTable, 0 , MEM_RELEASE);
|
VirtualFree(RecompCode, 0, MEM_RELEASE);
|
||||||
VirtualFree( RecompCodeSecondary, 0 , MEM_RELEASE);
|
VirtualFree(JumpTable, 0, MEM_RELEASE);
|
||||||
|
VirtualFree(RecompCodeSecondary, 0, MEM_RELEASE);
|
||||||
|
|
||||||
RecompCode = NULL;
|
RecompCode = NULL;
|
||||||
JumpTables = NULL;
|
JumpTables = NULL;
|
||||||
RecompCodeSecondary = NULL;
|
RecompCodeSecondary = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetJumpTables ( void )
|
void ResetJumpTables(void)
|
||||||
{
|
{
|
||||||
memset(JumpTables,0,0x1000 * MaxMaps);
|
memset(JumpTables, 0, 0x1000 * MaxMaps);
|
||||||
RecompPos = RecompCode;
|
RecompPos = RecompCode;
|
||||||
NoOfMaps = 0;
|
NoOfMaps = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetJumpTable (uint32_t End) {
|
void SetJumpTable(uint32_t End)
|
||||||
|
{
|
||||||
DWORD CRC, count;
|
DWORD CRC, count;
|
||||||
|
|
||||||
CRC = 0;
|
CRC = 0;
|
||||||
|
@ -73,19 +85,23 @@ void SetJumpTable (uint32_t End) {
|
||||||
End = 0x800;
|
End = 0x800;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (count = 0; count < End; count += 0x40) {
|
for (count = 0; count < End; count += 0x40)
|
||||||
|
{
|
||||||
CRC += *(DWORD *)(RSPInfo.IMEM + count);
|
CRC += *(DWORD *)(RSPInfo.IMEM + count);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (count = 0; count < NoOfMaps; count++ ) {
|
for (count = 0; count < NoOfMaps; count++)
|
||||||
if (CRC == MapsCRC[count]) {
|
{
|
||||||
|
if (CRC == MapsCRC[count])
|
||||||
|
{
|
||||||
JumpTable = (void **)(JumpTables + count * 0x1000);
|
JumpTable = (void **)(JumpTables + count * 0x1000);
|
||||||
Table = count;
|
Table = count;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//DisplayError("%X %X",NoOfMaps,CRC);
|
//DisplayError("%X %X",NoOfMaps,CRC);
|
||||||
if (NoOfMaps == MaxMaps) {
|
if (NoOfMaps == MaxMaps)
|
||||||
|
{
|
||||||
ResetJumpTables();
|
ResetJumpTables();
|
||||||
}
|
}
|
||||||
MapsCRC[NoOfMaps] = CRC;
|
MapsCRC[NoOfMaps] = CRC;
|
||||||
|
@ -94,38 +110,44 @@ void SetJumpTable (uint32_t End) {
|
||||||
NoOfMaps += 1;
|
NoOfMaps += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LB_DMEM ( uint32_t Addr, uint8_t * Value ) {
|
void RSP_LB_DMEM(uint32_t Addr, uint8_t * Value)
|
||||||
|
{
|
||||||
*Value = *(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
*Value = *(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LBV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LBV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - element] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[15 - element] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LDV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LDV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count;
|
int length, Count;
|
||||||
|
|
||||||
length = 8;
|
length = 8;
|
||||||
if (length > 16 - element) {
|
if (length > 16 - element)
|
||||||
|
{
|
||||||
length = 16 - element;
|
length = 16 - element;
|
||||||
}
|
}
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LFV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LFV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, count;
|
int length, count;
|
||||||
VECTOR Temp;
|
VECTOR Temp;
|
||||||
|
|
||||||
length = 8;
|
length = 8;
|
||||||
if (length > 16 - element) {
|
if (length > 16 - element)
|
||||||
|
{
|
||||||
length = 16 - element;
|
length = 16 - element;
|
||||||
}
|
}
|
||||||
|
|
||||||
Temp.HW[7] = *(RSPInfo.DMEM + (((Addr + element) ^3) & 0xFFF)) << 7;
|
Temp.HW[7] = *(RSPInfo.DMEM + (((Addr + element) ^ 3) & 0xFFF)) << 7;
|
||||||
Temp.HW[6] = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
Temp.HW[6] = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
||||||
Temp.HW[5] = *(RSPInfo.DMEM + (((Addr + ((0x8 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
Temp.HW[5] = *(RSPInfo.DMEM + (((Addr + ((0x8 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
||||||
Temp.HW[4] = *(RSPInfo.DMEM + (((Addr + ((0xC - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
Temp.HW[4] = *(RSPInfo.DMEM + (((Addr + ((0xC - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
||||||
|
@ -134,14 +156,18 @@ void RSP_LFV_DMEM ( uint32_t Addr, int vect, int element ) {
|
||||||
Temp.HW[1] = *(RSPInfo.DMEM + (((Addr + ((0x10 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
Temp.HW[1] = *(RSPInfo.DMEM + (((Addr + ((0x10 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
||||||
Temp.HW[0] = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
Temp.HW[0] = *(RSPInfo.DMEM + (((Addr + ((0x4 - element) ^ 3) & 0xf)) & 0xFFF)) << 7;
|
||||||
|
|
||||||
for (count = element; count < (length + element); count ++ ){
|
for (count = element; count < (length + element); count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - count] = Temp.B[15 - count];
|
RSP_Vect[vect].B[15 - count] = Temp.B[15 - count];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LH_DMEM ( uint32_t Addr, uint16_t * Value ) {
|
void RSP_LH_DMEM(uint32_t Addr, uint16_t * Value)
|
||||||
if ((Addr & 0x1) != 0) {
|
{
|
||||||
if (Addr > 0xFFE) {
|
if ((Addr & 0x1) != 0)
|
||||||
|
{
|
||||||
|
if (Addr > 0xFFE)
|
||||||
|
{
|
||||||
DisplayError("There is a problem with:\nRSP_LH_DMEM");
|
DisplayError("There is a problem with:\nRSP_LH_DMEM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -153,92 +179,105 @@ void RSP_LH_DMEM ( uint32_t Addr, uint16_t * Value ) {
|
||||||
*Value = *(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF));
|
*Value = *(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LHV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LHV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^3) & 0xFFF)) << 7;
|
{
|
||||||
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 8) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 10) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 8) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 12) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 10) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 14) & 0xF) ^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 12) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
|
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 14) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LLV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LLV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count;
|
int length, Count;
|
||||||
|
|
||||||
length = 4;
|
length = 4;
|
||||||
if (length > 16 - element) {
|
if (length > 16 - element)
|
||||||
|
{
|
||||||
length = 16 - element;
|
length = 16 - element;
|
||||||
}
|
}
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LPV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LPV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF)^3) & 0xFFF)) << 8;
|
{
|
||||||
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF)^3) & 0xFFF)) << 8;
|
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
|
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF) ^ 3) & 0xFFF)) << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LRV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LRV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count, offset;
|
int length, Count, offset;
|
||||||
|
|
||||||
offset = (Addr & 0xF) - 1;
|
offset = (Addr & 0xF) - 1;
|
||||||
length = (Addr & 0xF) - element;
|
length = (Addr & 0xF) - element;
|
||||||
Addr &= 0xFF0;
|
Addr &= 0xFF0;
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[offset - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[offset - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LQV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LQV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count;
|
int length, Count;
|
||||||
|
|
||||||
length = ((Addr + 0x10) & ~0xF) - Addr;
|
length = ((Addr + 0x10) & ~0xF) - Addr;
|
||||||
if (length > 16 - element) {
|
if (length > 16 - element)
|
||||||
|
{
|
||||||
length = 16 - element;
|
length = 16 - element;
|
||||||
}
|
}
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LSV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LSV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count;
|
int length, Count;
|
||||||
|
|
||||||
length = 2;
|
length = 2;
|
||||||
if (length > 16 - element) {
|
if (length > 16 - element)
|
||||||
|
{
|
||||||
length = 16 - element;
|
length = 16 - element;
|
||||||
}
|
}
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
RSP_Vect[vect].B[15 - Count] = *(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF));
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LTV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LTV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int del, count, length;
|
int del, count, length;
|
||||||
|
|
||||||
length = 8;
|
length = 8;
|
||||||
if (length > 32 - vect) {
|
if (length > 32 - vect)
|
||||||
|
{
|
||||||
length = 32 - vect;
|
length = 32 - vect;
|
||||||
}
|
}
|
||||||
|
|
||||||
Addr = ((Addr + 8) & 0xFF0) + (element & 0x1);
|
Addr = ((Addr + 8) & 0xFF0) + (element & 0x1);
|
||||||
for (count = 0; count < length; count ++) {
|
for (count = 0; count < length; count++)
|
||||||
|
{
|
||||||
del = ((8 - (element >> 1) + count) << 1) & 0xF;
|
del = ((8 - (element >> 1) + count) << 1) & 0xF;
|
||||||
RSP_Vect[vect + count].B[15 - del] = *(RSPInfo.DMEM + (Addr ^ 3));
|
RSP_Vect[vect + count].B[15 - del] = *(RSPInfo.DMEM + (Addr ^ 3));
|
||||||
RSP_Vect[vect + count].B[14 - del] = *(RSPInfo.DMEM + ((Addr + 1) ^ 3));
|
RSP_Vect[vect + count].B[14 - del] = *(RSPInfo.DMEM + ((Addr + 1) ^ 3));
|
||||||
|
@ -246,21 +285,25 @@ void RSP_LTV_DMEM ( uint32_t Addr, int vect, int element ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LUV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_LUV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF)^3) & 0xFFF)) << 7;
|
{
|
||||||
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[7] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[6] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 1) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[5] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 2) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[4] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 3) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[3] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 4) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[2] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 5) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF)^3) & 0xFFF)) << 7;
|
RSP_Vect[vect].HW[1] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 6) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
|
RSP_Vect[vect].HW[0] = *(RSPInfo.DMEM + ((Addr + ((0x10 - element + 7) & 0xF) ^ 3) & 0xFFF)) << 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LW_DMEM ( uint32_t Addr, uint32_t * Value ) {
|
void RSP_LW_DMEM(uint32_t Addr, uint32_t * Value)
|
||||||
if ((Addr & 0x3) != 0) {
|
{
|
||||||
|
if ((Addr & 0x3) != 0)
|
||||||
|
{
|
||||||
Addr &= 0xFFF;
|
Addr &= 0xFFF;
|
||||||
if (Addr > 0xFFC) {
|
if (Addr > 0xFFC)
|
||||||
|
{
|
||||||
DisplayError("There is a problem with:\nRSP_LW_DMEM");
|
DisplayError("There is a problem with:\nRSP_LW_DMEM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -273,177 +316,195 @@ void RSP_LW_DMEM ( uint32_t Addr, uint32_t * Value ) {
|
||||||
*Value = *(uint32_t *)(RSPInfo.DMEM + (Addr & 0xFFF));
|
*Value = *(uint32_t *)(RSPInfo.DMEM + (Addr & 0xFFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_LW_IMEM ( uint32_t Addr, uint32_t * Value ) {
|
void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value)
|
||||||
if ((Addr & 0x3) != 0) {
|
{
|
||||||
|
if ((Addr & 0x3) != 0)
|
||||||
|
{
|
||||||
DisplayError("Unaligned RSP_LW_IMEM");
|
DisplayError("Unaligned RSP_LW_IMEM");
|
||||||
}
|
}
|
||||||
*Value = *(uint32_t *)(RSPInfo.IMEM + (Addr & 0xFFF));
|
*Value = *(uint32_t *)(RSPInfo.IMEM + (Addr & 0xFFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SB_DMEM ( uint32_t Addr, uint8_t Value ) {
|
void RSP_SB_DMEM(uint32_t Addr, uint8_t Value)
|
||||||
|
{
|
||||||
*(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = Value;
|
*(uint8_t *)(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SBV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SBV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - element];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - element];
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SDV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SDV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
for (Count = element; Count < (8 + element); Count ++ ){
|
for (Count = element; Count < (8 + element); Count++)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SFV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SFV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int offset = Addr & 0xF;
|
int offset = Addr & 0xF;
|
||||||
Addr &= 0xFF0;
|
Addr &= 0xFF0;
|
||||||
|
|
||||||
switch (element) {
|
switch (element)
|
||||||
|
{
|
||||||
case 0:
|
case 0:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)^3))) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF) ^ 3))) = 0;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[2] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[1] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[0] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[3] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = 0;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = 0;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = 0;
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
*(RSPInfo.DMEM + ((Addr + offset)^3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + offset) ^ 3)) = (RSP_Vect[vect].UHW[7] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF))^3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 4) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[6] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF))^3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 8) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[5] >> 7) & 0xFF;
|
||||||
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF))^3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
*(RSPInfo.DMEM + ((Addr + ((offset + 12) & 0xF)) ^ 3)) = (RSP_Vect[vect].UHW[4] >> 7) & 0xFF;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SH_DMEM ( uint32_t Addr, uint16_t Value ) {
|
void RSP_SH_DMEM(uint32_t Addr, uint16_t Value)
|
||||||
if ((Addr & 0x1) != 0) {
|
{
|
||||||
|
if ((Addr & 0x1) != 0)
|
||||||
|
{
|
||||||
DisplayError("Unaligned RSP_SH_DMEM");
|
DisplayError("Unaligned RSP_SH_DMEM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF)) = Value;
|
*(uint16_t *)(RSPInfo.DMEM + ((Addr ^ 2) & 0xFFF)) = Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SHV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SHV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
*(RSPInfo.DMEM + ((Addr^3) & 0xFFF)) = (RSP_Vect[vect].UB[(15 - element) & 0xF] << 1) +
|
{
|
||||||
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(15 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(14 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(14 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 2)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(13 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 2) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(13 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(12 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(12 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 4)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(11 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 4) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(11 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(10 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(10 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 6)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(9 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 6) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(9 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(8 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(8 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 8)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(7 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 8) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(7 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(6 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(6 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 10)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(5 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 10) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(5 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(4 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(4 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 12)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(3 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 12) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(3 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(2 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(2 - element) & 0xF] >> 7);
|
||||||
*(RSPInfo.DMEM + (((Addr + 14)^3) & 0xFFF)) = (RSP_Vect[vect].UB[(1 - element) & 0xF] << 1) +
|
*(RSPInfo.DMEM + (((Addr + 14) ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[(1 - element) & 0xF] << 1) +
|
||||||
(RSP_Vect[vect].UB[(0 - element) & 0xF] >> 7);
|
(RSP_Vect[vect].UB[(0 - element) & 0xF] >> 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SLV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SLV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
for (Count = element; Count < (4 + element); Count ++ ){
|
for (Count = element; Count < (4 + element); Count++)
|
||||||
*(RSPInfo.DMEM + ((Addr ^3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
{
|
||||||
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SPV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SPV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
for (Count = element; Count < (8 + element); Count ++ ){
|
for (Count = element; Count < (8 + element); Count++)
|
||||||
if (((Count) & 0xF) < 8) {
|
{
|
||||||
|
if (((Count)&0xF) < 8)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].UB[15 - ((Count & 0xF) << 1)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].UB[15 - ((Count & 0xF) << 1)];
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)] << 1) +
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = (RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)] << 1) +
|
||||||
(RSP_Vect[vect].UB[14 - ((Count & 0x7) << 1)] >> 7);
|
(RSP_Vect[vect].UB[14 - ((Count & 0x7) << 1)] >> 7);
|
||||||
}
|
}
|
||||||
|
@ -451,47 +512,56 @@ void RSP_SPV_DMEM ( uint32_t Addr, int vect, int element ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SQV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SQV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count;
|
int length, Count;
|
||||||
|
|
||||||
length = ((Addr + 0x10) & ~0xF) - Addr;
|
length = ((Addr + 0x10) & ~0xF) - Addr;
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SRV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SRV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int length, Count, offset;
|
int length, Count, offset;
|
||||||
|
|
||||||
length = (Addr & 0xF);
|
length = (Addr & 0xF);
|
||||||
offset = (0x10 - length) & 0xF;
|
offset = (0x10 - length) & 0xF;
|
||||||
Addr &= 0xFF0;
|
Addr &= 0xFF0;
|
||||||
for (Count = element; Count < (length + element); Count ++ ){
|
for (Count = element; Count < (length + element); Count++)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - ((Count + offset) & 0xF)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - ((Count + offset) & 0xF)];
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SSV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SSV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
for (Count = element; Count < (2 + element); Count ++ ){
|
for (Count = element; Count < (2 + element); Count++)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_STV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_STV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int del, count, length;
|
int del, count, length;
|
||||||
|
|
||||||
length = 8;
|
length = 8;
|
||||||
if (length > 32 - vect) {
|
if (length > 32 - vect)
|
||||||
|
{
|
||||||
length = 32 - vect;
|
length = 32 - vect;
|
||||||
}
|
}
|
||||||
length = length << 1;
|
length = length << 1;
|
||||||
del = element >> 1;
|
del = element >> 1;
|
||||||
for (count = 0; count < length; count += 2) {
|
for (count = 0; count < length; count += 2)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect + del].UB[15 - count];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect + del].UB[15 - count];
|
||||||
*(RSPInfo.DMEM + (((Addr + 1) ^ 3) & 0xFFF)) = RSP_Vect[vect + del].UB[14 - count];
|
*(RSPInfo.DMEM + (((Addr + 1) ^ 3) & 0xFFF)) = RSP_Vect[vect + del].UB[14 - count];
|
||||||
del = (del + 1) & 7;
|
del = (del + 1) & 7;
|
||||||
|
@ -499,24 +569,33 @@ void RSP_STV_DMEM ( uint32_t Addr, int vect, int element ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SUV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SUV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
for (Count = element; Count < (8 + element); Count ++ ){
|
for (Count = element; Count < (8 + element); Count++)
|
||||||
if (((Count) & 0xF) < 8) {
|
{
|
||||||
|
if (((Count)&0xF) < 8)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = ((RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)] << 1) +
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = ((RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)] << 1) +
|
||||||
(RSP_Vect[vect].UB[14 - ((Count & 0x7) << 1)] >> 7)) & 0xFF;
|
(RSP_Vect[vect].UB[14 - ((Count & 0x7) << 1)] >> 7)) &
|
||||||
} else {
|
0xFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)];
|
*(RSPInfo.DMEM + ((Addr ^ 3) & 0xFFF)) = RSP_Vect[vect].UB[15 - ((Count & 0x7) << 1)];
|
||||||
}
|
}
|
||||||
Addr += 1;
|
Addr += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SW_DMEM ( uint32_t Addr, uint32_t Value ) {
|
void RSP_SW_DMEM(uint32_t Addr, uint32_t Value)
|
||||||
|
{
|
||||||
Addr &= 0xFFF;
|
Addr &= 0xFFF;
|
||||||
if ((Addr & 0x3) != 0) {
|
if ((Addr & 0x3) != 0)
|
||||||
if (Addr > 0xFFC) {
|
{
|
||||||
|
if (Addr > 0xFFC)
|
||||||
|
{
|
||||||
DisplayError("There is a problem with:\nRSP_SW_DMEM");
|
DisplayError("There is a problem with:\nRSP_SW_DMEM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -529,12 +608,14 @@ void RSP_SW_DMEM ( uint32_t Addr, uint32_t Value ) {
|
||||||
*(uint32_t *)(RSPInfo.DMEM + Addr) = Value;
|
*(uint32_t *)(RSPInfo.DMEM + Addr) = Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RSP_SWV_DMEM ( uint32_t Addr, int vect, int element ) {
|
void RSP_SWV_DMEM(uint32_t Addr, int vect, int element)
|
||||||
|
{
|
||||||
int Count, offset;
|
int Count, offset;
|
||||||
|
|
||||||
offset = Addr & 0xF;
|
offset = Addr & 0xF;
|
||||||
Addr &= 0xFF0;
|
Addr &= 0xFF0;
|
||||||
for (Count = element; Count < (16 + element); Count ++ ){
|
for (Count = element; Count < (16 + element); Count++)
|
||||||
|
{
|
||||||
*(RSPInfo.DMEM + ((Addr + (offset & 0xF)) ^ 3)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
*(RSPInfo.DMEM + ((Addr + (offset & 0xF)) ^ 3)) = RSP_Vect[vect].B[15 - (Count & 0xF)];
|
||||||
offset += 1;
|
offset += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +1,40 @@
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
int AllocateMemory ( void );
|
int AllocateMemory(void);
|
||||||
void FreeMemory ( void );
|
void FreeMemory(void);
|
||||||
void SetJumpTable (uint32_t End);
|
void SetJumpTable(uint32_t End);
|
||||||
|
|
||||||
extern uint8_t * RecompCode, * RecompCodeSecondary, * RecompPos;
|
extern uint8_t *RecompCode, *RecompCodeSecondary, *RecompPos;
|
||||||
extern void ** JumpTable;
|
extern void ** JumpTable;
|
||||||
extern uint32_t Table;
|
extern uint32_t Table;
|
||||||
|
|
||||||
void RSP_LB_DMEM ( uint32_t Addr, uint8_t * Value );
|
void RSP_LB_DMEM(uint32_t Addr, uint8_t * Value);
|
||||||
void RSP_LBV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LBV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LDV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LDV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LFV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LFV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LH_DMEM ( uint32_t Addr, uint16_t * Value );
|
void RSP_LH_DMEM(uint32_t Addr, uint16_t * Value);
|
||||||
void RSP_LHV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LHV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LLV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LLV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LPV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LPV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LRV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LRV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LQV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LQV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LSV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LSV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LTV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LTV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LUV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_LUV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_LW_DMEM ( uint32_t Addr, uint32_t * Value );
|
void RSP_LW_DMEM(uint32_t Addr, uint32_t * Value);
|
||||||
void RSP_LW_IMEM ( uint32_t Addr, uint32_t * Value );
|
void RSP_LW_IMEM(uint32_t Addr, uint32_t * Value);
|
||||||
void RSP_SB_DMEM ( uint32_t Addr, uint8_t Value );
|
void RSP_SB_DMEM(uint32_t Addr, uint8_t Value);
|
||||||
void RSP_SBV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SBV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SDV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SDV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SFV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SFV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SH_DMEM ( uint32_t Addr, uint16_t Value );
|
void RSP_SH_DMEM(uint32_t Addr, uint16_t Value);
|
||||||
void RSP_SHV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SHV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SLV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SLV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SPV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SPV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SQV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SQV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SRV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SRV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SSV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SSV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_STV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_STV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SUV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SUV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
void RSP_SW_DMEM ( uint32_t Addr, uint32_t Value );
|
void RSP_SW_DMEM(uint32_t Addr, uint32_t Value);
|
||||||
void RSP_SWV_DMEM ( uint32_t Addr, int vect, int element );
|
void RSP_SWV_DMEM(uint32_t Addr, int vect, int element);
|
||||||
|
|
|
@ -9,12 +9,15 @@ cd /d %origdir%
|
||||||
set ScanDir[0]="%base_dir%\Source\Common"
|
set ScanDir[0]="%base_dir%\Source\Common"
|
||||||
set ScanDir[1]="%base_dir%\Source\Project64"
|
set ScanDir[1]="%base_dir%\Source\Project64"
|
||||||
set ScanDir[2]="%base_dir%\Source\Project64-core"
|
set ScanDir[2]="%base_dir%\Source\Project64-core"
|
||||||
|
set ScanDir[3]="%base_dir%\Source\RSP"
|
||||||
|
|
||||||
set ScanFiles[0]="*.cpp"
|
set ScanFiles[0]="*.cpp"
|
||||||
set ScanFiles[1]="*.h"
|
set ScanFiles[1]="*.h"
|
||||||
|
|
||||||
set Exclude[0]="%base_dir%\Source\Project64-core\Version.h"
|
set Exclude[0]="%base_dir%\Source\Project64-core\Version.h"
|
||||||
set Exclude[1]="%base_dir%\Source\Project64\UserInterface\resource.h"
|
set Exclude[1]="%base_dir%\Source\Project64\UserInterface\resource.h"
|
||||||
|
set Exclude[2]="%base_dir%\Source\RSP\Version.h"
|
||||||
|
set Exclude[3]="%base_dir%\Source\RSP\resource.h"
|
||||||
|
|
||||||
set ValidParam=0
|
set ValidParam=0
|
||||||
if "%1" == "check" set ValidParam=1
|
if "%1" == "check" set ValidParam=1
|
||||||
|
|
Loading…
Reference in New Issue