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_BOARD_EVENT_H
26 #define NST_BOARD_EVENT_H
27 
28 #ifdef NST_PRAGMA_ONCE
29 #pragma once
30 #endif
31 
32 #include "../NstDipSwitches.hpp"
33 
34 namespace Nes
35 {
36 	namespace Core
37 	{
38 		namespace Boards
39 		{
40 			class Event : public Mmc1
41 			{
42 			public:
43 
44 				explicit Event(const Context&);
45 
46 			private:
47 
48 				class CartSwitches : public DipSwitches
49 				{
50 				public:
51 
52 					CartSwitches();
53 
54 					inline bool ShowTime() const;
55 					inline dword GetTime() const;
56 
57 				private:
58 
59 					enum
60 					{
61 						DEFAULT_DIP = 4,
62 						BASE_TIME = 0x2000000
63 					};
64 
65 					uint NumDips() const;
66 					uint NumValues(uint) const;
67 					cstring GetDipName(uint) const;
68 					cstring GetValueName(uint,uint) const;
69 					uint GetValue(uint) const;
70 					void SetValue(uint,uint);
71 
72 					uint time;
73 					ibool showTime;
74 				};
75 
76 				void SubReset(bool);
77 				void SubSave(State::Saver&) const;
78 				void SubLoad(State::Loader&,dword);
79 				Device QueryDevice(DeviceType);
80 				void NST_FASTCALL UpdateRegisters(uint);
81 				void Sync(Board::Event,Input::Controllers*);
82 
83 				struct Irq
84 				{
85 					void Reset(bool);
86 					bool Clock();
87 
88 					dword count;
89 				};
90 
91 				enum
92 				{
93 					TIME_TEXT_MIN_OFFSET = 11,
94 					TIME_TEXT_SEC_OFFSET = 13
95 				};
96 
97 				Timer::M2<Irq> irq;
98 				dword time;
99 				CartSwitches cartSwitches;
100 				char text[16];
101 			};
102 		}
103 	}
104 }
105 
106 #endif
107