Play-/Source/iop/Iop_SifMan.h

67 lines
1.9 KiB
C
Raw Permalink Normal View History

#pragma once
#include "../SifModule.h"
#include "../SifDefs.h"
#include "Iop_Module.h"
namespace Iop
{
class CSysmem;
class CSifMan : public CModule
{
public:
2024-11-06 17:43:33 -05:00
static constexpr uint32 SIFDMA_XFER_ID = 0x2222;
2018-04-30 21:01:23 +01:00
typedef std::function<void(const std::string&)> ModuleResetHandler;
typedef std::function<void(uint32)> CustomCommandHandler;
CSifMan() = default;
2018-07-11 12:29:43 -04:00
virtual ~CSifMan() = default;
void PrepareModuleData(uint8*, CSysmem&);
void CountTicks(int32);
2018-04-30 21:01:23 +01:00
std::string GetId() const override;
std::string GetFunctionName(unsigned int) const override;
void Invoke(CMIPS&, unsigned int) override;
2018-04-30 21:01:23 +01:00
virtual void RegisterModule(uint32, CSifModule*) = 0;
virtual bool IsModuleRegistered(uint32) = 0;
virtual void UnregisterModule(uint32) = 0;
2023-11-24 13:42:52 -05:00
virtual void SendPacket(const void*, uint32) = 0;
2018-04-30 21:01:23 +01:00
virtual void SetDmaBuffer(uint32, uint32) = 0;
virtual void SetCmdBuffer(uint32, uint32) = 0;
virtual void SendCallReply(uint32, const void*) = 0;
virtual void GetOtherData(uint32, uint32, uint32) = 0;
virtual void SetModuleResetHandler(const ModuleResetHandler&) = 0;
virtual void SetCustomCommandHandler(const CustomCommandHandler&) = 0;
virtual void ExecuteSifDma(uint32, uint32) = 0;
private:
uint32 SifSetDma(uint32, uint32);
uint32 SifDmaStat(uint32);
uint32 SifCheckInit();
uint32 SifSetDmaCallback(CMIPS&, uint32, uint32, uint32, uint32);
enum
{
SIFSETDMACALLBACK_HANDLER_SIZE = 0x28,
DMA_TRANSFER_TIMES_SIZE = 5,
};
struct MODULEDATA
{
uint8 sifSetDmaCallbackHandler[SIFSETDMACALLBACK_HANDLER_SIZE];
int32 dmaTransferTimes[DMA_TRANSFER_TIMES_SIZE];
int32 nextDmaTransferIdx;
};
static_assert(sizeof(MODULEDATA) == 0x40);
MODULEDATA* m_moduleData = nullptr;
uint32 m_sifSetDmaCallbackHandlerAddr = 0;
};
typedef std::shared_ptr<CSifMan> SifManPtr;
}