git-svn-id: https://localhost/svn/Project64/trunk@47 111125ac-702d-7242-af9c-5ba8ae61c1ef
This commit is contained in:
parent
49d660df78
commit
f6cfb46c57
|
@ -13673,30 +13673,25 @@ SP Hack=No
|
|||
Core Note=
|
||||
|
||||
[635A2BFF-8B022326-C:45]
|
||||
Good Name=Super Mario 64 (U)
|
||||
Internal Name=SUPER MARIO 64
|
||||
RDRAM Size=4
|
||||
Counter Factor=2
|
||||
Save Type=First Save Type
|
||||
CPU Type=Recompiler
|
||||
Self-modifying code Method=Cache
|
||||
Use TLB=Yes
|
||||
Linking=Global
|
||||
Reg Cache=Yes
|
||||
Use Large Buffer=No
|
||||
Delay SI=No
|
||||
SP Hack=No
|
||||
Status=Compatible
|
||||
Plugin Note=[video] missing:dissolve effect (see GameFAQ)
|
||||
Core Note=
|
||||
Clear Frame=0
|
||||
Self Texture=0
|
||||
Primary Frame Buffer=0
|
||||
//Resolution Width=-1
|
||||
//Resolution Height=-1
|
||||
Core Note=
|
||||
Culling=1
|
||||
Emulate Clear=0
|
||||
FuncFind=2
|
||||
Good Name=Super Mario 64 (U)
|
||||
Internal Name=SUPER MARIO 64
|
||||
Linking=On
|
||||
MD5=49FBF9C744C458405F685D42B762A0BE
|
||||
Plugin Note=[video] missing:dissolve effect (see GameFAQ)
|
||||
Primary Frame Buffer=0
|
||||
SMM-FUNC=0
|
||||
SMM-PI DMA=0
|
||||
SMM-TLB=0
|
||||
SP Hack=No
|
||||
Self Texture=0
|
||||
Self-modifying code Method=Cache
|
||||
Status=Compatible
|
||||
Use Large Buffer=No
|
||||
|
||||
[D6FBA4A8-6326AA2C-C:4A]
|
||||
Good Name=Super Mario 64 Shindou Edition (J)
|
||||
|
|
|
@ -35,7 +35,6 @@ class CNotification;
|
|||
#include "N64 System/Mips/System Events.h"
|
||||
|
||||
//C Core - to be upgrdaded and removed
|
||||
#include "N64 System/C Core/CPU Log.h"
|
||||
#include "N64 System/C Core/r4300i Commands.h"
|
||||
#include "N64 System/C Core/Win32Timer.h"
|
||||
#include "N64 System/C Core/Logging.h"
|
||||
|
@ -59,6 +58,7 @@ class CNotification;
|
|||
#include "N64 System/Recompiler/Function Map Class.h"
|
||||
#include "N64 System/Recompiler/Delay Slot Map Class.h"
|
||||
#include "N64 System/Recompiler/Recompiler Class.h"
|
||||
#include "N64 System/Recompiler/x86CodeLog.h"
|
||||
|
||||
//cheats
|
||||
#include "N64 System/Cheat Class.h"
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#include "mempak.h"
|
||||
#include "Plugin.h"
|
||||
#include "Logging.h"
|
||||
#include "CPU Log.h"
|
||||
|
||||
//settings
|
||||
BOOL g_ShowCPUPer = false, g_ShowTLBMisses = false, g_UseTlb = true,
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
#include "stdafx.h"
|
||||
|
||||
/*
|
||||
* Project 64 - A Nintendo 64 emulator.
|
||||
*
|
||||
* (c) Copyright 2001 zilmar (zilmar@emulation64.com) and
|
||||
* Jabo (jabo@emulation64.com).
|
||||
*
|
||||
* pj64 homepage: www.pj64.net
|
||||
*
|
||||
* Permission to use, copy, modify and distribute Project64 in both binary and
|
||||
* source form, for non-commercial purposes, is hereby granted without fee,
|
||||
* providing that this license information and copyright notice appear with
|
||||
* all copies and any derived work.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event shall the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Project64 is freeware for PERSONAL USE only. Commercial users should
|
||||
* seek permission of the copyright holders first. Commercial use includes
|
||||
* charging money for Project64 or software derived from Project64.
|
||||
*
|
||||
* The copyright holders request that bug fixes and improvements to the code
|
||||
* should be forwarded to them so if they want them.
|
||||
*
|
||||
*/
|
||||
|
||||
//#if (!defined(EXTERNAL_RELEASE))
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef Log_x86Code
|
||||
|
||||
static HANDLE hCPULogFile = NULL;
|
||||
|
||||
BOOL IsX86Logging ( void )
|
||||
{
|
||||
return hCPULogFile != NULL;
|
||||
}
|
||||
|
||||
void CPU_Message (const char * Message, ...) {
|
||||
DWORD dwWritten;
|
||||
char Msg[400];
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, Message );
|
||||
vsprintf( Msg, Message, ap );
|
||||
va_end( ap );
|
||||
|
||||
strcat(Msg,"\r\n");
|
||||
|
||||
WriteFile( hCPULogFile,Msg,strlen(Msg),&dwWritten,NULL );
|
||||
}
|
||||
|
||||
void Start_x86_Log (void) {
|
||||
|
||||
CPath LogFileName(CPath::MODULE_DIRECTORY);
|
||||
LogFileName.AppendDirectory("Logs");
|
||||
LogFileName.SetNameExtension(_T("CPUoutput.log"));
|
||||
|
||||
if (hCPULogFile) { Stop_x86_Log(); }
|
||||
hCPULogFile = CreateFile(LogFileName,GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
|
||||
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||
SetFilePointer(hCPULogFile,0,NULL,FILE_BEGIN);
|
||||
}
|
||||
|
||||
void Stop_x86_Log (void) {
|
||||
if (hCPULogFile) {
|
||||
CloseHandle(hCPULogFile);
|
||||
hCPULogFile = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//#endif
|
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* Project 64 - A Nintendo 64 emulator.
|
||||
*
|
||||
* (c) Copyright 2001 zilmar (zilmar@emulation64.com) and
|
||||
* Jabo (jabo@emulation64.com).
|
||||
*
|
||||
* pj64 homepage: www.pj64.net
|
||||
*
|
||||
* Permission to use, copy, modify and distribute Project64 in both binary and
|
||||
* source form, for non-commercial purposes, is hereby granted without fee,
|
||||
* providing that this license information and copyright notice appear with
|
||||
* all copies and any derived work.
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event shall the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Project64 is freeware for PERSONAL USE only. Commercial users should
|
||||
* seek permission of the copyright holders first. Commercial use includes
|
||||
* charging money for Project64 or software derived from Project64.
|
||||
*
|
||||
* The copyright holders request that bug fixes and improvements to the code
|
||||
* should be forwarded to them so if they want them.
|
||||
*
|
||||
*/
|
||||
#define Log_x86Code
|
||||
|
||||
#if defined(Log_x86Code)
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void CPU_Message (const char * Message, ...);
|
||||
void Start_x86_Log (void);
|
||||
void Stop_x86_Log (void);
|
||||
BOOL IsX86Logging ( void );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define CPU_Message
|
||||
#endif
|
|
@ -168,7 +168,7 @@ void CCheats::ApplyCheats(CMipsMemory * _MMU)
|
|||
for (size_t CurrentCheat = 0; CurrentCheat < m_Codes.size(); CurrentCheat ++)
|
||||
{
|
||||
const CODES & CodeEntry = m_Codes[CurrentCheat];
|
||||
for (int CurrentEntry = 0; CurrentEntry < CodeEntry.size();)
|
||||
for (size_t CurrentEntry = 0; CurrentEntry < CodeEntry.size();)
|
||||
{
|
||||
CurrentEntry += ApplyCheatEntry(_MMU, CodeEntry,CurrentEntry,TRUE);
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ void CCheats::ApplyCheats(CMipsMemory * _MMU)
|
|||
void CCheats::ApplyGSButton (CMipsMemory * _MMU)
|
||||
{
|
||||
DWORD Address;
|
||||
for (int CurrentCheat = 0; CurrentCheat < m_Codes.size(); CurrentCheat ++)
|
||||
for (size_t CurrentCheat = 0; CurrentCheat < m_Codes.size(); CurrentCheat ++)
|
||||
{
|
||||
const CODES & CodeEntry = m_Codes[CurrentCheat];
|
||||
for (size_t CurrentEntry = 0; CurrentEntry < CodeEntry.size(); CurrentEntry ++)
|
||||
|
@ -187,7 +187,7 @@ void CCheats::ApplyGSButton (CMipsMemory * _MMU)
|
|||
switch (Code.Command & 0xFF000000) {
|
||||
case 0x88000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
_MMU->SB_VAddr(Address,Code.Value);
|
||||
_MMU->SB_VAddr(Address,(BYTE)Code.Value);
|
||||
break;
|
||||
case 0x89000000:
|
||||
Address = 0x80000000 | (Code.Command & 0xFFFFFF);
|
||||
|
@ -196,7 +196,7 @@ void CCheats::ApplyGSButton (CMipsMemory * _MMU)
|
|||
// Xplorer64
|
||||
case 0xA8000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
_MMU->SB_VAddr(Address,ConvertXP64Value(Code.Value));
|
||||
_MMU->SB_VAddr(Address,(BYTE)ConvertXP64Value(Code.Value));
|
||||
break;
|
||||
case 0xA9000000:
|
||||
Address = 0x80000000 | (ConvertXP64Address(Code.Command) & 0xFFFFFF);
|
||||
|
@ -288,7 +288,7 @@ bool CCheats::IsValid16BitCode (LPCSTR CheatString) const
|
|||
|
||||
int CCheats::ApplyCheatEntry (CMipsMemory * _MMU, const CODES & CodeEntry, int CurrentEntry, BOOL Execute )
|
||||
{
|
||||
if (CurrentEntry < 0 || CurrentEntry >= CodeEntry.size())
|
||||
if (CurrentEntry < 0 || CurrentEntry >= (int)CodeEntry.size())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3,10 +3,9 @@ class R4300iOp32 :
|
|||
{
|
||||
public:
|
||||
/************************* OpCode functions *************************/
|
||||
static void J ( void );
|
||||
static void JAL ( void );
|
||||
static void BNE ( void );
|
||||
static void BEQ ( void );
|
||||
static void BNE ( void );
|
||||
static void BLEZ ( void );
|
||||
static void BGTZ ( void );
|
||||
static void ADDI ( void );
|
||||
|
@ -29,16 +28,7 @@ public:
|
|||
static void LHU ( void );
|
||||
static void LWR ( void );
|
||||
static void LWU ( void );
|
||||
static void SB ( void );
|
||||
static void SH ( void );
|
||||
static void SWL ( void );
|
||||
static void SW ( void );
|
||||
static void SWR ( void );
|
||||
static void CACHE ( void );
|
||||
static void LL ( void );
|
||||
static void LWC1 ( void );
|
||||
static void SC ( void );
|
||||
static void SWC1 ( void );
|
||||
|
||||
/********************** R4300i OpCodes: Special **********************/
|
||||
static void SPECIAL_SLL ( void );
|
||||
|
@ -47,11 +37,7 @@ public:
|
|||
static void SPECIAL_SLLV ( void );
|
||||
static void SPECIAL_SRLV ( void );
|
||||
static void SPECIAL_SRAV ( void );
|
||||
static void SPECIAL_JR ( void );
|
||||
static void SPECIAL_JALR ( void );
|
||||
static void SPECIAL_SYSCALL ( void );
|
||||
static void SPECIAL_BREAK ( void );
|
||||
static void SPECIAL_SYNC ( void );
|
||||
static void SPECIAL_MTHI ( void );
|
||||
static void SPECIAL_MTLO ( void );
|
||||
static void SPECIAL_ADD ( void );
|
||||
|
@ -60,7 +46,6 @@ public:
|
|||
static void SPECIAL_SUBU ( void );
|
||||
static void SPECIAL_AND ( void );
|
||||
static void SPECIAL_OR ( void );
|
||||
static void SPECIAL_XOR ( void );
|
||||
static void SPECIAL_NOR ( void );
|
||||
static void SPECIAL_SLT ( void );
|
||||
static void SPECIAL_SLTU ( void );
|
||||
|
@ -80,80 +65,10 @@ public:
|
|||
static void COP0_MF ( void );
|
||||
static void COP0_MT ( void );
|
||||
|
||||
/************************** COP0 CO functions ***********************/
|
||||
static void COP0_CO_TLBR ( void );
|
||||
static void COP0_CO_TLBWI ( void );
|
||||
static void COP0_CO_TLBWR ( void );
|
||||
static void COP0_CO_TLBP ( void );
|
||||
static void COP0_CO_ERET ( void );
|
||||
|
||||
/************************** COP1 functions **************************/
|
||||
static void COP1_MF ( void );
|
||||
static void COP1_DMF ( void );
|
||||
static void COP1_CF ( void );
|
||||
static void COP1_MT ( void );
|
||||
static void COP1_DMT ( void );
|
||||
static void COP1_CT ( void );
|
||||
|
||||
/************************* COP1: BC1 functions ***********************/
|
||||
static void COP1_BCF ( void );
|
||||
static void COP1_BCT ( void );
|
||||
static void COP1_BCFL ( void );
|
||||
static void COP1_BCTL ( void );
|
||||
|
||||
/************************** COP1: S functions ************************/
|
||||
static void COP1_S_ADD ( void );
|
||||
static void COP1_S_SUB ( void );
|
||||
static void COP1_S_MUL ( void );
|
||||
static void COP1_S_DIV ( void );
|
||||
static void COP1_S_SQRT ( void );
|
||||
static void COP1_S_ABS ( void );
|
||||
static void COP1_S_MOV ( void );
|
||||
static void COP1_S_NEG ( void );
|
||||
static void COP1_S_TRUNC_L ( void );
|
||||
static void COP1_S_CEIL_L ( void ); //added by Witten
|
||||
static void COP1_S_FLOOR_L ( void ); //added by Witten
|
||||
static void COP1_S_ROUND_W ( void );
|
||||
static void COP1_S_TRUNC_W ( void );
|
||||
static void COP1_S_CEIL_W ( void ); //added by Witten
|
||||
static void COP1_S_FLOOR_W ( void );
|
||||
static void COP1_S_CVT_D ( void );
|
||||
static void COP1_S_CVT_W ( void );
|
||||
static void COP1_S_CVT_L ( void );
|
||||
static void COP1_S_CMP ( void );
|
||||
|
||||
/************************** COP1: D functions ************************/
|
||||
static void COP1_D_ADD ( void );
|
||||
static void COP1_D_SUB ( void );
|
||||
static void COP1_D_MUL ( void );
|
||||
static void COP1_D_DIV ( void );
|
||||
static void COP1_D_SQRT ( void );
|
||||
static void COP1_D_ABS ( void );
|
||||
static void COP1_D_MOV ( void );
|
||||
static void COP1_D_NEG ( void );
|
||||
static void COP1_D_TRUNC_L ( void ); //added by Witten
|
||||
static void COP1_D_CEIL_L ( void ); //added by Witten
|
||||
static void COP1_D_FLOOR_L ( void ); //added by Witten
|
||||
static void COP1_D_ROUND_W ( void );
|
||||
static void COP1_D_TRUNC_W ( void );
|
||||
static void COP1_D_CEIL_W ( void ); //added by Witten
|
||||
static void COP1_D_FLOOR_W ( void ); //added by Witten
|
||||
static void COP1_D_CVT_S ( void );
|
||||
static void COP1_D_CVT_W ( void );
|
||||
static void COP1_D_CVT_L ( void );
|
||||
static void COP1_D_CMP ( void );
|
||||
|
||||
/************************** COP1: W functions ************************/
|
||||
static void COP1_W_CVT_S ( void );
|
||||
static void COP1_W_CVT_D ( void );
|
||||
|
||||
/************************** COP1: L functions ************************/
|
||||
static void COP1_L_CVT_S ( void );
|
||||
static void COP1_L_CVT_D ( void );
|
||||
|
||||
/************************** Other functions **************************/
|
||||
static void UnknownOpcode ( void );
|
||||
|
||||
|
||||
static Func * BuildInterpreter (void );
|
||||
};
|
||||
|
|
|
@ -1046,11 +1046,12 @@ void R4300iOp::LW (void) {
|
|||
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
|
||||
if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
|
||||
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
Log_LW((*_PROGRAM_COUNTER),Address);
|
||||
#endif
|
||||
if (m_Opcode.rt == 0) { return; }
|
||||
if (LogOptions.GenerateLog)
|
||||
{
|
||||
Log_LW((*_PROGRAM_COUNTER),Address);
|
||||
}
|
||||
|
||||
if (m_Opcode.rt == 0) { return; }
|
||||
|
||||
if (!_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0])) {
|
||||
if (g_ShowTLBMisses) {
|
||||
|
@ -1097,7 +1098,7 @@ void R4300iOp::LWR (void) {
|
|||
{
|
||||
if (g_ShowTLBMisses)
|
||||
{
|
||||
DisplayError("LDL TLB: %X",Address);
|
||||
DisplayError("LWR TLB: %X",Address);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1168,7 +1169,10 @@ void R4300iOp::SW (void) {
|
|||
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
|
||||
if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
|
||||
#if (!defined(EXTERNAL_RELEASE))
|
||||
Log_SW((*_PROGRAM_COUNTER),Address,_GPR[m_Opcode.rt].UW[0]);
|
||||
if (LogOptions.GenerateLog)
|
||||
{
|
||||
Log_SW((*_PROGRAM_COUNTER),Address,_GPR[m_Opcode.rt].UW[0]);
|
||||
}
|
||||
#endif
|
||||
if (!_MMU->SW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
|
||||
{
|
||||
|
@ -1387,7 +1391,7 @@ void R4300iOp::SD (void) {
|
|||
#endif
|
||||
}
|
||||
}
|
||||
/********************** R4300i m_Opcodes: Special **********************/
|
||||
/********************** R4300i OpCodes: Special **********************/
|
||||
void R4300iOp::SPECIAL_SLL (void) {
|
||||
_GPR[m_Opcode.rd].DW = (_GPR[m_Opcode.rt].W[0] << m_Opcode.sa);
|
||||
}
|
||||
|
@ -1653,12 +1657,18 @@ void R4300iOp::SPECIAL_DSRA32 (void) {
|
|||
_GPR[m_Opcode.rd].DW = (_GPR[m_Opcode.rt].DW >> (m_Opcode.sa + 32));
|
||||
}
|
||||
|
||||
/********************** R4300i m_Opcodes: RegImm **********************/
|
||||
/********************** R4300i OpCodes: RegImm **********************/
|
||||
void R4300iOp::REGIMM_BLTZ (void) {
|
||||
m_NextInstruction = DELAY_SLOT;
|
||||
if (_GPR[m_Opcode.rs].DW < 0) {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
}
|
||||
|
@ -1668,7 +1678,13 @@ void R4300iOp::REGIMM_BGEZ (void) {
|
|||
m_NextInstruction = DELAY_SLOT;
|
||||
if (_GPR[m_Opcode.rs].DW >= 0) {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
}
|
||||
|
@ -1678,7 +1694,13 @@ void R4300iOp::REGIMM_BLTZL (void) {
|
|||
if (_GPR[m_Opcode.rs].DW < 0) {
|
||||
m_NextInstruction = DELAY_SLOT;
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_NextInstruction = JUMP;
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
|
@ -1689,7 +1711,13 @@ void R4300iOp::REGIMM_BGEZL (void) {
|
|||
if (_GPR[m_Opcode.rs].DW >= 0) {
|
||||
m_NextInstruction = DELAY_SLOT;
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_NextInstruction = JUMP;
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
|
@ -1700,7 +1728,13 @@ void R4300iOp::REGIMM_BLTZAL (void) {
|
|||
m_NextInstruction = DELAY_SLOT;
|
||||
if (_GPR[m_Opcode.rs].DW < 0) {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
}
|
||||
|
@ -1711,7 +1745,13 @@ void R4300iOp::REGIMM_BGEZAL (void) {
|
|||
m_NextInstruction = DELAY_SLOT;
|
||||
if (_GPR[m_Opcode.rs].DW >= 0) {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
|
||||
TestInterpreterJump((*_PROGRAM_COUNTER),m_JumpToLocation,m_Opcode.rs,0);
|
||||
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
|
||||
{
|
||||
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
|
||||
{
|
||||
InPermLoop();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
|
||||
}
|
||||
|
@ -1748,7 +1788,6 @@ void R4300iOp::COP0_MT (void) {
|
|||
case 2: //EntryLo0
|
||||
case 3: //EntryLo1
|
||||
case 5: //PageMask
|
||||
case 6: //Wired
|
||||
case 10: //Entry Hi
|
||||
case 14: //EPC
|
||||
case 16: //Config
|
||||
|
@ -1759,6 +1798,10 @@ void R4300iOp::COP0_MT (void) {
|
|||
case 30: //ErrEPC
|
||||
_CP0[m_Opcode.rd] = _GPR[m_Opcode.rt].UW[0];
|
||||
break;
|
||||
case 6: //Wired
|
||||
_SystemTimer->UpdateTimers();
|
||||
_CP0[m_Opcode.rd] = _GPR[m_Opcode.rt].UW[0];
|
||||
break;
|
||||
case 4: //Context
|
||||
_CP0[m_Opcode.rd] = _GPR[m_Opcode.rt].UW[0] & 0xFF800000;
|
||||
break;
|
||||
|
@ -1811,7 +1854,7 @@ void R4300iOp::COP0_CO_TLBWI (void) {
|
|||
|
||||
void R4300iOp::COP0_CO_TLBWR (void) {
|
||||
if (!g_UseTlb) { return; }
|
||||
_TLB->WriteEntry(_Reg->RANDOM_REGISTER & 0x1F,TRUE);
|
||||
_TLB->WriteEntry(_Reg->RANDOM_REGISTER & 0x1F,true);
|
||||
}
|
||||
|
||||
void R4300iOp::COP0_CO_TLBP (void) {
|
||||
|
|
|
@ -36,9 +36,9 @@ void CSystemEvents::ExecuteEvents ( void )
|
|||
|
||||
EventList Events = m_Events;
|
||||
m_Events.clear();
|
||||
bool bPause = false;
|
||||
bool bPause = false, bLoadedSave = false;
|
||||
|
||||
for (EventList::const_iterator iter = Events.begin(); iter != Events.end(); iter++ )
|
||||
for (EventList::const_iterator iter = Events.begin(); !bLoadedSave && iter != Events.end(); iter++ )
|
||||
{
|
||||
switch (*iter)
|
||||
{
|
||||
|
@ -97,7 +97,10 @@ void CSystemEvents::ExecuteEvents ( void )
|
|||
}
|
||||
break;
|
||||
case SysEvent_LoadMachineState:
|
||||
Machine_LoadState();
|
||||
if (Machine_LoadState())
|
||||
{
|
||||
bLoadedSave = true;
|
||||
}
|
||||
break;
|
||||
case SysEvent_ChangePlugins:
|
||||
ChangePluginFunc();
|
||||
|
|
|
@ -47,11 +47,11 @@ bool CCodeBlock::Compile()
|
|||
|
||||
if (m_bDelaySlot)
|
||||
{
|
||||
m_EnterSection.GenerateX86Code(m_EnterSection.m_Test + 1);
|
||||
m_EnterSection.GenerateX86Code(NextTest());
|
||||
} else {
|
||||
/*if (bLinkBlocks()) {
|
||||
for (int i = 0; i < m_NoOfSections; i ++) {
|
||||
m_EnterSection.DisplaySectionInformation(i + 1,m_EnterSection.m_Test + 1);
|
||||
m_EnterSection.DisplaySectionInformation(i + 1,NextTest());
|
||||
}
|
||||
}*/
|
||||
if (_SyncSystem) {
|
||||
|
|
|
@ -910,6 +910,11 @@ bool CCodeSection::GenerateX86Code ( DWORD Test )
|
|||
m_NextInstruction = m_DelaySlotSection ? END_BLOCK : NORMAL;
|
||||
m_Section = this;
|
||||
|
||||
if (m_DelaySlotSection)
|
||||
{
|
||||
m_Cont.JumpPC = m_EnterPC;
|
||||
}
|
||||
|
||||
if (m_CompilePC < m_BlockInfo->VAddrFirst())
|
||||
{
|
||||
m_BlockInfo->SetVAddrFirst(m_CompilePC);
|
||||
|
@ -2462,7 +2467,8 @@ void CCodeSection::UnlinkParent( CCodeSection * Parent, bool ContinueSection )
|
|||
}
|
||||
ParentIter->m_ContinueSection = NULL;
|
||||
}
|
||||
else if (ParentIter->m_JumpSection == this)
|
||||
|
||||
if (ParentIter->m_JumpSection == this)
|
||||
{
|
||||
if (ParentIter->m_CompiledLocation)
|
||||
{
|
||||
|
@ -2517,7 +2523,7 @@ bool CCodeSection::InheritParentInfo ( void )
|
|||
char Label[100];
|
||||
BOOL NeedSync;
|
||||
*/
|
||||
DisplaySectionInformation(m_SectionID,m_BlockInfo->NextTest());
|
||||
DisplaySectionInformation();
|
||||
|
||||
if (m_ParentSection.empty())
|
||||
{
|
||||
|
@ -2843,7 +2849,7 @@ bool CCodeSection::InheritParentInfo ( void )
|
|||
|
||||
bool CCodeSection::DisplaySectionInformation (DWORD ID, DWORD Test)
|
||||
{
|
||||
if (!IsX86Logging())
|
||||
if (!bX86Logging)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -2855,6 +2861,12 @@ bool CCodeSection::DisplaySectionInformation (DWORD ID, DWORD Test)
|
|||
if (m_JumpSection->DisplaySectionInformation(ID,Test)) { return true; }
|
||||
return false;
|
||||
}
|
||||
DisplaySectionInformation();
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCodeSection::DisplaySectionInformation (void)
|
||||
{
|
||||
CPU_Message("====== Section %d ======",m_SectionID);
|
||||
CPU_Message("Start PC: %X",m_EnterPC);
|
||||
CPU_Message("CompiledLocation: %X",m_RecompPos);
|
||||
|
@ -2884,5 +2896,4 @@ bool CCodeSection::DisplaySectionInformation (DWORD ID, DWORD Test)
|
|||
CPU_Message("Continue Section: None");
|
||||
}
|
||||
CPU_Message("=======================");
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ public:
|
|||
CCodeSection * ExistingSection ( DWORD Addr, DWORD Test );
|
||||
bool SectionAccessible ( DWORD SectionId, DWORD Test );
|
||||
bool DisplaySectionInformation ( DWORD ID, DWORD Test );
|
||||
void DisplaySectionInformation ( void );
|
||||
|
||||
/* Block Connection info */
|
||||
SECTION_LIST m_ParentSection;
|
||||
|
|
|
@ -258,65 +258,44 @@ void CRecompilerOps::Compile_BranchLikely (BranchFunction CompareFunc, BOOL Link
|
|||
CompareFunc();
|
||||
ResetX86Protection();
|
||||
m_Section->m_Cont.RegSet = m_RegWorkingSet;
|
||||
if (g_UseLinking && m_Section->m_Jump.TargetPC == m_Section->m_Cont.TargetPC)
|
||||
{
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
if (m_Section->m_Cont.FallThrough)
|
||||
{
|
||||
BreakPoint(__FILE__,__LINE__);
|
||||
if (m_Section->m_Cont.FallThrough) {
|
||||
if (m_Section->m_Jump.LinkLocation != NULL) {
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
DisplayError("WTF .. problem with CRecompilerOps::BranchLikely");
|
||||
#endif
|
||||
}
|
||||
if (!m_Section->m_Jump.FallThrough)
|
||||
{
|
||||
BreakPoint(__FILE__,__LINE__);
|
||||
}
|
||||
m_Section->m_JumpSection->m_Cont.TargetPC = m_Section->m_Jump.TargetPC;
|
||||
m_Section->m_JumpSection->DelaySlotSection = true;
|
||||
m_Section->m_Jump.TargetPC = m_CompilePC + 4;
|
||||
m_Section->m_Jump.RegSet = m_RegWorkingSet;
|
||||
m_Section->GenerateSectionLinkage();
|
||||
m_NextInstruction = END_BLOCK;
|
||||
#endif
|
||||
} else {
|
||||
if (m_Section->m_Cont.FallThrough) {
|
||||
if ((m_CompilePC & 0xFFC) == 0xFFC) {
|
||||
m_Section->m_Jump.FallThrough = FALSE;
|
||||
if (m_Section->m_Jump.LinkLocation != NULL) {
|
||||
#ifndef EXTERNAL_RELEASE
|
||||
DisplayError("WTF .. problem with CRecompilerOps::BranchLikely");
|
||||
#endif
|
||||
SetJump32(m_Section->m_Jump.LinkLocation,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Jump.LinkLocation = NULL;
|
||||
if (m_Section->m_Jump.LinkLocation2 != NULL) {
|
||||
SetJump32(m_Section->m_Jump.LinkLocation2,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Jump.LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
JmpLabel32("DoDelaySlot",0);
|
||||
m_Section->m_Jump.LinkLocation = (DWORD *)(m_RecompPos - 4);
|
||||
CPU_Message(" ");
|
||||
CPU_Message(" %s:",m_Section->m_Cont.BranchLabel.c_str());
|
||||
if (m_Section->m_Cont.LinkLocation != NULL) {
|
||||
SetJump32(m_Section->m_Cont.LinkLocation,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Cont.LinkLocation = NULL;
|
||||
if (m_Section->m_Cont.LinkLocation2 != NULL) {
|
||||
SetJump32(m_Section->m_Cont.LinkLocation2,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Cont.LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
m_Section->CompileExit(m_CompilePC, m_CompilePC + 8,m_Section->m_Cont.RegSet,CExitInfo::Normal,TRUE,NULL);
|
||||
CPU_Message("");
|
||||
CPU_Message(" DoDelaySlot:");
|
||||
m_Section->GenerateSectionLinkage();
|
||||
m_NextInstruction = END_BLOCK;
|
||||
} else {
|
||||
if ((m_CompilePC & 0xFFC) == 0xFFC) {
|
||||
m_Section->m_Jump.FallThrough = FALSE;
|
||||
if (m_Section->m_Jump.LinkLocation != NULL) {
|
||||
SetJump32(m_Section->m_Jump.LinkLocation,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Jump.LinkLocation = NULL;
|
||||
if (m_Section->m_Jump.LinkLocation2 != NULL) {
|
||||
SetJump32(m_Section->m_Jump.LinkLocation2,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Jump.LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
JmpLabel32("DoDelaySlot",0);
|
||||
m_Section->m_Jump.LinkLocation = (DWORD *)(m_RecompPos - 4);
|
||||
CPU_Message(" ");
|
||||
CPU_Message(" %s:",m_Section->m_Cont.BranchLabel.c_str());
|
||||
if (m_Section->m_Cont.LinkLocation != NULL) {
|
||||
SetJump32(m_Section->m_Cont.LinkLocation,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Cont.LinkLocation = NULL;
|
||||
if (m_Section->m_Cont.LinkLocation2 != NULL) {
|
||||
SetJump32(m_Section->m_Cont.LinkLocation2,(DWORD *)m_RecompPos);
|
||||
m_Section->m_Cont.LinkLocation2 = NULL;
|
||||
}
|
||||
}
|
||||
m_Section->CompileExit(m_CompilePC, m_CompilePC + 8,m_Section->m_Cont.RegSet,CExitInfo::Normal,TRUE,NULL);
|
||||
CPU_Message("");
|
||||
CPU_Message(" DoDelaySlot:");
|
||||
m_Section->GenerateSectionLinkage();
|
||||
m_NextInstruction = END_BLOCK;
|
||||
} else {
|
||||
m_NextInstruction = DO_DELAY_SLOT;
|
||||
}
|
||||
m_NextInstruction = DO_DELAY_SLOT;
|
||||
}
|
||||
}
|
||||
} else if (m_NextInstruction == DELAY_SLOT_DONE ) {
|
||||
|
@ -1963,6 +1942,13 @@ void CRecompilerOps::SPECIAL_JR (void) {
|
|||
m_NextInstruction = END_BLOCK;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
m_Section->m_Jump.FallThrough = false;
|
||||
m_Section->m_Jump.LinkLocation = NULL;
|
||||
m_Section->m_Jump.LinkLocation2 = NULL;
|
||||
m_Section->m_Cont.FallThrough = FALSE;
|
||||
m_Section->m_Cont.LinkLocation = NULL;
|
||||
m_Section->m_Cont.LinkLocation2 = NULL;
|
||||
}
|
||||
if ((m_CompilePC & 0xFFC) == 0xFFC) {
|
||||
if (IsMapped(m_Opcode.rs)) {
|
||||
|
@ -1989,7 +1975,7 @@ void CRecompilerOps::SPECIAL_JR (void) {
|
|||
m_Section->CompileExit(m_CompilePC,(DWORD)-1,m_RegWorkingSet,CExitInfo::Normal,TRUE,NULL);
|
||||
} else {
|
||||
if (IsConst(m_Opcode.rs)) {
|
||||
UpdateCounters(m_RegWorkingSet,true,true);
|
||||
m_Section->m_Jump.JumpPC = m_Section->m_Jump.TargetPC + 4;
|
||||
m_Section->m_Jump.RegSet = m_RegWorkingSet;
|
||||
m_Section->GenerateSectionLinkage();
|
||||
} else {
|
||||
|
@ -2160,7 +2146,6 @@ void CRecompilerOps::SPECIAL_DSLLV (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
if (IsConst(m_Opcode.rs)) {
|
||||
DWORD Shift = (cMipsRegLo(m_Opcode.rs) & 0x3F);
|
||||
CRecompilerOps::UnknownOpcode();
|
||||
|
@ -2198,7 +2183,6 @@ void CRecompilerOps::SPECIAL_DSRLV (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
if (IsConst(m_Opcode.rs)) {
|
||||
DWORD Shift = (cMipsRegLo(m_Opcode.rs) & 0x3F);
|
||||
if (IsConst(m_Opcode.rt)) {
|
||||
|
@ -2462,8 +2446,6 @@ void CRecompilerOps::SPECIAL_DMULT (void)
|
|||
{
|
||||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rs,TRUE); }
|
||||
if (m_Opcode.rs != 0) { UnMap_GPR(m_Opcode.rt,TRUE); }
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
|
@ -3120,25 +3102,40 @@ void CRecompilerOps::SPECIAL_NOR (void) {
|
|||
int KnownReg = IsKnown(m_Opcode.rt)?m_Opcode.rt:m_Opcode.rs;
|
||||
int UnknownReg = IsKnown(m_Opcode.rt)?m_Opcode.rs:m_Opcode.rt;
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(KnownReg)) {
|
||||
unsigned __int64 Value;
|
||||
|
||||
Value = Is64Bit(KnownReg)?MipsReg(KnownReg):MipsRegLo_S(KnownReg);
|
||||
Map_GPR_64bit(m_Opcode.rd,UnknownReg);
|
||||
if ((Value >> 32) != 0) {
|
||||
OrConstToX86Reg((DWORD)(Value >> 32),MipsRegMapHi(m_Opcode.rd));
|
||||
}
|
||||
if ((DWORD)Value != 0) {
|
||||
OrConstToX86Reg((DWORD)Value,cMipsRegMapLo(m_Opcode.rd));
|
||||
if (b32BitCore() && Is32Bit(KnownReg))
|
||||
{
|
||||
Map_GPR_32bit(m_Opcode.rd,true,UnknownReg);
|
||||
if ((DWORD)Value != 0) {
|
||||
OrConstToX86Reg((DWORD)Value,cMipsRegMapLo(m_Opcode.rd));
|
||||
}
|
||||
} else {
|
||||
Map_GPR_64bit(m_Opcode.rd,UnknownReg);
|
||||
if ((Value >> 32) != 0) {
|
||||
OrConstToX86Reg((DWORD)(Value >> 32),MipsRegMapHi(m_Opcode.rd));
|
||||
}
|
||||
if ((DWORD)Value != 0) {
|
||||
OrConstToX86Reg((DWORD)Value,cMipsRegMapLo(m_Opcode.rd));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Map_GPR_64bit(m_Opcode.rd,KnownReg);
|
||||
OrVariableToX86Reg(&_GPR[UnknownReg].W[1],CRegName::GPR_Hi[UnknownReg],cMipsRegMapHi(m_Opcode.rd));
|
||||
OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd));
|
||||
if (b32BitCore())
|
||||
{
|
||||
Map_GPR_32bit(m_Opcode.rd,true,KnownReg);
|
||||
OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd));
|
||||
} else {
|
||||
Map_GPR_64bit(m_Opcode.rd,KnownReg);
|
||||
OrVariableToX86Reg(&_GPR[UnknownReg].W[1],CRegName::GPR_Hi[UnknownReg],cMipsRegMapHi(m_Opcode.rd));
|
||||
OrVariableToX86Reg(&_GPR[UnknownReg].W[0],CRegName::GPR_Lo[UnknownReg],cMipsRegMapLo(m_Opcode.rd));
|
||||
}
|
||||
}
|
||||
if (Is64Bit(m_Opcode.rd))
|
||||
{
|
||||
NotX86Reg(cMipsRegMapHi(m_Opcode.rd));
|
||||
}
|
||||
NotX86Reg(cMipsRegMapHi(m_Opcode.rd));
|
||||
NotX86Reg(cMipsRegMapLo(m_Opcode.rd));
|
||||
} else if (b32BitCore()) {
|
||||
Map_GPR_32bit(m_Opcode.rd,true,m_Opcode.rt);
|
||||
|
@ -3605,8 +3602,6 @@ void CRecompilerOps::SPECIAL_DADD (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(m_Opcode.rt) && IsConst(m_Opcode.rs)) {
|
||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||
MipsReg(m_Opcode.rd) =
|
||||
|
@ -3643,8 +3638,6 @@ void CRecompilerOps::SPECIAL_DADDU (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(m_Opcode.rt) && IsConst(m_Opcode.rs)) {
|
||||
__int64 ValRs = Is64Bit(m_Opcode.rs)?MipsReg(m_Opcode.rs):(__int64)MipsRegLo_S(m_Opcode.rs);
|
||||
__int64 ValRt = Is64Bit(m_Opcode.rt)?MipsReg(m_Opcode.rt):(__int64)MipsRegLo_S(m_Opcode.rt);
|
||||
|
@ -3681,8 +3674,6 @@ void CRecompilerOps::SPECIAL_DSUB (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(m_Opcode.rt) && IsConst(m_Opcode.rs)) {
|
||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||
MipsReg(m_Opcode.rd) =
|
||||
|
@ -3768,7 +3759,7 @@ void CRecompilerOps::SPECIAL_DSLL (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(m_Opcode.rt))
|
||||
{
|
||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||
|
@ -3793,7 +3784,7 @@ void CRecompilerOps::SPECIAL_DSRL (void) {
|
|||
CPU_Message(" %X %s",m_CompilePC,R4300iOpcodeName(m_Opcode.Hex,m_CompilePC));
|
||||
|
||||
if (m_Opcode.rd == 0) { return; }
|
||||
if (b32BitCore()) { _Notify->BreakPoint(__FILE__,__LINE__); }
|
||||
|
||||
if (IsConst(m_Opcode.rt)) {
|
||||
if (IsMapped(m_Opcode.rd)) { UnMap_GPR(m_Opcode.rd, FALSE); }
|
||||
|
||||
|
@ -3904,7 +3895,7 @@ void CRecompilerOps::SPECIAL_DSRL32 (void) {
|
|||
}
|
||||
} else {
|
||||
Map_GPR_32bit(m_Opcode.rd,FALSE,-1);
|
||||
MoveVariableToX86reg(&_GPR[m_Opcode.rt].UW[1],CRegName::GPR_Lo[m_Opcode.rt],cMipsRegMapLo(m_Opcode.rd));
|
||||
MoveVariableToX86reg(&_GPR[m_Opcode.rt].UW[1],CRegName::GPR_Hi[m_Opcode.rt],cMipsRegMapLo(m_Opcode.rd));
|
||||
if ((BYTE)m_Opcode.sa != 0) {
|
||||
ShiftRightUnsignImmed(cMipsRegMapLo(m_Opcode.rd),(BYTE)m_Opcode.sa);
|
||||
}
|
||||
|
@ -4063,22 +4054,17 @@ void CRecompilerOps::COP0_MT (void) {
|
|||
}
|
||||
break;
|
||||
case 6: //Wired
|
||||
_Notify->BreakPoint(__FILE__,__LINE__);
|
||||
#ifdef tofix
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
UpdateCounters(&m_RegWorkingSet.BlockCycleCount(),&m_RegWorkingSet.BlockRandomModifier(),FALSE);
|
||||
m_RegWorkingSet.BlockCycleCount() = 0;
|
||||
m_RegWorkingSet.BlockRandomModifier() = 0;
|
||||
Call_Direct(FixRandomReg,"FixRandomReg");
|
||||
UpdateCounters(m_RegWorkingSet, false, true);
|
||||
//Call_Direct(FixRandomReg,"FixRandomReg");
|
||||
AfterCallDirect(m_RegWorkingSet);
|
||||
if (IsConst(m_Opcode.rt)) {
|
||||
MoveConstToVariable(cMipsRegLo(m_Opcode.rt), &_CP0[m_Opcode.rd], CRegName::Cop0[m_Opcode.rd]);
|
||||
} else if (IsMapped(m_Opcode.rt)) {
|
||||
MoveX86regToVariable(cMipsRegLo(m_Opcode.rt), &_CP0[m_Opcode.rd], CRegName::Cop0[m_Opcode.rd]);
|
||||
MoveX86regToVariable(cMipsRegMapLo(m_Opcode.rt), &_CP0[m_Opcode.rd], CRegName::Cop0[m_Opcode.rd]);
|
||||
} else {
|
||||
MoveX86regToVariable(Map_TempReg(x86_Any,m_Opcode.rt,FALSE), &_CP0[m_Opcode.rd], CRegName::Cop0[m_Opcode.rd]);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case 13: //cause
|
||||
if (IsConst(m_Opcode.rt)) {
|
||||
|
|
|
@ -939,17 +939,20 @@ void CRegInfo::UnMap_GPR (DWORD Reg, bool WriteBackValue)
|
|||
return;
|
||||
}
|
||||
MoveX86regToVariable(MipsRegMapLo(Reg),&_GPR[Reg].UW[0],CRegName::GPR_Lo[Reg]);
|
||||
MipsRegMapLo(Reg) = x86_Unknown;
|
||||
if (Is64Bit(Reg)) {
|
||||
MipsRegMapLo(Reg) = x86_Unknown;
|
||||
MoveX86regToVariable(MipsRegMapHi(Reg),&_GPR[Reg].UW[1],CRegName::GPR_Hi[Reg]);
|
||||
MipsRegMapHi(Reg) = x86_Unknown;
|
||||
} else if (!m_b32bitCore) {
|
||||
if (IsSigned(Reg)) {
|
||||
ShiftRightSignImmed(MipsRegMapLo(Reg),31);
|
||||
MoveX86regToVariable(MipsRegMapLo(Reg),&_GPR[Reg].UW[1],CRegName::GPR_Hi[Reg]);
|
||||
} else {
|
||||
MoveConstToVariable(0,&_GPR[Reg].UW[1],CRegName::GPR_Hi[Reg]);
|
||||
} else {
|
||||
if (!m_b32bitCore) {
|
||||
if (IsSigned(Reg)) {
|
||||
ShiftRightSignImmed(MipsRegMapLo(Reg),31);
|
||||
MoveX86regToVariable(MipsRegMapLo(Reg),&_GPR[Reg].UW[1],CRegName::GPR_Hi[Reg]);
|
||||
} else {
|
||||
MoveConstToVariable(0,&_GPR[Reg].UW[1],CRegName::GPR_Hi[Reg]);
|
||||
}
|
||||
}
|
||||
MipsRegMapLo(Reg) = x86_Unknown;
|
||||
}
|
||||
MipsRegState(Reg) = STATE_UNKNOWN;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
#include "stdafx.h"
|
||||
|
||||
static HANDLE hCPULogFile = NULL;
|
||||
bool bX86Logging = false;
|
||||
|
||||
void x86_Log_Message (const char * Message, ...) {
|
||||
DWORD dwWritten;
|
||||
char Msg[400];
|
||||
|
||||
va_list ap;
|
||||
va_start( ap, Message );
|
||||
vsprintf( Msg, Message, ap );
|
||||
va_end( ap );
|
||||
|
||||
strcat(Msg,"\r\n");
|
||||
|
||||
WriteFile( hCPULogFile,Msg,strlen(Msg),&dwWritten,NULL );
|
||||
}
|
||||
|
||||
void Start_x86_Log (void) {
|
||||
|
||||
CPath LogFileName(CPath::MODULE_DIRECTORY);
|
||||
LogFileName.AppendDirectory("Logs");
|
||||
LogFileName.SetNameExtension(_T("CPUoutput.log"));
|
||||
|
||||
if (hCPULogFile) { Stop_x86_Log(); }
|
||||
hCPULogFile = CreateFile(LogFileName,GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
|
||||
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
||||
if (hCPULogFile)
|
||||
{
|
||||
bX86Logging = true;
|
||||
SetFilePointer(hCPULogFile,0,NULL,FILE_BEGIN);
|
||||
}
|
||||
}
|
||||
|
||||
void Stop_x86_Log (void) {
|
||||
if (hCPULogFile) {
|
||||
CloseHandle(hCPULogFile);
|
||||
hCPULogFile = NULL;
|
||||
bX86Logging = false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
#define CPU_Message(Message,... ) if (bX86Logging) { x86_Log_Message(Message,## __VA_ARGS__); }
|
||||
|
||||
void x86_Log_Message (const char * Message, ...);
|
||||
void Start_x86_Log (void);
|
||||
void Stop_x86_Log (void);
|
||||
|
||||
extern bool bX86Logging;
|
|
@ -278,7 +278,7 @@
|
|||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
OptimizeForWindows98="1"
|
||||
OptimizeForWindows98="0"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
|
@ -2743,37 +2743,6 @@
|
|||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\C Core\CPU Log.cpp"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="External Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\C Core\Logging.cpp"
|
||||
>
|
||||
|
@ -3274,6 +3243,10 @@
|
|||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\N64 System\Recompiler\x86CodeLog.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\Recompiler\X86ops.cpp"
|
||||
>
|
||||
|
@ -4221,10 +4194,6 @@
|
|||
RelativePath="N64 System\C Core\Core Settings.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\C Core\CPU Log.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\C Core\CPU.h"
|
||||
>
|
||||
|
@ -4345,6 +4314,10 @@
|
|||
RelativePath="N64 System\Recompiler\Section Info.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\N64 System\Recompiler\x86CodeLog.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="N64 System\Recompiler\X86ops.h"
|
||||
>
|
||||
|
|
Binary file not shown.
|
@ -925,8 +925,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,7,51,46
|
||||
PRODUCTVERSION 1,7,51,46
|
||||
FILEVERSION 1,7,51,47
|
||||
PRODUCTVERSION 1,7,51,47
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -943,12 +943,12 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", " "
|
||||
VALUE "FileDescription", "Project64"
|
||||
VALUE "FileVersion", "1, 7, 51, 46"
|
||||
VALUE "FileVersion", "1, 7, 51, 47"
|
||||
VALUE "InternalName", "Project64"
|
||||
VALUE "LegalCopyright", "Copyright © 2010"
|
||||
VALUE "OriginalFilename", "Project64.exe"
|
||||
VALUE "ProductName", " Project64"
|
||||
VALUE "ProductVersion", "1, 7, 51, 46"
|
||||
VALUE "ProductVersion", "1, 7, 51, 47"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -138,10 +138,10 @@ void TestValidBinaryThread ( )
|
|||
}
|
||||
|
||||
#ifdef VALIDATE_BIN_LOCAL
|
||||
char Site[] = { "local.pj64.net" };
|
||||
char Site[] = { "www.local.pj64-emu.com" };
|
||||
ValidateEncryptString(Site,sizeof(Site) - 1);
|
||||
#else
|
||||
char Site[] = { "\xda\x1a\x5c\x02\x19\x48\x08\x18\x5b\x4d\x0c\x02" }; //"pj64-emu.com"
|
||||
char Site[] = { "\xDD\x00\x00\x59\x5e\x1a\x5c\x02\x19\x48\x08\x18\x5b\x4d\x0c\x02" }; //"www.pj64-emu.com"
|
||||
#endif
|
||||
ValidateDecryptString(Site,sizeof(Site) - 1);
|
||||
HINTERNET hConnect = InternetConnect(hSession, Site, 80, "", "", INTERNET_SERVICE_HTTP, 0, (LPARAM)0);
|
||||
|
@ -223,6 +223,36 @@ void TestValidBinaryThread ( )
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
#ifdef VALIDATE_DEBUG
|
||||
{
|
||||
bool bGotHeaders = true;
|
||||
DWORD dwBufferLength = 300;
|
||||
std::auto_ptr<BYTE> Headers(new BYTE[dwBufferLength]);
|
||||
if (!HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS,Headers.get(),&dwBufferLength,NULL))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
Headers.reset(new BYTE[dwBufferLength]);
|
||||
if (!HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS,Headers.get(),&dwBufferLength,NULL))
|
||||
{
|
||||
bGotHeaders = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bGotHeaders)
|
||||
{
|
||||
for (LPCTSTR Header = (LPCTSTR)Headers.get(); Header != NULL && Header[0] != 0; Header += strlen(Header) + 1)
|
||||
{
|
||||
WriteTraceF(TraceValidate,"v6a: Header: %s",Header);
|
||||
}
|
||||
} else {
|
||||
WriteTrace(TraceValidate,"v6b: Failed to get headers");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
std::auto_ptr<BYTE> WebSiteData;
|
||||
DWORD dwRead = 0;
|
||||
ULONG DataLen = 0;
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include "Validate Binary.h"
|
||||
#include <Aclapi.h>
|
||||
|
||||
#include "N64 System/C Core/CPU Log.h"
|
||||
#include "N64 System/C Core/C Core Interface.h"
|
||||
|
||||
#include "3rd Party/Zip.h"
|
||||
|
|
Loading…
Reference in New Issue