2006-06-15 04:19:30 +00:00
|
|
|
#ifndef _SIF_H_
|
|
|
|
#define _SIF_H_
|
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
#include <map>
|
2008-10-20 04:12:44 +00:00
|
|
|
#include <vector>
|
2008-01-15 20:27:44 +00:00
|
|
|
#include "SifModule.h"
|
2008-01-12 01:27:04 +00:00
|
|
|
#include "DMAC.h"
|
2008-01-25 23:47:09 +00:00
|
|
|
#include "zip/ZipArchiveWriter.h"
|
|
|
|
#include "zip/ZipArchiveReader.h"
|
2009-03-08 23:57:51 +00:00
|
|
|
#include "RegisterStateFile.h"
|
|
|
|
#include "StructFile.h"
|
2008-01-12 01:27:04 +00:00
|
|
|
|
2006-06-15 04:19:30 +00:00
|
|
|
class CSIF
|
|
|
|
{
|
|
|
|
public:
|
2008-10-20 04:12:44 +00:00
|
|
|
struct PACKETHDR
|
|
|
|
{
|
|
|
|
uint32 nSize;
|
|
|
|
uint32 nDest;
|
|
|
|
uint32 nCID;
|
|
|
|
uint32 nOptional;
|
|
|
|
};
|
|
|
|
|
|
|
|
CSIF(CDMAC&, uint8*, uint8*);
|
2008-01-12 01:27:04 +00:00
|
|
|
virtual ~CSIF();
|
|
|
|
|
|
|
|
void Reset();
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-10-20 04:12:44 +00:00
|
|
|
void ProcessPackets();
|
|
|
|
|
2008-01-15 20:27:44 +00:00
|
|
|
void RegisterModule(uint32, CSifModule*);
|
2009-02-04 02:15:56 +00:00
|
|
|
void UnregisterModule(uint32);
|
2009-01-26 02:53:10 +00:00
|
|
|
void SetDmaBuffer(uint32, uint32);
|
2008-12-15 02:57:21 +00:00
|
|
|
void SendCallReply(uint32, void*);
|
2008-01-15 20:27:44 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint32 ReceiveDMA5(uint32, uint32, uint32, bool);
|
|
|
|
uint32 ReceiveDMA6(uint32, uint32, uint32, bool);
|
2008-10-20 04:12:44 +00:00
|
|
|
|
|
|
|
void SendPacket(void*, uint32);
|
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
void SendDMA(void*, uint32);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint32 GetRegister(uint32);
|
|
|
|
void SetRegister(uint32, uint32);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2009-08-08 02:24:35 +00:00
|
|
|
void LoadState(Framework::CZipArchiveReader&);
|
|
|
|
void SaveState(Framework::CZipArchiveWriter&);
|
2006-06-15 04:19:30 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
enum CONST_MAX_USERREG
|
|
|
|
{
|
|
|
|
MAX_USERREG = 0x10,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum CONST_SIF_CMD
|
|
|
|
{
|
|
|
|
SIF_CMD_INIT = 0x80000002,
|
|
|
|
SIF_CMD_REND = 0x80000008,
|
|
|
|
SIF_CMD_BIND = 0x80000009,
|
|
|
|
SIF_CMD_CALL = 0x8000000A,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RPCREQUESTEND
|
|
|
|
{
|
2008-01-12 01:27:04 +00:00
|
|
|
PACKETHDR Header;
|
|
|
|
uint32 nRecordID;
|
|
|
|
uint32 nPacketAddr;
|
|
|
|
uint32 nRPCID;
|
|
|
|
uint32 nClientDataAddr;
|
|
|
|
uint32 nCID;
|
|
|
|
uint32 nServerDataAddr;
|
|
|
|
uint32 nBuffer;
|
|
|
|
uint32 nClientBuffer;
|
2006-06-15 04:19:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct RPCBIND
|
|
|
|
{
|
2008-01-12 01:27:04 +00:00
|
|
|
PACKETHDR Header;
|
|
|
|
uint32 nRecordID;
|
|
|
|
uint32 nPacketAddr;
|
|
|
|
uint32 nRPCID;
|
|
|
|
uint32 nClientDataAddr;
|
|
|
|
uint32 nSID;
|
2006-06-15 04:19:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct RPCCALL
|
|
|
|
{
|
2008-01-12 01:27:04 +00:00
|
|
|
PACKETHDR Header;
|
|
|
|
uint32 nRecordID;
|
|
|
|
uint32 nPacketAddr;
|
|
|
|
uint32 nRPCID;
|
|
|
|
uint32 nClientDataAddr;
|
|
|
|
uint32 nRPCNumber;
|
|
|
|
uint32 nSendSize;
|
|
|
|
uint32 nRecv;
|
|
|
|
uint32 nRecvSize;
|
|
|
|
uint32 nRecvMode;
|
|
|
|
uint32 nServerDataAddr;
|
2006-06-15 04:19:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct SETSREG
|
|
|
|
{
|
2008-01-12 01:27:04 +00:00
|
|
|
PACKETHDR Header;
|
|
|
|
uint32 nRegister;
|
|
|
|
uint32 nValue;
|
2006-06-15 04:19:30 +00:00
|
|
|
};
|
|
|
|
|
2008-12-15 02:57:21 +00:00
|
|
|
struct CALLREQUESTINFO
|
|
|
|
{
|
|
|
|
RPCCALL call;
|
|
|
|
RPCREQUESTEND reply;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef std::map<uint32, CSifModule*> ModuleMap;
|
|
|
|
typedef std::vector<uint8> PacketQueue;
|
|
|
|
typedef std::map<uint32, CALLREQUESTINFO> CallReplyMap;
|
|
|
|
typedef std::map<uint32, RPCREQUESTEND> BindReplyMap;
|
|
|
|
|
|
|
|
void DeleteModules();
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2009-03-08 23:57:51 +00:00
|
|
|
void SaveState_Header(const std::string&, CStructFile&, const PACKETHDR&);
|
|
|
|
void SaveState_RpcCall(CStructFile&, const RPCCALL&);
|
|
|
|
void SaveState_RequestEnd(CStructFile&, const RPCREQUESTEND&);
|
|
|
|
|
|
|
|
void LoadState_Header(const std::string&, const CStructFile&, PACKETHDR&);
|
|
|
|
void LoadState_RpcCall(const CStructFile&, RPCCALL&);
|
|
|
|
void LoadState_RequestEnd(const CStructFile&, RPCREQUESTEND&);
|
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
void Cmd_SetEERecvAddr(PACKETHDR*);
|
|
|
|
void Cmd_Initialize(PACKETHDR*);
|
|
|
|
void Cmd_Bind(PACKETHDR*);
|
|
|
|
void Cmd_Call(PACKETHDR*);
|
2006-07-13 00:29:16 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint8* m_eeRam;
|
2008-10-20 04:12:44 +00:00
|
|
|
uint8* m_iopRam;
|
2008-01-15 20:27:44 +00:00
|
|
|
uint8* m_dmaBuffer;
|
|
|
|
uint32 m_dmaBufferSize;
|
2008-01-12 01:27:04 +00:00
|
|
|
CDMAC& m_dmac;
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint32 m_nMAINADDR;
|
|
|
|
uint32 m_nSUBADDR;
|
|
|
|
uint32 m_nMSFLAG;
|
|
|
|
uint32 m_nSMFLAG;
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint32 m_nEERecvAddr;
|
|
|
|
uint32 m_nDataAddr;
|
2006-06-15 04:19:30 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
uint32 m_nUserReg[MAX_USERREG];
|
2006-07-13 00:29:16 +00:00
|
|
|
|
2008-01-12 01:27:04 +00:00
|
|
|
ModuleMap m_modules;
|
2008-10-20 04:12:44 +00:00
|
|
|
PacketQueue m_packetQueue;
|
2008-12-15 02:57:21 +00:00
|
|
|
CallReplyMap m_callReplies;
|
|
|
|
BindReplyMap m_bindReplies;
|
2006-06-15 04:19:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|