RSP: Start to add CPU style HLE
This commit is contained in:
parent
5eac210197
commit
eb985de132
|
@ -0,0 +1,70 @@
|
||||||
|
#include <Project64-rsp-core/Hle/HleTask.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspSystem.h>
|
||||||
|
#include <zlib/zlib.h>
|
||||||
|
|
||||||
|
CHleTask::CHleTask(CRSPSystem & System) :
|
||||||
|
m_hle(System),
|
||||||
|
m_System(System),
|
||||||
|
m_SP_STATUS_REG(System.m_SP_STATUS_REG),
|
||||||
|
m_SP_PC_REG(System.m_SP_PC_REG),
|
||||||
|
m_DPC_STATUS_REG(System.m_DPC_STATUS_REG),
|
||||||
|
m_DMEM(System.m_DMEM),
|
||||||
|
m_IMEM(System.m_IMEM),
|
||||||
|
CheckInterrupts(System.CheckInterrupts),
|
||||||
|
ProcessDList(System.ProcessDList)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CHleTask::IsHleTask(void)
|
||||||
|
{
|
||||||
|
if ((*m_SP_PC_REG) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t ImemCrc = crc32(0L, m_IMEM, 0xCC);
|
||||||
|
if (ImemCrc == 0xcab15710 || // Super Mario
|
||||||
|
ImemCrc == 0x6f849879) // pokemon puzzle league
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CHleTask::ProcessHleTask(void)
|
||||||
|
{
|
||||||
|
TASK_INFO & TaskInfo = *((TASK_INFO *)(m_DMEM + 0xFC0));
|
||||||
|
extern bool AudioHle, GraphicsHle;
|
||||||
|
|
||||||
|
if (((HLETaskType)TaskInfo.Type) == HLETaskType::Video && GraphicsHle && TaskInfo.DataPtr != 0)
|
||||||
|
{
|
||||||
|
if (ProcessDList != nullptr)
|
||||||
|
{
|
||||||
|
ProcessDList();
|
||||||
|
}
|
||||||
|
*m_SP_STATUS_REG |= (0x0203);
|
||||||
|
if ((*m_SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
||||||
|
{
|
||||||
|
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
||||||
|
RSPInfo.CheckInterrupts();
|
||||||
|
}
|
||||||
|
|
||||||
|
*RSPInfo.DPC_STATUS_REG &= ~0x0002;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (TaskInfo.Type == 7)
|
||||||
|
{
|
||||||
|
RSPInfo.ShowCFB();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CRSPSettings::CPUMethod() == RSPCpuMethod::HighLevelEmulation && m_hle.try_fast_audio_dispatching())
|
||||||
|
{
|
||||||
|
*m_SP_STATUS_REG |= SP_STATUS_SIG2 | SP_STATUS_BROKE | SP_STATUS_HALT;
|
||||||
|
if ((*m_SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
||||||
|
{
|
||||||
|
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
||||||
|
RSPInfo.CheckInterrupts();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
#pragma once
|
||||||
|
#include <Project64-rsp-core/Hle/hle.h>
|
||||||
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
class CRSPSystem;
|
||||||
|
class RSPRegisterHandlerPlugin;
|
||||||
|
class CHle;
|
||||||
|
|
||||||
|
class CHleTask
|
||||||
|
{
|
||||||
|
struct TASK_INFO
|
||||||
|
{
|
||||||
|
uint32_t Type;
|
||||||
|
uint32_t Flags;
|
||||||
|
uint32_t Boot;
|
||||||
|
uint32_t BootSize;
|
||||||
|
uint32_t Ucode;
|
||||||
|
uint32_t UcodeSize;
|
||||||
|
uint32_t UcodeData;
|
||||||
|
uint32_t UcodeDataSize;
|
||||||
|
uint32_t DramStack;
|
||||||
|
uint32_t DramStackSize;
|
||||||
|
uint32_t OutputBuff;
|
||||||
|
uint32_t OutputBuffSize;
|
||||||
|
uint32_t DataPtr;
|
||||||
|
uint32_t DataSize;
|
||||||
|
uint32_t YieldDataPtr;
|
||||||
|
uint32_t YieldDataSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class HLETaskType
|
||||||
|
{
|
||||||
|
Video = 1,
|
||||||
|
Audio = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
CHleTask(CRSPSystem & System);
|
||||||
|
|
||||||
|
bool IsHleTask(void);
|
||||||
|
bool ProcessHleTask(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CHleTask(void);
|
||||||
|
CHleTask(const CHleTask & copy);
|
||||||
|
CHleTask & operator=(const CHleTask & rhs);
|
||||||
|
|
||||||
|
void (*&CheckInterrupts)(void);
|
||||||
|
void (*&ProcessDList)(void);
|
||||||
|
|
||||||
|
CHle m_hle;
|
||||||
|
CRSPSystem & m_System;
|
||||||
|
uint32_t *& m_SP_STATUS_REG;
|
||||||
|
uint32_t *& m_SP_PC_REG;
|
||||||
|
uint32_t *& m_DPC_STATUS_REG;
|
||||||
|
uint8_t *& m_DMEM;
|
||||||
|
uint8_t *& m_IMEM;
|
||||||
|
};
|
|
@ -7,6 +7,7 @@
|
||||||
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
|
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
#include "hle.h"
|
#include "hle.h"
|
||||||
|
#include <Project64-rsp-core/cpu/RspSystem.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#if defined(_WIN32) && defined(_DEBUG)
|
#if defined(_WIN32) && defined(_DEBUG)
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
@ -21,33 +22,31 @@
|
||||||
|
|
||||||
static unsigned int sum_bytes(const uint8_t * bytes, uint32_t size);
|
static unsigned int sum_bytes(const uint8_t * bytes, uint32_t size);
|
||||||
|
|
||||||
CHle::CHle(const RSP_INFO & Rsp_Info) :
|
CHle::CHle(CRSPSystem & System) :
|
||||||
m_dram(Rsp_Info.RDRAM),
|
m_dram(System.m_RDRAM),
|
||||||
m_dmem(Rsp_Info.DMEM),
|
m_dmem(System.m_DMEM),
|
||||||
m_imem(Rsp_Info.IMEM),
|
m_imem(System.m_IMEM),
|
||||||
m_mi_intr(Rsp_Info.MI_INTR_REG),
|
m_mi_intr(System.m_MI_INTR_REG),
|
||||||
m_sp_mem_addr(Rsp_Info.SP_MEM_ADDR_REG),
|
m_sp_mem_addr(System.m_SP_MEM_ADDR_REG),
|
||||||
m_sp_dram_addr(Rsp_Info.SP_DRAM_ADDR_REG),
|
m_sp_dram_addr(System.m_SP_DRAM_ADDR_REG),
|
||||||
m_sp_rd_length(Rsp_Info.SP_RD_LEN_REG),
|
m_sp_rd_length(System.m_SP_RD_LEN_REG),
|
||||||
m_sp_wr_length(Rsp_Info.SP_WR_LEN_REG),
|
m_sp_wr_length(System.m_SP_WR_LEN_REG),
|
||||||
m_sp_status(Rsp_Info.SP_STATUS_REG),
|
m_sp_status(System.m_SP_STATUS_REG),
|
||||||
m_sp_dma_full(Rsp_Info.SP_DMA_FULL_REG),
|
m_sp_dma_full(System.m_SP_DMA_FULL_REG),
|
||||||
m_sp_dma_busy(Rsp_Info.SP_DMA_BUSY_REG),
|
m_sp_dma_busy(System.m_SP_DMA_BUSY_REG),
|
||||||
m_sp_pc(Rsp_Info.SP_PC_REG),
|
m_sp_pc(System.m_SP_PC_REG),
|
||||||
m_sp_semaphore(Rsp_Info.SP_SEMAPHORE_REG),
|
m_sp_semaphore(System.m_SP_SEMAPHORE_REG),
|
||||||
m_dpc_start(Rsp_Info.DPC_START_REG),
|
m_dpc_start(System.m_DPC_START_REG),
|
||||||
m_dpc_end(Rsp_Info.DPC_END_REG),
|
m_dpc_end(System.m_DPC_END_REG),
|
||||||
m_dpc_current(Rsp_Info.DPC_CURRENT_REG),
|
m_dpc_current(System.m_DPC_CURRENT_REG),
|
||||||
m_dpc_status(Rsp_Info.DPC_STATUS_REG),
|
m_dpc_status(System.m_DPC_STATUS_REG),
|
||||||
m_dpc_clock(Rsp_Info.DPC_CLOCK_REG),
|
m_dpc_clock(System.m_DPC_CLOCK_REG),
|
||||||
m_dpc_bufbusy(Rsp_Info.DPC_BUFBUSY_REG),
|
m_dpc_bufbusy(System.m_DPC_BUFBUSY_REG),
|
||||||
m_dpc_pipebusy(Rsp_Info.DPC_PIPEBUSY_REG),
|
m_dpc_pipebusy(System.m_DPC_PIPEBUSY_REG),
|
||||||
m_dpc_tmem(Rsp_Info.DPC_TMEM_REG),
|
m_dpc_tmem(System.m_DPC_TMEM_REG),
|
||||||
m_CheckInterrupts(Rsp_Info.CheckInterrupts),
|
m_CheckInterrupts(System.CheckInterrupts),
|
||||||
m_ProcessDList(Rsp_Info.ProcessDList),
|
m_ProcessDList(System.ProcessDList),
|
||||||
m_ProcessAList(Rsp_Info.ProcessAList),
|
m_ProcessRdpList(System.ProcessRdpList),
|
||||||
m_ProcessRdpList(Rsp_Info.ProcessRdpList),
|
|
||||||
m_ShowCFB(Rsp_Info.ShowCFB),
|
|
||||||
m_AudioHle(false),
|
m_AudioHle(false),
|
||||||
m_GraphicsHle(true),
|
m_GraphicsHle(true),
|
||||||
m_ForwardAudio(false),
|
m_ForwardAudio(false),
|
||||||
|
@ -77,23 +76,6 @@ void CHle::rsp_break(unsigned int setbits)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHle::hle_execute(void)
|
|
||||||
{
|
|
||||||
if (is_task())
|
|
||||||
{
|
|
||||||
if (!try_fast_task_dispatching())
|
|
||||||
{
|
|
||||||
normal_task_dispatching();
|
|
||||||
}
|
|
||||||
rsp_break(SP_STATUS_SIG2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
non_task_dispatching();
|
|
||||||
rsp_break(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Local functions
|
// Local functions
|
||||||
|
|
||||||
static unsigned int sum_bytes(const uint8_t * bytes, unsigned int size)
|
static unsigned int sum_bytes(const uint8_t * bytes, unsigned int size)
|
||||||
|
@ -126,36 +108,6 @@ bool CHle::is_task(void)
|
||||||
return (*dmem_u32(this, TASK_UCODE_BOOT_SIZE) <= 0x1000);
|
return (*dmem_u32(this, TASK_UCODE_BOOT_SIZE) <= 0x1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CHle::try_fast_task_dispatching(void)
|
|
||||||
{
|
|
||||||
// Identify task microcode by its type
|
|
||||||
switch (*dmem_u32(this, TASK_TYPE))
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
if (m_ForwardGFX)
|
|
||||||
{
|
|
||||||
m_ProcessDList();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (m_AudioHle)
|
|
||||||
{
|
|
||||||
m_ProcessAList();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (try_fast_audio_dispatching())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
m_ShowCFB();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CHle::try_fast_audio_dispatching(void)
|
bool CHle::try_fast_audio_dispatching(void)
|
||||||
{
|
{
|
||||||
// Identify audio microcode by using the content of ucode_data
|
// Identify audio microcode by using the content of ucode_data
|
||||||
|
|
|
@ -17,10 +17,12 @@
|
||||||
#define UNUSED(x) /* x */
|
#define UNUSED(x) /* x */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class CRSPSystem;
|
||||||
|
|
||||||
class CHle
|
class CHle
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CHle(const RSP_INFO & Rsp_Info);
|
CHle(CRSPSystem & System);
|
||||||
~CHle();
|
~CHle();
|
||||||
|
|
||||||
uint8_t * dram()
|
uint8_t * dram()
|
||||||
|
@ -71,7 +73,6 @@ public:
|
||||||
void ErrorMessage(const char * message, ...);
|
void ErrorMessage(const char * message, ...);
|
||||||
|
|
||||||
void rsp_break(uint32_t setbits);
|
void rsp_break(uint32_t setbits);
|
||||||
void hle_execute(void);
|
|
||||||
|
|
||||||
bool try_fast_audio_dispatching(void);
|
bool try_fast_audio_dispatching(void);
|
||||||
|
|
||||||
|
@ -81,40 +82,37 @@ private:
|
||||||
CHle & operator=(const CHle &);
|
CHle & operator=(const CHle &);
|
||||||
|
|
||||||
bool is_task(void);
|
bool is_task(void);
|
||||||
bool try_fast_task_dispatching(void);
|
|
||||||
void normal_task_dispatching(void);
|
void normal_task_dispatching(void);
|
||||||
void non_task_dispatching(void);
|
void non_task_dispatching(void);
|
||||||
|
|
||||||
uint8_t * m_dram;
|
uint8_t *& m_dram;
|
||||||
uint8_t * m_dmem;
|
uint8_t *& m_dmem;
|
||||||
uint8_t * m_imem;
|
uint8_t *& m_imem;
|
||||||
|
|
||||||
uint32_t * m_mi_intr;
|
uint32_t *& m_mi_intr;
|
||||||
|
|
||||||
uint32_t * m_sp_mem_addr;
|
uint32_t *& m_sp_mem_addr;
|
||||||
uint32_t * m_sp_dram_addr;
|
uint32_t *& m_sp_dram_addr;
|
||||||
uint32_t * m_sp_rd_length;
|
uint32_t *& m_sp_rd_length;
|
||||||
uint32_t * m_sp_wr_length;
|
uint32_t *& m_sp_wr_length;
|
||||||
uint32_t * m_sp_status;
|
uint32_t *& m_sp_status;
|
||||||
uint32_t * m_sp_dma_full;
|
uint32_t *& m_sp_dma_full;
|
||||||
uint32_t * m_sp_dma_busy;
|
uint32_t *& m_sp_dma_busy;
|
||||||
uint32_t * m_sp_pc;
|
uint32_t *& m_sp_pc;
|
||||||
uint32_t * m_sp_semaphore;
|
uint32_t *& m_sp_semaphore;
|
||||||
|
|
||||||
uint32_t * m_dpc_start;
|
uint32_t *& m_dpc_start;
|
||||||
uint32_t * m_dpc_end;
|
uint32_t *& m_dpc_end;
|
||||||
uint32_t * m_dpc_current;
|
uint32_t *& m_dpc_current;
|
||||||
uint32_t * m_dpc_status;
|
uint32_t *& m_dpc_status;
|
||||||
uint32_t * m_dpc_clock;
|
uint32_t *& m_dpc_clock;
|
||||||
uint32_t * m_dpc_bufbusy;
|
uint32_t *& m_dpc_bufbusy;
|
||||||
uint32_t * m_dpc_pipebusy;
|
uint32_t *& m_dpc_pipebusy;
|
||||||
uint32_t * m_dpc_tmem;
|
uint32_t *& m_dpc_tmem;
|
||||||
|
|
||||||
void (*m_CheckInterrupts)(void);
|
void (*&m_CheckInterrupts)(void);
|
||||||
void (*m_ProcessDList)(void);
|
void (*&m_ProcessDList)(void);
|
||||||
void (*m_ProcessAList)(void);
|
void (*&m_ProcessRdpList)(void);
|
||||||
void (*m_ProcessRdpList)(void);
|
|
||||||
void (*m_ShowCFB)(void);
|
|
||||||
|
|
||||||
// alist.cpp
|
// alist.cpp
|
||||||
uint8_t m_alist_buffer[0x1000];
|
uint8_t m_alist_buffer[0x1000];
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
<ClCompile Include="Hle\audio.cpp" />
|
<ClCompile Include="Hle\audio.cpp" />
|
||||||
<ClCompile Include="Hle\cicx105.cpp" />
|
<ClCompile Include="Hle\cicx105.cpp" />
|
||||||
<ClCompile Include="Hle\hle.cpp" />
|
<ClCompile Include="Hle\hle.cpp" />
|
||||||
|
<ClCompile Include="Hle\HleTask.cpp" />
|
||||||
<ClCompile Include="Hle\jpeg.cpp" />
|
<ClCompile Include="Hle\jpeg.cpp" />
|
||||||
<ClCompile Include="Hle\mem.cpp" />
|
<ClCompile Include="Hle\mem.cpp" />
|
||||||
<ClCompile Include="Hle\mp3.cpp" />
|
<ClCompile Include="Hle\mp3.cpp" />
|
||||||
|
@ -92,6 +93,7 @@
|
||||||
<ClInclude Include="Hle\arithmetics.h" />
|
<ClInclude Include="Hle\arithmetics.h" />
|
||||||
<ClInclude Include="Hle\audio.h" />
|
<ClInclude Include="Hle\audio.h" />
|
||||||
<ClInclude Include="Hle\hle.h" />
|
<ClInclude Include="Hle\hle.h" />
|
||||||
|
<ClInclude Include="Hle\HleTask.h" />
|
||||||
<ClInclude Include="Hle\mem.h" />
|
<ClInclude Include="Hle\mem.h" />
|
||||||
<ClInclude Include="Hle\ucodes.h" />
|
<ClInclude Include="Hle\ucodes.h" />
|
||||||
<ClInclude Include="Recompiler\RspProfiling.h" />
|
<ClInclude Include="Recompiler\RspProfiling.h" />
|
||||||
|
|
|
@ -138,6 +138,9 @@
|
||||||
<ClCompile Include="cpu\RspSystem.cpp">
|
<ClCompile Include="cpu\RspSystem.cpp">
|
||||||
<Filter>Source Files\cpu</Filter>
|
<Filter>Source Files\cpu</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Hle\HleTask.cpp">
|
||||||
|
<Filter>Source Files\hle</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="cpu\RSPInstruction.h">
|
<ClInclude Include="cpu\RSPInstruction.h">
|
||||||
|
@ -221,5 +224,8 @@
|
||||||
<ClInclude Include="cpu\RspPipelineStage.h">
|
<ClInclude Include="cpu\RspPipelineStage.h">
|
||||||
<Filter>Header Files\cpu</Filter>
|
<Filter>Header Files\cpu</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Hle\HleTask.h">
|
||||||
|
<Filter>Header Files\hle</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -1,5 +1,4 @@
|
||||||
#include "RSPInfo.h"
|
#include "RSPInfo.h"
|
||||||
#include <Project64-rsp-core/Hle/hle.h>
|
|
||||||
#include <Project64-rsp-core/Recompiler/RspProfiling.h>
|
#include <Project64-rsp-core/Recompiler/RspProfiling.h>
|
||||||
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
#include <Project64-rsp-core/Settings/RspSettings.h>
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
|
@ -17,7 +16,6 @@
|
||||||
|
|
||||||
RSP_INFO RSPInfo;
|
RSP_INFO RSPInfo;
|
||||||
uint32_t RdramSize = 0;
|
uint32_t RdramSize = 0;
|
||||||
CHle * g_hle = nullptr;
|
|
||||||
|
|
||||||
void ClearAllx86Code(void);
|
void ClearAllx86Code(void);
|
||||||
|
|
||||||
|
@ -122,12 +120,6 @@ void InitilizeRSP(RSP_INFO & Rsp_Info)
|
||||||
#ifdef GenerateLog
|
#ifdef GenerateLog
|
||||||
Start_Log();
|
Start_Log();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (g_hle != nullptr)
|
|
||||||
{
|
|
||||||
delete g_hle;
|
|
||||||
g_hle = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RspRomOpened(void)
|
void RspRomOpened(void)
|
||||||
|
@ -166,9 +158,4 @@ void RspRomClosed(void)
|
||||||
void FreeRSP(void)
|
void FreeRSP(void)
|
||||||
{
|
{
|
||||||
FreeMemory();
|
FreeMemory();
|
||||||
if (g_hle != nullptr)
|
|
||||||
{
|
|
||||||
delete g_hle;
|
|
||||||
g_hle = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -3,7 +3,6 @@
|
||||||
class CHle;
|
class CHle;
|
||||||
|
|
||||||
extern RSP_INFO RSPInfo;
|
extern RSP_INFO RSPInfo;
|
||||||
extern CHle * g_hle;
|
|
||||||
|
|
||||||
void InitilizeRSP(RSP_INFO & Rsp_Info);
|
void InitilizeRSP(RSP_INFO & Rsp_Info);
|
||||||
void RspPluginLoaded(void);
|
void RspPluginLoaded(void);
|
||||||
|
|
|
@ -9,6 +9,7 @@ enum class RSPCpuMethod
|
||||||
{
|
{
|
||||||
Interpreter = 0,
|
Interpreter = 0,
|
||||||
Recompiler = 1,
|
Recompiler = 1,
|
||||||
|
HighLevelEmulation = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
class CRSPSettings
|
class CRSPSettings
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "RSPCpu.h"
|
#include "RSPCpu.h"
|
||||||
#include <Common/CriticalSection.h>
|
#include <Common/CriticalSection.h>
|
||||||
#include <Project64-rsp-core/Hle/hle.h>
|
|
||||||
#include <Project64-rsp-core/RSPDebugger.h>
|
#include <Project64-rsp-core/RSPDebugger.h>
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
|
@ -96,60 +95,10 @@ be greater than the number of cycles that the RSP should have performed.
|
||||||
|
|
||||||
uint32_t DoRspCycles(uint32_t Cycles)
|
uint32_t DoRspCycles(uint32_t Cycles)
|
||||||
{
|
{
|
||||||
extern bool AudioHle, GraphicsHle;
|
if (RSPSystem.IsHleTask() && RSPSystem.ProcessHleTask())
|
||||||
uint32_t TaskType = *(uint32_t *)(RSPInfo.DMEM + 0xFC0);
|
|
||||||
|
|
||||||
if (TaskType == 1 && GraphicsHle && *(uint32_t *)(RSPInfo.DMEM + 0x0ff0) != 0)
|
|
||||||
{
|
{
|
||||||
if (RSPInfo.ProcessDList != NULL)
|
|
||||||
{
|
|
||||||
RSPInfo.ProcessDList();
|
|
||||||
}
|
|
||||||
*RSPInfo.SP_STATUS_REG |= (0x0203);
|
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
|
||||||
{
|
|
||||||
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
|
||||||
RSPInfo.CheckInterrupts();
|
|
||||||
}
|
|
||||||
|
|
||||||
*RSPInfo.DPC_STATUS_REG &= ~0x0002;
|
|
||||||
return Cycles;
|
return Cycles;
|
||||||
}
|
}
|
||||||
else if (TaskType == 2 && HleAlistTask)
|
|
||||||
{
|
|
||||||
if (g_hle == nullptr)
|
|
||||||
{
|
|
||||||
g_hle = new CHle(RSPInfo);
|
|
||||||
}
|
|
||||||
if (g_hle != nullptr)
|
|
||||||
{
|
|
||||||
g_hle->try_fast_audio_dispatching();
|
|
||||||
*RSPInfo.SP_STATUS_REG |= SP_STATUS_SIG2 | SP_STATUS_BROKE | SP_STATUS_HALT;
|
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
|
||||||
{
|
|
||||||
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
|
||||||
RSPInfo.CheckInterrupts();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (TaskType == 2 && AudioHle)
|
|
||||||
{
|
|
||||||
if (RSPInfo.ProcessAList != NULL)
|
|
||||||
{
|
|
||||||
RSPInfo.ProcessAList();
|
|
||||||
}
|
|
||||||
*RSPInfo.SP_STATUS_REG |= SP_STATUS_SIG2 | SP_STATUS_BROKE | SP_STATUS_HALT;
|
|
||||||
if ((*RSPInfo.SP_STATUS_REG & SP_STATUS_INTR_BREAK) != 0)
|
|
||||||
{
|
|
||||||
*RSPInfo.MI_INTR_REG |= MI_INTR_SP;
|
|
||||||
RSPInfo.CheckInterrupts();
|
|
||||||
}
|
|
||||||
return Cycles;
|
|
||||||
}
|
|
||||||
else if (TaskType == 7)
|
|
||||||
{
|
|
||||||
RSPInfo.ShowCFB();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_RSPDebugger != nullptr)
|
if (g_RSPDebugger != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -163,6 +112,7 @@ uint32_t DoRspCycles(uint32_t Cycles)
|
||||||
RSPSystem.RunRecompiler();
|
RSPSystem.RunRecompiler();
|
||||||
break;
|
break;
|
||||||
case RSPCpuMethod::Interpreter:
|
case RSPCpuMethod::Interpreter:
|
||||||
|
case RSPCpuMethod::HighLevelEmulation:
|
||||||
RSPSystem.RunInterpreterCPU(Cycles);
|
RSPSystem.RunInterpreterCPU(Cycles);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
CRSPSystem RSPSystem;
|
CRSPSystem RSPSystem;
|
||||||
|
|
||||||
CRSPSystem::CRSPSystem() :
|
CRSPSystem::CRSPSystem() :
|
||||||
|
CHleTask(*this),
|
||||||
m_Recompiler(*this),
|
m_Recompiler(*this),
|
||||||
m_RSPRegisterHandler(nullptr),
|
m_RSPRegisterHandler(nullptr),
|
||||||
m_Op(*this),
|
m_Op(*this),
|
||||||
|
@ -38,6 +39,7 @@ CRSPSystem::CRSPSystem() :
|
||||||
m_DPC_PIPEBUSY_REG(nullptr),
|
m_DPC_PIPEBUSY_REG(nullptr),
|
||||||
m_DPC_TMEM_REG(nullptr),
|
m_DPC_TMEM_REG(nullptr),
|
||||||
CheckInterrupts(nullptr),
|
CheckInterrupts(nullptr),
|
||||||
|
ProcessDList(nullptr),
|
||||||
ProcessRdpList(nullptr),
|
ProcessRdpList(nullptr),
|
||||||
m_RdramSize(0)
|
m_RdramSize(0)
|
||||||
{
|
{
|
||||||
|
@ -80,6 +82,7 @@ void CRSPSystem::Reset(RSP_INFO & Info)
|
||||||
m_DPC_PIPEBUSY_REG = Info.DPC_PIPEBUSY_REG;
|
m_DPC_PIPEBUSY_REG = Info.DPC_PIPEBUSY_REG;
|
||||||
m_DPC_TMEM_REG = Info.DPC_TMEM_REG;
|
m_DPC_TMEM_REG = Info.DPC_TMEM_REG;
|
||||||
CheckInterrupts = Info.CheckInterrupts;
|
CheckInterrupts = Info.CheckInterrupts;
|
||||||
|
ProcessDList = Info.ProcessDList;
|
||||||
ProcessRdpList = Info.ProcessRdpList;
|
ProcessRdpList = Info.ProcessRdpList;
|
||||||
|
|
||||||
m_RdramSize = Set_AllocatedRdramSize != 0 ? GetSystemSetting(Set_AllocatedRdramSize) : 0;
|
m_RdramSize = Set_AllocatedRdramSize != 0 ? GetSystemSetting(Set_AllocatedRdramSize) : 0;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Project64-rsp-core/Hle/HleTask.h>
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
#include <Project64-rsp-core/cpu/RSPInterpreterOps.h>
|
||||||
|
@ -9,15 +10,18 @@
|
||||||
|
|
||||||
class RSPRegisterHandlerPlugin;
|
class RSPRegisterHandlerPlugin;
|
||||||
|
|
||||||
class CRSPSystem
|
class CRSPSystem :
|
||||||
|
public CHleTask
|
||||||
{
|
{
|
||||||
friend class RSPOp;
|
friend class RSPOp;
|
||||||
friend class CRSPRecompilerOps;
|
friend class CRSPRecompilerOps;
|
||||||
friend class CRSPRecompiler;
|
friend class CRSPRecompiler;
|
||||||
|
friend class CHleTask;
|
||||||
friend class RSPDebuggerUI;
|
friend class RSPDebuggerUI;
|
||||||
friend class CRDPLog;
|
friend class CRDPLog;
|
||||||
friend class RSPRegisterHandler;
|
friend class RSPRegisterHandler;
|
||||||
friend class RSPRegisterHandlerPlugin;
|
friend class RSPRegisterHandlerPlugin;
|
||||||
|
friend class CHle;
|
||||||
|
|
||||||
friend void UpdateRSPRegistersScreen(void);
|
friend void UpdateRSPRegistersScreen(void);
|
||||||
|
|
||||||
|
@ -66,6 +70,7 @@ private:
|
||||||
uint32_t * m_DPC_TMEM_REG;
|
uint32_t * m_DPC_TMEM_REG;
|
||||||
uint32_t m_RdramSize;
|
uint32_t m_RdramSize;
|
||||||
void (*CheckInterrupts)(void);
|
void (*CheckInterrupts)(void);
|
||||||
|
void (*ProcessDList)(void);
|
||||||
void (*ProcessRdpList)(void);
|
void (*ProcessRdpList)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -175,9 +175,11 @@ void FixMenuState(void)
|
||||||
EnableMenuItem(hRSPMenu, ID_DUMP_DMEM, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_DUMP_DMEM, MF_BYCOMMAND | (DebuggingEnabled ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_CPUMETHOD_RECOMPILER, MF_BYCOMMAND | (!CRSPSettings::RomOpen() ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_CPUMETHOD_RECOMPILER, MF_BYCOMMAND | (!CRSPSettings::RomOpen() ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
EnableMenuItem(hRSPMenu, ID_CPUMETHOD_INTERPT, MF_BYCOMMAND | (!CRSPSettings::RomOpen() ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
EnableMenuItem(hRSPMenu, ID_CPUMETHOD_INTERPT, MF_BYCOMMAND | (!CRSPSettings::RomOpen() ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
|
EnableMenuItem(hRSPMenu, ID_CPUMETHOD_HLE, MF_BYCOMMAND | (!CRSPSettings::RomOpen() ? MF_ENABLED : (MF_GRAYED | MF_DISABLED)));
|
||||||
|
|
||||||
CheckMenuItem(hRSPMenu, ID_CPUMETHOD_RECOMPILER, MF_BYCOMMAND | ((RSPCpuMethod)GetSetting(Set_CPUCore) == RSPCpuMethod::Recompiler ? MFS_CHECKED : MF_UNCHECKED));
|
CheckMenuItem(hRSPMenu, ID_CPUMETHOD_RECOMPILER, MF_BYCOMMAND | ((RSPCpuMethod)GetSetting(Set_CPUCore) == RSPCpuMethod::Recompiler ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
CheckMenuItem(hRSPMenu, ID_CPUMETHOD_INTERPT, MF_BYCOMMAND | ((RSPCpuMethod)GetSetting(Set_CPUCore) == RSPCpuMethod::Interpreter ? MFS_CHECKED : MF_UNCHECKED));
|
CheckMenuItem(hRSPMenu, ID_CPUMETHOD_INTERPT, MF_BYCOMMAND | ((RSPCpuMethod)GetSetting(Set_CPUCore) == RSPCpuMethod::Interpreter ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
|
CheckMenuItem(hRSPMenu, ID_CPUMETHOD_HLE, MF_BYCOMMAND | ((RSPCpuMethod)GetSetting(Set_CPUCore) == RSPCpuMethod::HighLevelEmulation ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
CheckMenuItem(hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | (BreakOnStart ? MFS_CHECKED : MF_UNCHECKED));
|
CheckMenuItem(hRSPMenu, ID_BREAKONSTARTOFTASK, MF_BYCOMMAND | (BreakOnStart ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
CheckMenuItem(hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | (LogRDP ? MFS_CHECKED : MF_UNCHECKED));
|
CheckMenuItem(hRSPMenu, ID_LOGRDPCOMMANDS, MF_BYCOMMAND | (LogRDP ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
CheckMenuItem(hRSPMenu, ID_SETTINGS_HLEALISTTASK, MF_BYCOMMAND | (HleAlistTask ? MFS_CHECKED : MF_UNCHECKED));
|
CheckMenuItem(hRSPMenu, ID_SETTINGS_HLEALISTTASK, MF_BYCOMMAND | (HleAlistTask ? MFS_CHECKED : MF_UNCHECKED));
|
||||||
|
@ -408,6 +410,10 @@ void ProcessMenuItem(int32_t ID)
|
||||||
SetSetting(Set_CPUCore, (int)RSPCpuMethod::Interpreter);
|
SetSetting(Set_CPUCore, (int)RSPCpuMethod::Interpreter);
|
||||||
FixMenuState();
|
FixMenuState();
|
||||||
break;
|
break;
|
||||||
|
case ID_CPUMETHOD_HLE:
|
||||||
|
SetSetting(Set_CPUCore, (int)RSPCpuMethod::HighLevelEmulation);
|
||||||
|
FixMenuState();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -171,6 +171,7 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
MENUITEM "Recompiler", ID_CPUMETHOD_RECOMPILER
|
MENUITEM "Recompiler", ID_CPUMETHOD_RECOMPILER
|
||||||
MENUITEM "Interpreter", ID_CPUMETHOD_INTERPT
|
MENUITEM "Interpreter", ID_CPUMETHOD_INTERPT
|
||||||
|
MENUITEM "HLE", ID_CPUMETHOD_HLE
|
||||||
END
|
END
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
POPUP "Pro&filing"
|
POPUP "Pro&filing"
|
||||||
|
|
|
@ -39,13 +39,14 @@
|
||||||
#define ID_SETTINGS_LOGX86CODE 5019
|
#define ID_SETTINGS_LOGX86CODE 5019
|
||||||
#define ID_SETTINGS_MULTITHREADED 5020
|
#define ID_SETTINGS_MULTITHREADED 5020
|
||||||
#define ID_SETTINGS_HLEALISTTASK 5021
|
#define ID_SETTINGS_HLEALISTTASK 5021
|
||||||
|
#define ID_CPUMETHOD_HLE 5022
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 108
|
#define _APS_NEXT_RESOURCE_VALUE 108
|
||||||
#define _APS_NEXT_COMMAND_VALUE 5022
|
#define _APS_NEXT_COMMAND_VALUE 5023
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1032
|
#define _APS_NEXT_CONTROL_VALUE 1032
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue