2017-02-10 22:24:40 -05:00
|
|
|
#pragma once
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2015-07-13 00:54:13 +01:00
|
|
|
#include "Convertible.h"
|
2008-11-03 00:36:40 +00:00
|
|
|
#include "Types.h"
|
2017-02-11 15:00:24 -05:00
|
|
|
#include "zip/ZipArchiveWriter.h"
|
|
|
|
#include "zip/ZipArchiveReader.h"
|
2008-11-03 00:36:40 +00:00
|
|
|
#include <functional>
|
|
|
|
|
|
|
|
namespace Iop
|
|
|
|
{
|
2012-03-11 20:16:15 +00:00
|
|
|
class CDmac;
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2012-03-11 20:16:15 +00:00
|
|
|
namespace Dmac
|
|
|
|
{
|
|
|
|
class CChannel
|
|
|
|
{
|
|
|
|
public:
|
2021-04-01 17:22:33 -04:00
|
|
|
typedef std::function<uint32(uint8*, uint32, uint32, uint32)> ReceiveFunctionType;
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2012-03-11 20:16:15 +00:00
|
|
|
enum
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
REG_MADR = 0x00,
|
|
|
|
REG_BCR = 0x04,
|
|
|
|
REG_CHCR = 0x08
|
2012-03-11 20:16:15 +00:00
|
|
|
};
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2021-04-01 17:22:33 -04:00
|
|
|
enum CHCR_DIR
|
|
|
|
{
|
|
|
|
CHCR_DR_TO = 0,
|
|
|
|
CHCR_DR_FROM = 1,
|
|
|
|
};
|
|
|
|
|
2012-03-11 20:16:15 +00:00
|
|
|
struct BCR : public convertible<uint32>
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
unsigned int bs : 16;
|
|
|
|
unsigned int ba : 16;
|
2012-03-11 20:16:15 +00:00
|
|
|
};
|
2012-08-22 05:03:08 +00:00
|
|
|
static_assert(sizeof(BCR) == sizeof(uint32), "Size of BCR struct must be 4 bytes.");
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2012-03-11 20:16:15 +00:00
|
|
|
struct CHCR : public convertible<uint32>
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
unsigned int dr : 1;
|
|
|
|
unsigned int unused0 : 8;
|
|
|
|
unsigned int co : 1;
|
|
|
|
unsigned int li : 1;
|
|
|
|
unsigned int unused1 : 13;
|
|
|
|
unsigned int tr : 1;
|
|
|
|
unsigned int unused2 : 7;
|
2012-03-11 20:16:15 +00:00
|
|
|
};
|
2012-08-22 05:03:08 +00:00
|
|
|
static_assert(sizeof(CHCR) == sizeof(uint32), "Size of CHCR struct must be 4 bytes.");
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2021-05-25 10:41:11 +02:00
|
|
|
CChannel(uint32, unsigned int, unsigned int, CDmac&);
|
2018-04-30 21:01:23 +01:00
|
|
|
virtual ~CChannel() = default;
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
void SaveState(Framework::CZipArchiveWriter&);
|
|
|
|
void LoadState(Framework::CZipArchiveReader&);
|
2017-02-11 15:00:24 -05:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
void Reset();
|
|
|
|
void SetReceiveFunction(const ReceiveFunctionType&);
|
|
|
|
void ResumeDma();
|
|
|
|
uint32 ReadRegister(uint32);
|
|
|
|
void WriteRegister(uint32, uint32);
|
2008-11-03 00:36:40 +00:00
|
|
|
|
2012-03-11 20:16:15 +00:00
|
|
|
private:
|
2018-04-30 21:01:23 +01:00
|
|
|
ReceiveFunctionType m_receiveFunction;
|
2023-05-02 08:56:25 -04:00
|
|
|
CDmac& m_dmac;
|
2018-04-30 21:01:23 +01:00
|
|
|
unsigned int m_number;
|
2021-05-25 10:41:11 +02:00
|
|
|
unsigned int m_intrLine;
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 m_baseAddress;
|
|
|
|
uint32 m_MADR;
|
|
|
|
BCR m_BCR;
|
|
|
|
CHCR m_CHCR;
|
2012-03-11 20:16:15 +00:00
|
|
|
};
|
|
|
|
}
|
2008-11-03 00:36:40 +00:00
|
|
|
}
|