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