project64/Source/Project64-rsp-core/Hle/HleTask.h

82 lines
2.0 KiB
C++

#pragma once
#include <Project64-rsp-core/Hle/hle.h>
#include <Project64-rsp-core/cpu/RSPRegisters.h>
#include <Project64-rsp-core/cpu/RspTypes.h>
#include <map>
#include <stdint.h>
#include <vector>
class CRSPSystem;
class RSPRegisterHandlerPlugin;
class CRSPRecompiler;
class CHle;
class CHleTask :
private CGPRRegisters
{
typedef std::pair<uint32_t, void *> TaskFunctionAddress;
typedef std::vector<TaskFunctionAddress> TaskFunctions;
typedef std::map<uint32_t, TaskFunctions> TaskFunctionMap;
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 SetupCommandList(TASK_INFO & TaskInfo);
void ExecuteTask_1a13a51a(TASK_INFO & TaskInfo);
void SetupTask(TASK_INFO & TaskInfo);
void (*&CheckInterrupts)(void);
void (*&ProcessDList)(void);
CHle m_hle;
TaskFunctionMap m_FunctionMap;
const TaskFunctions * m_TaskFunctions;
CRSPSystem & m_System;
CRSPRecompiler & m_Recompiler;
RSPRegisterHandlerPlugin *& m_RSPRegisterHandler;
uint32_t *& m_MI_INTR_REG;
uint32_t *& m_SP_STATUS_REG;
uint32_t *& m_SP_DMA_FULL_REG;
uint32_t *& m_SP_DMA_BUSY_REG;
uint32_t *& m_SP_PC_REG;
uint32_t *& m_SP_SEMAPHORE_REG;
uint32_t *& m_DPC_STATUS_REG;
uint8_t *& m_DMEM;
uint8_t *& m_IMEM;
uint32_t m_UcodeCRC;
};