1 #include "INTC.h"
2 #include "../Log.h"
3 #include "../states/RegisterStateFile.h"
4 
5 #define LOG_NAME ("ee_intc")
6 
7 #define STATE_REGS_XML ("intc/regs.xml")
8 
CINTC(CDMAC & dmac)9 CINTC::CINTC(CDMAC& dmac)
10     : m_INTC_STAT(0)
11     , m_INTC_MASK(0)
12     , m_dmac(dmac)
13 {
14 }
15 
Reset()16 void CINTC::Reset()
17 {
18 	m_INTC_STAT = 0;
19 	m_INTC_MASK = 0;
20 }
21 
GetStat() const22 uint32 CINTC::GetStat() const
23 {
24 	uint32 tempStat = m_INTC_STAT;
25 
26 	if(m_dmac.IsInterruptPending())
27 	{
28 		tempStat |= (1 << INTC_LINE_DMAC);
29 	}
30 
31 	return tempStat;
32 }
33 
IsInterruptPending() const34 bool CINTC::IsInterruptPending() const
35 {
36 	return (GetStat() & m_INTC_MASK) != 0;
37 }
38 
GetRegister(uint32 nAddress)39 uint32 CINTC::GetRegister(uint32 nAddress)
40 {
41 	switch(nAddress)
42 	{
43 	case INTC_STAT:
44 		return GetStat();
45 		break;
46 	case INTC_MASK:
47 		return m_INTC_MASK;
48 		break;
49 	default:
50 		CLog::GetInstance().Warn(LOG_NAME, "Read an unhandled register (0x%08X).\r\n", nAddress);
51 		break;
52 	}
53 
54 	return 0;
55 }
56 
SetRegister(uint32 nAddress,uint32 nValue)57 void CINTC::SetRegister(uint32 nAddress, uint32 nValue)
58 {
59 	switch(nAddress)
60 	{
61 	case INTC_STAT:
62 		m_INTC_STAT &= ~nValue;
63 		break;
64 	case INTC_MASK:
65 		m_INTC_MASK ^= nValue;
66 		break;
67 	default:
68 		CLog::GetInstance().Warn(LOG_NAME, "Wrote to an unhandled register (0x%08X).\r\n", nAddress);
69 		break;
70 	}
71 }
72 
AssertLine(uint32 nLine)73 void CINTC::AssertLine(uint32 nLine)
74 {
75 	m_INTC_STAT |= (1 << nLine);
76 }
77 
LoadState(Framework::CZipArchiveReader & archive)78 void CINTC::LoadState(Framework::CZipArchiveReader& archive)
79 {
80 	CRegisterStateFile registerFile(*archive.BeginReadFile(STATE_REGS_XML));
81 	m_INTC_STAT = registerFile.GetRegister32("INTC_STAT");
82 	m_INTC_MASK = registerFile.GetRegister32("INTC_MASK");
83 }
84 
SaveState(Framework::CZipArchiveWriter & archive)85 void CINTC::SaveState(Framework::CZipArchiveWriter& archive)
86 {
87 	CRegisterStateFile* registerFile = new CRegisterStateFile(STATE_REGS_XML);
88 	registerFile->SetRegister32("INTC_STAT", m_INTC_STAT);
89 	registerFile->SetRegister32("INTC_MASK", m_INTC_MASK);
90 	archive.InsertFile(registerFile);
91 }
92