1 ////////////////////////////////////////////////////////////////////////////////////////
2 //
3 // Nestopia - NES/Famicom emulator written in C++
4 //
5 // Copyright (C) 2003-2008 Martin Freij
6 //
7 // This file is part of Nestopia.
8 //
9 // Nestopia is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // Nestopia is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with Nestopia; if not, write to the Free Software
21 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22 //
23 ////////////////////////////////////////////////////////////////////////////////////////
24 
25 #ifndef NST_MANAGER_FRAMECLOCK_H
26 #define NST_MANAGER_FRAMECLOCK_H
27 
28 #pragma once
29 
30 #include "NstSystemTimer.hpp"
31 
32 namespace Nestopia
33 {
34 	namespace Window
35 	{
36 		class FrameClock;
37 	}
38 
39 	namespace Managers
40 	{
41 		class FrameClock : Manager
42 		{
43 		public:
44 
45 			FrameClock(Window::Menu&,Emulator&,const Configuration&,bool);
46 			~FrameClock();
47 
48 			void Save(Configuration&) const;
49 
50 		private:
51 
52 			void OnEmuEvent(Emulator::Event,Emulator::Data);
53 			void OnMenuOptionsTiming(uint);
54 			uint Synchronize(bool,uint);
55 			void UpdateRewinderState(bool=true) const;
56 			void UpdateSettings();
57 			void ResetTimer();
58 
59 			System::Timer timer;
60 			System::Timer::Value clkMul;
61 			uint counter;
62 			uint clkDiv;
63 
64 			struct
65 			{
66 				uchar autoFrameSkip;
67 				uchar maxFrameSkips;
68 				ushort refreshRate;
69 			}   settings;
70 
71 			Object::Heap<Window::FrameClock> dialog;
72 
73 		public:
74 
GameSynchronize(bool throttle)75 			uint GameSynchronize(bool throttle)
76 			{
77 				return (uint(throttle) | settings.autoFrameSkip) ? Synchronize( throttle, ~0U ) : 0;
78 			}
79 
SoundSynchronize()80 			void SoundSynchronize()
81 			{
82 				Synchronize( true, 0 );
83 			}
84 
StartEmulation()85 			void StartEmulation()
86 			{
87 				ResetTimer();
88 			}
89 
StopEmulation()90 			void StopEmulation()
91 			{
92 				ResetTimer();
93 			}
94 
GetRefreshRate() const95 			uint GetRefreshRate() const
96 			{
97 				return settings.refreshRate;
98 			}
99 		};
100 	}
101 }
102 
103 #endif
104