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