1 #pragma once
2 
3 #include "../MIPS.h"
4 #include "../MA_MIPSIV.h"
5 #include "../COP_SCU.h"
6 #include "Iop_BiosBase.h"
7 #include "Iop_Dev9.h"
8 #include "Iop_Dmac.h"
9 #include "Iop_Intc.h"
10 #include "Iop_RootCounters.h"
11 #include "Iop_Speed.h"
12 #include "Iop_SpuBase.h"
13 #include "Iop_Spu.h"
14 #include "Iop_Spu2.h"
15 #include "Iop_Sio2.h"
16 #include "zip/ZipArchiveWriter.h"
17 #include "zip/ZipArchiveReader.h"
18 
19 namespace Iop
20 {
21 	class CSubSystem
22 	{
23 	public:
24 		CSubSystem(bool ps2Mode);
25 		virtual ~CSubSystem();
26 
27 		void Reset();
28 		int ExecuteCpu(int);
29 		bool IsCpuIdle();
30 		void CountTicks(int);
31 
32 		void NotifyVBlankStart();
33 		void NotifyVBlankEnd();
34 
35 		void SaveState(Framework::CZipArchiveWriter&);
36 		void LoadState(Framework::CZipArchiveReader&);
37 
38 		uint8* m_ram;
39 		uint8* m_scratchPad;
40 		uint8* m_spuRam;
41 		CIntc m_intc;
42 		CRootCounters m_counters;
43 		CDmac m_dmac;
44 		CSpuBase m_spuCore0;
45 		CSpuBase m_spuCore1;
46 		CSpu m_spu;
47 		CSpu2 m_spu2;
48 		CDev9 m_dev9;
49 		CSpeed m_speed;
50 #ifdef _IOP_EMULATE_MODULES
51 		CSio2 m_sio2;
52 #endif
53 		CMIPS m_cpu;
54 		CMA_MIPSIV m_cpuArch;
55 		CCOP_SCU m_copScu;
56 		BiosBasePtr m_bios;
57 
58 	private:
59 		enum
60 		{
61 			SPEED_REG_BEGIN = 0x10000000,
62 			SPEED_REG_END = 0x1001FFFF,
63 			HW_REG_BEGIN = 0x1F801000,
64 			HW_REG_END = 0x1F9FFFFF
65 		};
66 
67 		void SetupPageTable();
68 
69 		uint32 ReadIoRegister(uint32);
70 		uint32 WriteIoRegister(uint32, uint32);
71 
72 		void CheckPendingInterrupts();
73 
74 		int m_dmaUpdateTicks;
75 	};
76 }
77