1 #pragma once
2 
3 #include "Types.h"
4 #include "INTC.h"
5 #include "zip/ZipArchiveWriter.h"
6 #include "zip/ZipArchiveReader.h"
7 
8 class CGSHandler;
9 
10 class CTimer
11 {
12 public:
13 	enum
14 	{
15 		MODE_CLOCK_SELECT = 0x003,
16 
17 		MODE_CLOCK_SELECT_BUSCLOCK = 0x000,
18 		MODE_CLOCK_SELECT_BUSCLOCK16 = 0x001,
19 		MODE_CLOCK_SELECT_BUSCLOCK256 = 0x002,
20 		MODE_CLOCK_SELECT_EXTERNAL = 0x003,
21 
22 		MODE_GATE_ENABLE = 0x004,
23 
24 		MODE_GATE_SELECT = 0x008,
25 		MODE_GATE_SELECT_HBLANK = 0x000,
26 		MODE_GATE_SELECT_VBLANK = 0x008,
27 
28 		MODE_GATE_MODE = 0x030,
29 		MODE_GATE_MODE_COUNTLOW = 0x000,
30 		MODE_GATE_MODE_HIGHEDGE = 0x010,
31 		MODE_GATE_MODE_LOWEDGE = 0x020,
32 		MODE_GATE_MODE_BOTHEDGE = 0x030,
33 
34 		MODE_ZERO_RETURN = 0x040,
35 		MODE_COUNT_ENABLE = 0x080,
36 		MODE_EQUAL_FLAG = 0x400,
37 		MODE_OVERFLOW_FLAG = 0x800,
38 	};
39 
40 	enum REGISTER
41 	{
42 		T3_MODE = 0x10001810,
43 	};
44 
45 	CTimer(CINTC&, CGSHandler*&);
46 	virtual ~CTimer() = default;
47 
48 	void Reset();
49 
50 	void Count(unsigned int);
51 
52 	uint32 GetRegister(uint32);
53 	void SetRegister(uint32, uint32);
54 
55 	void LoadState(Framework::CZipArchiveReader&);
56 	void SaveState(Framework::CZipArchiveWriter&);
57 
58 	void NotifyVBlankStart();
59 	void NotifyVBlankEnd();
60 
61 private:
62 	enum
63 	{
64 		MAX_TIMER = 4,
65 	};
66 
67 	void DisassembleGet(uint32);
68 	void DisassembleSet(uint32, uint32);
69 
70 	void ProcessGateEdgeChange(uint32, uint32);
71 
72 	struct TIMER
73 	{
74 		uint32 nCOUNT;
75 		uint32 nMODE;
76 		uint32 nCOMP;
77 		uint32 nHOLD;
78 
79 		uint32 clockRemain;
80 	};
81 
82 	TIMER m_timer[MAX_TIMER];
83 	CINTC& m_intc;
84 	CGSHandler*& m_gs;
85 };
86