Play-/Source/iop/Iop_DmacChannel.h

76 lines
1.6 KiB
C
Raw Permalink Normal View History

2017-02-10 22:24:40 -05:00
#pragma once
#include "Convertible.h"
#include "Types.h"
2017-02-11 15:00:24 -05:00
#include "zip/ZipArchiveWriter.h"
#include "zip/ZipArchiveReader.h"
#include <functional>
namespace Iop
{
class CDmac;
namespace Dmac
{
class CChannel
{
public:
2021-04-01 17:22:33 -04:00
typedef std::function<uint32(uint8*, uint32, uint32, uint32)> ReceiveFunctionType;
enum
{
2018-04-30 21:01:23 +01:00
REG_MADR = 0x00,
REG_BCR = 0x04,
REG_CHCR = 0x08
};
2021-04-01 17:22:33 -04:00
enum CHCR_DIR
{
CHCR_DR_TO = 0,
CHCR_DR_FROM = 1,
};
struct BCR : public convertible<uint32>
{
2018-04-30 21:01:23 +01:00
unsigned int bs : 16;
unsigned int ba : 16;
};
static_assert(sizeof(BCR) == sizeof(uint32), "Size of BCR struct must be 4 bytes.");
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;
};
static_assert(sizeof(CHCR) == sizeof(uint32), "Size of CHCR struct must be 4 bytes.");
CChannel(uint32, unsigned int, unsigned int, CDmac&);
2018-04-30 21:01:23 +01:00
virtual ~CChannel() = default;
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);
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;
unsigned int m_intrLine;
2018-04-30 21:01:23 +01:00
uint32 m_baseAddress;
uint32 m_MADR;
BCR m_BCR;
CHCR m_CHCR;
};
}
}