2014-11-08 01:14:48 -05:00
|
|
|
#pragma once
|
2008-10-20 04:14:13 +00:00
|
|
|
|
2008-11-10 01:46:02 +00:00
|
|
|
#include "../SifModule.h"
|
2014-11-08 01:14:48 -05:00
|
|
|
#include "../SifDefs.h"
|
2008-11-14 17:10:21 +00:00
|
|
|
#include "Iop_Module.h"
|
2008-10-20 04:14:13 +00:00
|
|
|
|
|
|
|
namespace Iop
|
|
|
|
{
|
2012-09-18 06:33:33 +00:00
|
|
|
class CSysmem;
|
|
|
|
|
2008-11-14 17:10:21 +00:00
|
|
|
class CSifMan : public CModule
|
2012-04-07 23:44:10 +00:00
|
|
|
{
|
|
|
|
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;
|
2014-11-08 01:14:48 -05:00
|
|
|
|
2024-09-11 16:57:32 -04:00
|
|
|
CSifMan() = default;
|
2018-07-11 12:29:43 -04:00
|
|
|
virtual ~CSifMan() = default;
|
2008-10-20 04:14:13 +00:00
|
|
|
|
2024-09-11 16:57:32 -04:00
|
|
|
void PrepareModuleData(uint8*, CSysmem&);
|
|
|
|
void CountTicks(int32);
|
2012-09-18 06:33:33 +00:00
|
|
|
|
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;
|
2008-11-14 17:10:21 +00:00
|
|
|
|
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;
|
2024-10-21 15:30:51 -04:00
|
|
|
virtual void ExecuteSifDma(uint32, uint32) = 0;
|
2014-07-01 22:35:21 -04:00
|
|
|
|
2024-09-11 16:57:32 -04:00
|
|
|
private:
|
2024-10-21 15:30:51 -04:00
|
|
|
uint32 SifSetDma(uint32, uint32);
|
2024-09-11 16:57:32 -04:00
|
|
|
uint32 SifDmaStat(uint32);
|
2019-02-02 19:55:41 -05:00
|
|
|
uint32 SifCheckInit();
|
2024-09-11 16:57:32 -04:00
|
|
|
uint32 SifSetDmaCallback(CMIPS&, uint32, uint32, uint32, uint32);
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2025-01-03 17:42:35 -05:00
|
|
|
SIFSETDMACALLBACK_HANDLER_SIZE = 0x28,
|
|
|
|
DMA_TRANSFER_TIMES_SIZE = 5,
|
2024-09-11 16:57:32 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
struct MODULEDATA
|
|
|
|
{
|
|
|
|
uint8 sifSetDmaCallbackHandler[SIFSETDMACALLBACK_HANDLER_SIZE];
|
2025-01-03 17:42:35 -05:00
|
|
|
int32 dmaTransferTimes[DMA_TRANSFER_TIMES_SIZE];
|
|
|
|
int32 nextDmaTransferIdx;
|
2024-09-11 16:57:32 -04:00
|
|
|
};
|
|
|
|
static_assert(sizeof(MODULEDATA) == 0x40);
|
|
|
|
|
|
|
|
MODULEDATA* m_moduleData = nullptr;
|
|
|
|
uint32 m_sifSetDmaCallbackHandlerAddr = 0;
|
2012-04-07 23:44:10 +00:00
|
|
|
};
|
2016-01-13 22:18:10 -05:00
|
|
|
|
|
|
|
typedef std::shared_ptr<CSifMan> SifManPtr;
|
2008-10-20 04:14:13 +00:00
|
|
|
}
|