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_H
26 #define NST_BOARD_H
27 
28 #include "../NstCpu.hpp"
29 #include "../NstPpu.hpp"
30 #include "../NstChips.hpp"
31 #include "../NstState.hpp"
32 
33 #ifdef NST_PRAGMA_ONCE
34 #pragma once
35 #endif
36 
37 namespace Nes
38 {
39 	namespace Core
40 	{
41 		class File;
42 
43 		namespace Input
44 		{
45 			class Controllers;
46 		}
47 
48 		namespace Boards
49 		{
50 			class NST_NO_VTABLE Board
51 			{
52 			public:
53 
54 				class Type
55 				{
56 				public:
57 
58 					enum Nmt
59 					{
60 						NMT_HORIZONTAL,
61 						NMT_VERTICAL,
62 						NMT_FOURSCREEN,
63 						NMT_SINGLESCREEN,
64 						NMT_CONTROLLED
65 					};
66 
67 					enum
68 					{
69 						NMPR = 100
70 					};
71 
72 				private:
73 
74 					enum NmtInit
75 					{
76 						NMT_X,
77 						NMT_H,
78 						NMT_V,
79 						NMT_Z,
80 						NMT_1,
81 						NMT_2,
82 						NMT_4
83 					};
84 
85 					enum Cram
86 					{
87 						CRM_0,
88 						CRM_1,
89 						CRM_2,
90 						CRM_4,
91 						CRM_6,
92 						CRM_8,
93 						CRM_16,
94 						CRM_32
95 					};
96 
97 					template<word MPR,word PROM,word CROM,byte NVWRAM,byte WRAM,Cram CRAM,NmtInit NMT,byte UNIQUE>
98 					struct MakeId
99 					{
100 						NST_COMPILE_ASSERT
101 						(
102 							( PROM >= 8 && PROM <= 4096 && !(PROM & (PROM-1U)) ) &&
103 							( !CROM || (CROM >= 8 && CROM <= 4096 && !(CROM & (CROM-1U))) ) &&
104 							( NVWRAM <= 64 && !(NVWRAM & (NVWRAM-1U)) ) &&
105 							( WRAM <= 64 && !(WRAM & (WRAM-1U)))  &&
106 							( NVWRAM + WRAM <= 64 ) &&
107 							( CROM || CRAM >= CRM_8 ) &&
108 							( UNIQUE < 16 )
109 						);
110 
111 						enum
112 						{
113 							ID =
114 							(
115 								dword( MPR                               ) << 24 |
116 								dword( ValueBits< (PROM   >> 4) >::VALUE ) << 20 |
117 								dword( ValueBits< (CROM   >> 3) >::VALUE ) << 16 |
118 								dword( ValueBits< (NVWRAM >> 0) >::VALUE ) << 13 |
119 								dword( ValueBits< (WRAM   >> 0) >::VALUE ) << 10 |
120 								dword( CRAM                              ) <<  7 |
121 								dword( NMT                               ) <<  4 |
122 								dword( UNIQUE                            ) <<  0
123 							)
124 						};
125 					};
126 
127 				public:
128 
129 					enum Id
130 					{
131 						// NROM
132 						STD_NROM                   = MakeId<    0,   32,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
133 						// AxROM
134 						STD_AMROM                  = MakeId<    7,  128,    0,  0,  0, CRM_8,  NMT_Z,  0 >::ID,
135 						STD_ANROM                  = MakeId<    7,  128,    0,  0,  0, CRM_8,  NMT_Z,  1 >::ID,
136 						STD_AN1ROM                 = MakeId<    7,   64,    0,  0,  0, CRM_8,  NMT_Z,  0 >::ID,
137 						STD_AOROM                  = MakeId<    7,  256,    0,  0,  0, CRM_8,  NMT_Z,  0 >::ID,
138 						// BxROM
139 						STD_BNROM                  = MakeId<   34,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
140 						// CxROM
141 						STD_CNROM                  = MakeId<    3,   32,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
142 						STD_CXROM                  = MakeId<    3,   32,   32,  0,  0, CRM_0,  NMT_X,  1 >::ID,
143 						STD_CPROM                  = MakeId<   13,   32,    0,  0,  0, CRM_16, NMT_X,  0 >::ID,
144 						// DxROM
145 						STD_DEROM                  = MakeId<  206,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
146 						STD_DE1ROM                 = MakeId<  206,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
147 						STD_DRROM                  = MakeId<  206,  128,   64,  0,  0, CRM_0,  NMT_2,  0 >::ID,
148 						// ExROM
149 						STD_ELROM                  = MakeId<    5,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
150 						STD_EKROM                  = MakeId<    5,  512,  512,  8,  0, CRM_0,  NMT_X,  0 >::ID,
151 						STD_ETROM                  = MakeId<    5,  512,  512,  8,  8, CRM_0,  NMT_X,  0 >::ID,
152 						STD_EWROM                  = MakeId<    5,  512,  512, 32,  0, CRM_0,  NMT_X,  0 >::ID,
153 						STD_EXROM_0                = MakeId<    5, 1024, 1024,  0,  0, CRM_0,  NMT_X,  0 >::ID,
154 						STD_EXROM_1                = MakeId<    5, 1024, 1024,  8,  0, CRM_0,  NMT_X,  0 >::ID,
155 						STD_EXROM_2                = MakeId<    5, 1024, 1024,  8,  8, CRM_0,  NMT_X,  0 >::ID,
156 						STD_EXROM_3                = MakeId<    5, 1024, 1024, 32,  0, CRM_0,  NMT_X,  0 >::ID,
157 						STD_EXROM_4                = MakeId<    5, 1024, 1024, 32,  8, CRM_0,  NMT_X,  0 >::ID,
158 						STD_EXROM_5                = MakeId<    5, 1024, 1024, 32, 32, CRM_0,  NMT_X,  0 >::ID,
159 						// FxROM
160 						STD_FJROM                  = MakeId<   10,  128,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
161 						STD_FKROM                  = MakeId<   10,  256,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
162 						// GxROM
163 						STD_GNROM                  = MakeId<   66,  128,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
164 						// MxROM
165 						STD_MHROM                  = MakeId<   66,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
166 						// HxROM
167 						STD_HKROM                  = MakeId<    4,  512,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
168 						// JxROM
169 						STD_JLROM                  = MakeId<   69,  256,  256,  0,  0, CRM_0,  NMT_V,  1 >::ID,
170 						STD_JSROM                  = MakeId<   69,  256,  256,  8,  0, CRM_0,  NMT_V,  1 >::ID,
171 						// NxROM
172 						STD_NTBROM                 = MakeId<   68,  256,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
173 						// PxROM
174 						STD_PNROM                  = MakeId<    9,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
175 						STD_PNROM_PC10             = MakeId<    9,  128,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
176 						STD_PEEOROM                = MakeId<    9,  128,  128,  0,  0, CRM_0,  NMT_V,  1 >::ID,
177 						// SxROM
178 						STD_SAROM                  = MakeId<    1,   64,   64,  8,  0, CRM_0,  NMT_H,  0 >::ID,
179 						STD_SBROM                  = MakeId<    1,   64,   64,  0,  0, CRM_0,  NMT_H,  0 >::ID,
180 						STD_SCROM                  = MakeId<    1,   64,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
181 						STD_SEROM                  = MakeId<    1,   32,   64,  0,  0, CRM_0,  NMT_H,  0 >::ID,
182 						STD_SFROM                  = MakeId<    1,  256,   64,  0,  0, CRM_0,  NMT_H,  0 >::ID,
183 						STD_SGROM                  = MakeId<    1,  256,    0,  0,  0, CRM_8,  NMT_H,  0 >::ID,
184 						STD_SHROM                  = MakeId<    1,   32,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
185 						STD_SJROM                  = MakeId<    1,  256,   64,  8,  0, CRM_0,  NMT_H,  0 >::ID,
186 						STD_SKROM                  = MakeId<    1,  256,  128,  8,  0, CRM_0,  NMT_H,  0 >::ID,
187 						STD_SLROM                  = MakeId<    1,  256,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
188 						STD_SNROM                  = MakeId<    1,  256,    0,  8,  0, CRM_8,  NMT_H,  0 >::ID,
189 						STD_SOROM                  = MakeId<    1,  256,    0,  8,  8, CRM_8,  NMT_H,  0 >::ID,
190 						STD_SUROM                  = MakeId<    1,  512,    0,  8,  0, CRM_8,  NMT_H,  0 >::ID,
191 						STD_SXROM                  = MakeId<    1,  512,    0, 32,  0, CRM_8,  NMT_H,  0 >::ID,
192 						// TxROM
193 						STD_TEROM                  = MakeId<    4,   32,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
194 						STD_TBROM                  = MakeId<    4,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
195 						STD_TFROM                  = MakeId<    4,  512,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
196 						STD_TGROM                  = MakeId<    4,  512,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
197 						STD_TKROM                  = MakeId<    4,  512,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
198 						STD_TKSROM                 = MakeId<  118,  512,  128,  8,  0, CRM_0,  NMT_Z,  0 >::ID,
199 						STD_TLROM                  = MakeId<    4,  512,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
200 						STD_TLSROM                 = MakeId<  118,  512,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
201 						STD_TNROM                  = MakeId<    4,  512,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
202 						STD_TQROM                  = MakeId<  119,  128,   64,  0,  0, CRM_8,  NMT_V,  0 >::ID,
203 						STD_TR1ROM                 = MakeId<    4,  512,   64,  0,  0, CRM_0,  NMT_4,  0 >::ID,
204 						STD_TSROM                  = MakeId<    4,  512,  256,  0,  8, CRM_0,  NMT_X,  0 >::ID,
205 						STD_TVROM                  = MakeId<    4,   64,   64,  0,  0, CRM_0,  NMT_4,  0 >::ID,
206 						// UxROM
207 						STD_UNROM                  = MakeId<    2,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
208 						STD_UN1ROM                 = MakeId<   94,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
209 						STD_UOROM                  = MakeId<    2,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
210 						STD_UXROM                  = MakeId<    2,  256,    0,  0,  0, CRM_8,  NMT_X,  1 >::ID,
211 						STD_UNROM512               = MakeId<   30,  512,    0,  0,  0, CRM_32, NMT_X,  0 >::ID,
212 						// Discrete Logic
213 						DISCRETE_74_377            = MakeId<   11,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
214 						DISCRETE_74_139_74         = MakeId<   87,   32,   32,  0,  0, CRM_0,  NMT_X,  4 >::ID,
215 						DISCRETE_74_161_138        = MakeId<   38,  128,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
216 						DISCRETE_74_161_161_32_A   = MakeId<   70,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
217 						DISCRETE_74_161_161_32_B   = MakeId<  152,  128,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
218 						// Other
219 						CUSTOM_B4                  = MakeId<    4,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
220 						CUSTOM_BTR                 = MakeId<   69,  512,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
221 						CUSTOM_EVENT               = MakeId<  105,  256,    0,  8,  0, CRM_8,  NMT_H,  0 >::ID,
222 						CUSTOM_FFE3                = MakeId<    8,  256,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
223 						CUSTOM_FFE4                = MakeId<    6,  256,  256,  8,  0, CRM_32, NMT_X,  0 >::ID,
224 						CUSTOM_FFE8                = MakeId<   17,  256,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
225 						CUSTOM_FB02                = MakeId<    0,   32,    8,  2,  0, CRM_0,  NMT_X,  0 >::ID,
226 						CUSTOM_FB04                = MakeId<    0,   32,    8,  4,  0, CRM_0,  NMT_X,  0 >::ID,
227 						CUSTOM_RUMBLESTATION       = MakeId<   46, 1024, 1024,  0,  0, CRM_0,  NMT_X,  0 >::ID,
228 						CUSTOM_QJ                  = MakeId<   47,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
229 						CUSTOM_VSSYSTEM_0          = MakeId<   99,   64,   16,  0,  0, CRM_0,  NMT_4,  0 >::ID,
230 						CUSTOM_VSSYSTEM_1          = MakeId<   99,   64,   16,  8,  0, CRM_0,  NMT_4,  0 >::ID,
231 						CUSTOM_WH                  = MakeId<    1,  128,   64,  0,  0, CRM_0,  NMT_H,  0 >::ID,
232 						CUSTOM_X79B                = MakeId<    3,   32,   32,  8,  0, CRM_0,  NMT_X,  0 >::ID,
233 						CUSTOM_ZZ                  = MakeId<   37,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
234 						// Acclaim
235 						ACCLAIM_MCACC              = MakeId<    4,  512,  256,  0,  0, CRM_0,  NMT_X,  1 >::ID,
236 						// Action 53
237 						ACTION53                   = MakeId<   28, 1024,    0,  0,  0, CRM_32, NMT_X,  0 >::ID,
238 						// Active Enterprises
239 						AE_STD                     = MakeId<  228, 2048,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
240 						// AGCI
241 						AGCI_50282                 = MakeId<  144,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
242 						// AVE
243 						AVE_NINA001                = MakeId<   34,   64,   64,  8,  0, CRM_0,  NMT_X,  0 >::ID,
244 						AVE_NINA002                = MakeId<   34,   64,   64,  8,  0, CRM_0,  NMT_X,  1 >::ID,
245 						AVE_NINA03                 = MakeId<   79,   32,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
246 						AVE_NINA06                 = MakeId<   79,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
247 						AVE_NINA07                 = MakeId<   11,  128,  128,  0,  0, CRM_0,  NMT_X,  1 >::ID,
248 						AVE_MB_91                  = MakeId<   79,   64,   64,  0,  0, CRM_0,  NMT_X,  1 >::ID,
249 						AVE_D1012                  = MakeId<  234, 1024, 1024,  0,  0, CRM_0,  NMT_V,  0 >::ID,
250 						// Bandai
251 						BANDAI_FCG1                = MakeId<  153,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
252 						BANDAI_FCG2                = MakeId<  153,  256,  256,  0,  0, CRM_0,  NMT_V,  1 >::ID,
253 						BANDAI_BAJUMP2             = MakeId<  153,  512,    0,  8,  0, CRM_8,  NMT_V,  0 >::ID,
254 						BANDAI_LZ93D50_24C01       = MakeId<  159,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
255 						BANDAI_LZ93D50_24C02       = MakeId<   16,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
256 						BANDAI_DATACH              = MakeId<  157,  256,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
257 						BANDAI_KARAOKESTUDIO       = MakeId<  188,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
258 						BANDAI_AEROBICSSTUDIO      = MakeId<    3,   32,   32,  0,  0, CRM_0,  NMT_X,  2 >::ID,
259 						BANDAI_OEKAKIDS            = MakeId<   96,  128,    0,  0,  0, CRM_32, NMT_1,  0 >::ID,
260 						// Bensheng
261 						BENSHENG_BS5               = MakeId<  286,  128,   64,  0,  0, CRM_0,  NMT_V,  2 >::ID,
262 						// Bootleg multicarts
263 						BMC_110IN1                 = MakeId<  255, 2048, 1024,  0,  0, CRM_0,  NMT_V,  0 >::ID,
264 						BMC_150IN1                 = MakeId<  202,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
265 						BMC_15IN1                  = MakeId<  205,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
266 						BMC_1200IN1                = MakeId<  227,  512,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
267 						BMC_20IN1                  = MakeId<  231,  512,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
268 						BMC_21IN1                  = MakeId<  201,  128,   32,  0,  0, CRM_0,  NMT_V,  0 >::ID,
269 						BMC_22GAMES                = MakeId<  230, 1024,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
270 						BMC_31IN1                  = MakeId<  229,  512,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
271 						BMC_35IN1                  = MakeId<  203,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
272 						BMC_36IN1                  = MakeId<  200,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
273 						BMC_64IN1                  = MakeId<  204,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
274 						BMC_72IN1                  = MakeId<  225, 1024,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
275 						BMC_76IN1                  = MakeId<  226, 2048,    0,  0,  0, CRM_8,  NMT_H,  0 >::ID,
276 						BMC_8157                   = MakeId<  301,  512,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
277 						BMC_9999999IN1             = MakeId<  213,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
278 						BMC_A65AS                  = MakeId<  285,  512,    0,  0,  0, CRM_8,  NMT_V,  1 >::ID,
279 						BMC_BALLGAMES_11IN1        = MakeId<   51,  512,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
280 						BMC_CTC65                  = MakeId<  226, 2048,    0,  0,  0, CRM_8,  NMT_H,  1 >::ID,
281 						BMC_DRAGONBOLLPARTY        = MakeId<   83, 1024, 1024,  8,  0, CRM_0,  NMT_V,  0 >::ID,
282 						BMC_FAMILY_4646B           = MakeId<  134,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
283 						BMC_FKC23C                 = MakeId<  176, 1024, 1024,  0,  0, CRM_0,  NMT_X,  0 >::ID,
284 						BMC_GAME_800IN1            = MakeId<  236,  512,   64,  0,  0, CRM_8,  NMT_V,  0 >::ID,
285 						BMC_GOLDEN_190IN1          = MakeId<  300,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
286 						BMC_GOLDENGAME_150IN1      = MakeId<  235, 2048,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
287 						BMC_GOLDENGAME_260IN1      = MakeId<  235, 4096,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
288 						BMC_GKA                    = MakeId<   57,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
289 						BMC_GKB                    = MakeId<   58,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
290 						BMC_GOLDENCARD_6IN1        = MakeId<  217, 1024, 1024,  0,  0, CRM_0,  NMT_V,  0 >::ID,
291 						BMC_HERO                   = MakeId<   45, 4096, 2048,  8,  0, CRM_0,  NMT_X,  0 >::ID,
292 						BMC_MARIOPARTY_7IN1        = MakeId<   52, 1024, 1024,  8,  0, CRM_0,  NMT_V,  0 >::ID,
293 						BMC_NOVELDIAMOND           = MakeId<   54,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
294 						BMC_CH001                  = MakeId<   63, 4096,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
295 						BMC_POWERJOY_84IN1         = MakeId<  126, 2048, 1024,  0,  0, CRM_0,  NMT_X,  0 >::ID,
296 						BMC_RESETBASED_4IN1        = MakeId<   60,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
297 						BMC_SUPER_24IN1            = MakeId<  176, 4096, 2048,  0,  0, CRM_8,  NMT_X,  0 >::ID,
298 						BMC_SUPER_22GAMES          = MakeId<  233, 1024,    0,  0,  0, CRM_8,  NMT_Z,  0 >::ID,
299 						BMC_SUPER_40IN1            = MakeId<  332,  128,   64,  0,  0, CRM_0,  NMT_V,  1 >::ID,
300 						BMC_SUPER_42IN1            = MakeId<  226, 1024,    0,  0,  0, CRM_8,  NMT_H,  0 >::ID,
301 						BMC_SUPER_700IN1           = MakeId<   62, 2048, 1024,  0,  0, CRM_0,  NMT_V,  0 >::ID,
302 						BMC_SUPERBIG_7IN1          = MakeId<   44, 1024, 1024,  0,  0, CRM_0,  NMT_X,  0 >::ID,
303 						BMC_SUPERGUN_20IN1         = MakeId<  214,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
304 						BMC_SUPERHIK_4IN1          = MakeId<   49,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
305 						BMC_SUPERHIK_300IN1        = MakeId<  212,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
306 						BMC_SUPERVISION_16IN1      = MakeId<   53, 4096,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
307 						BMC_T262                   = MakeId<  265, 1024,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
308 						BMC_VRC4                   = MakeId<   23,  512,    0,  8,  0, CRM_8,  NMT_V,  0 >::ID,
309 						BMC_VT5201                 = MakeId<   60,  128,   64,  0,  0, CRM_0,  NMT_V,  0 >::ID,
310 						BMC_Y2K_64IN1              = MakeId<  314, 1024,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
311 						// Bootlegs
312 						BTL_2708                   = MakeId<  103,  128,    0,  0, 16, CRM_8,  NMT_V,  0 >::ID,
313 						BTL_6035052                = MakeId<  238,  512,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
314 						BTL_AISENSHINICOL          = MakeId<   42,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
315 						BTL_AX5705                 = MakeId<  530,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
316 						BTL_DRAGONNINJA            = MakeId<  222,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
317 						BTL_GENIUSMERIOBROS        = MakeId<   55,   64,    8,  2,  0, CRM_0,  NMT_X,  0 >::ID,
318 						BTL_MARIOBABY              = MakeId<   42,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
319 						BTL_PIKACHUY2K             = MakeId<  254,  512,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
320 						BTL_SHUIGUANPIPE           = MakeId<  183,  256,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
321 						BTL_SMB2_A                 = MakeId<   40,   64,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
322 						BTL_SMB2_B                 = MakeId<   50,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
323 						BTL_SMB2_C                 = MakeId<   43,  128,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
324 						BTL_SMB3                   = MakeId<  106,  256,  128,  8,  0, CRM_0,  NMT_H,  0 >::ID,
325 						BTL_SUPERBROS11            = MakeId<  196,  512,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
326 						BTL_T230                   = MakeId<  529,  256,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
327 						BTL_TOBIDASEDAISAKUSEN     = MakeId<  120,  128,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
328 						// Camerica
329 						CAMERICA_BF9093            = MakeId<   71,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
330 						CAMERICA_BF9096            = MakeId<  232,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
331 						CAMERICA_BF9097            = MakeId<   71,  128,    0,  0,  0, CRM_8,  NMT_Z,  0 >::ID,
332 						CAMERICA_BF909X            = MakeId<   71,  256,    0,  0,  0, CRM_8,  NMT_X,  1 >::ID,
333 						CAMERICA_ALGNV11           = MakeId<   71,  256,    0,  0,  0, CRM_8,  NMT_X,  2 >::ID,
334 						CAMERICA_ALGQV11           = MakeId<  232,  256,    0,  0,  0, CRM_8,  NMT_X,  1 >::ID,
335 						CAMERICA_GOLDENFIVE        = MakeId<  104, 2048,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
336 						// Caltron
337 						CALTRON_6IN1               = MakeId<   41,  256,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
338 						// C&E
339 						CNE_SHLZ                   = MakeId<  240,  512,  128,  8,  0, CRM_0,  NMT_X,  0 >::ID,
340 						CNE_DECATHLON              = MakeId<  244,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
341 						CNE_PSB                    = MakeId<  246,  512,  512,  8,  0, CRM_0,  NMT_X,  0 >::ID,
342 						// Cony
343 						CONY_STD                   = MakeId<   83,  256,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
344 						// Dreamtech
345 						DREAMTECH01                = MakeId<  521,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
346 						// Fujiya
347 						FUJIYA_STD                 = MakeId<  170,   32,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
348 						// Fukutake
349 						FUKUTAKE_SBX               = MakeId<  186,  256,    0,  4,  0, CRM_8,  NMT_X,  0 >::ID,
350 						// Future Media
351 						FUTUREMEDIA_STD            = MakeId<  117,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
352 						// Gouder
353 						GOUDER_37017               = MakeId<  208,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
354 						// Henggedianzi
355 						HENGEDIANZI_STD            = MakeId<  177, 1024,    8,  8,  0, CRM_0,  NMT_V,  0 >::ID,
356 						HENGEDIANZI_XJZB           = MakeId<  179,  512,    8,  8,  0, CRM_0,  NMT_V,  0 >::ID,
357 						// HES
358 						HES_STD                    = MakeId<  113,  256,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
359 						// Hosenkan
360 						HOSENKAN_STD               = MakeId<  182,  512,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
361 						// Infinite NES Lives
362 						INLNSF                     = MakeId<   31, 1024,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
363 						// Irem
364 						IREM_G101A_0               = MakeId<   32,  256,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
365 						IREM_G101A_1               = MakeId<   32,  256,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
366 						IREM_G101B_0               = MakeId<   32,  256,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
367 						IREM_G101B_1               = MakeId<   32,  256,  128,  8,  0, CRM_0,  NMT_Z,  0 >::ID,
368 						IREM_H3001                 = MakeId<   65,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
369 						IREM_LROG017               = MakeId<   77,  128,   32,  0,  0, CRM_6,  NMT_2,  0 >::ID,
370 						IREM_HOLYDIVER             = MakeId<   78,  128,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
371 						IREM_KAIKETSU              = MakeId<   97,  256,    0,  0,  0, CRM_8,  NMT_H,  0 >::ID,
372 						// Jaleco
373 						JALECO_JF01                = MakeId<    0,   16,    8,  0,  0, CRM_0,  NMT_X,  1 >::ID,
374 						JALECO_JF02                = MakeId<    0,   16,    8,  0,  0, CRM_0,  NMT_X,  2 >::ID,
375 						JALECO_JF03                = MakeId<    0,   16,    8,  0,  0, CRM_0,  NMT_X,  3 >::ID,
376 						JALECO_JF04                = MakeId<    0,   16,    8,  0,  0, CRM_0,  NMT_X,  4 >::ID,
377 						JALECO_JF05                = MakeId<   87,   16,   16,  0,  0, CRM_0,  NMT_X,  0 >::ID,
378 						JALECO_JF06                = MakeId<   87,   16,   16,  0,  0, CRM_0,  NMT_X,  1 >::ID,
379 						JALECO_JF07                = MakeId<   87,   32,   16,  0,  0, CRM_0,  NMT_X,  0 >::ID,
380 						JALECO_JF08                = MakeId<   87,   32,   32,  0,  0, CRM_0,  NMT_X,  1 >::ID,
381 						JALECO_JF09                = MakeId<   87,   32,   32,  0,  0, CRM_0,  NMT_X,  2 >::ID,
382 						JALECO_JF10                = MakeId<   87,   32,   32,  0,  0, CRM_0,  NMT_X,  3 >::ID,
383 						JALECO_JF11                = MakeId<  140,  128,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
384 						JALECO_JF12                = MakeId<  140,  128,   32,  0,  0, CRM_0,  NMT_X,  1 >::ID,
385 						JALECO_JF13                = MakeId<   86,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
386 						JALECO_JF14                = MakeId<  140,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
387 						JALECO_JF15                = MakeId<    2,  256,    0,  0,  0, CRM_8,  NMT_X,  2 >::ID,
388 						JALECO_JF16                = MakeId<   78,  128,  128,  0,  0, CRM_0,  NMT_Z,  1 >::ID,
389 						JALECO_JF17                = MakeId<   72,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
390 						JALECO_JF18                = MakeId<    2,  256,    0,  0,  0, CRM_8,  NMT_X,  3 >::ID,
391 						JALECO_JF19                = MakeId<   92,  256,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
392 						JALECO_JF20                = MakeId<   75,  128,  128,  0,  0, CRM_0,  NMT_V,  1 >::ID,
393 						JALECO_JF21                = MakeId<   92,  256,  128,  0,  0, CRM_0,  NMT_X,  1 >::ID,
394 						JALECO_JF22                = MakeId<   75,  128,  128,  0,  0, CRM_0,  NMT_V,  2 >::ID,
395 						JALECO_JF23                = MakeId<   18,  256,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
396 						JALECO_JF24                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
397 						JALECO_JF25                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  1 >::ID,
398 						JALECO_JF26                = MakeId<   72,  128,  128,  0,  0, CRM_0,  NMT_X,  1 >::ID,
399 						JALECO_JF27                = MakeId<   18,  128,  128,  8,  0, CRM_0,  NMT_H,  0 >::ID,
400 						JALECO_JF28                = MakeId<   72,  128,  128,  0,  0, CRM_0,  NMT_X,  2 >::ID,
401 						JALECO_JF29                = MakeId<   18,  256,  128,  0,  0, CRM_0,  NMT_H,  1 >::ID,
402 						JALECO_JF30                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  2 >::ID,
403 						JALECO_JF31                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  3 >::ID,
404 						JALECO_JF32                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  4 >::ID,
405 						JALECO_JF33                = MakeId<   18,  256,  128,  0,  0, CRM_0,  NMT_H,  2 >::ID,
406 						JALECO_JF34                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  5 >::ID,
407 						JALECO_JF35                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  6 >::ID,
408 						JALECO_JF36                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  7 >::ID,
409 						JALECO_JF37                = MakeId<   18,  128,  256,  0,  0, CRM_0,  NMT_H,  0 >::ID,
410 						JALECO_JF38                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  8 >::ID,
411 						JALECO_JF39                = MakeId<    2,  128,    0,  0,  0, CRM_8,  NMT_X,  1 >::ID,
412 						JALECO_JF40                = MakeId<   18,  128,  128,  0,  0, CRM_0,  NMT_H,  9 >::ID,
413 						JALECO_JF41                = MakeId<   18,  256,  128,  8,  0, CRM_0,  NMT_H,  3 >::ID,
414 						JALECO_SS88006             = MakeId<   18,  256,  256,  8,  0, CRM_0,  NMT_H,  4 >::ID,
415 						// J.Y.Company
416 						JYCOMPANY_TYPE_A           = MakeId<   90, 2048, 2048,  0,  0, CRM_0,  NMT_X,  0 >::ID,
417 						JYCOMPANY_TYPE_B           = MakeId<  209, 2048, 2048,  0,  0, CRM_0,  NMT_X,  0 >::ID,
418 						JYCOMPANY_TYPE_C           = MakeId<  211, 2048, 2048,  0,  0, CRM_0,  NMT_X,  0 >::ID,
419 						// Kaiser
420 						KAISER_KS202               = MakeId<   56,  256,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
421 						KAISER_KS7010              = MakeId<  554,  128,  128,  0,  0, CRM_0,  NMT_V,  1 >::ID,
422 						KAISER_KS7013B             = MakeId<  312,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
423 						KAISER_KS7016              = MakeId<  306,  128,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
424 						KAISER_KS7022              = MakeId<  175,  256,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
425 						KAISER_KS7031              = MakeId<  305,  128,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
426 						KAISER_KS7032              = MakeId<  142,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
427 						KAISER_KS7037              = MakeId<  307,  128,    0,  0,  8, CRM_8,  NMT_X,  0 >::ID,
428 						KAISER_KS7057              = MakeId<  302,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
429 						KAISER_KS7058              = MakeId<  171,   32,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
430 						// Kasing
431 						KASING_STD                 = MakeId<  115,  512,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
432 						// K
433 						KAY_H2288                  = MakeId<  123,  512,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
434 						KAY_PANDAPRINCE            = MakeId<  121,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
435 						// Konami
436 						KONAMI_VRC1                = MakeId<   75,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
437 						KONAMI_VRC2                = MakeId<   22,  128,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
438 						KONAMI_VRC3                = MakeId<   73,  128,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
439 						KONAMI_VRC4_0              = MakeId<   21,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
440 						KONAMI_VRC4_1              = MakeId<   21,  256,  256,  2,  0, CRM_0,  NMT_V,  0 >::ID,
441 						KONAMI_VRC4_2              = MakeId<   21,  256,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
442 						KONAMI_VRC6_0              = MakeId<   24,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
443 						KONAMI_VRC6_1              = MakeId<   24,  256,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
444 						KONAMI_VRC7_0              = MakeId<   85,  512,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
445 						KONAMI_VRC7_1              = MakeId<   85,  512,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
446 						KONAMI_VSSYSTEM            = MakeId<  151,   64,   64,  0,  0, CRM_0,  NMT_4,  0 >::ID,
447 						//Magic Kid Googoo
448 						MAGICKIDGOOGOO             = MakeId<  190,  256,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
449 						// Magic Series
450 						MAGICSERIES_MAGICDRAGON    = MakeId<  107,  128,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
451 						// Namcot
452 						NAMCOT_3433                = MakeId<   88,  128,  128,  0,  0, CRM_0,  NMT_H,  0 >::ID,
453 						NAMCOT_3443                = MakeId<   88,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
454 						NAMCOT_3446                = MakeId<   76,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
455 						NAMCOT_3425                = MakeId<   95,  128,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
456 						NAMCOT_34XX                = MakeId<  154,  128,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
457 						NAMCOT_163_0               = MakeId<   19,  512,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
458 						NAMCOT_163_1               = MakeId<   19,  512,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
459 						NAMCOT_163_S_0             = MakeId<   19,  512,  256,  0,  0, CRM_0,  NMT_X,  1 >::ID,
460 						NAMCOT_163_S_1             = MakeId<   19,  512,  256,  8,  0, CRM_0,  NMT_X,  1 >::ID,
461 						NAMCOT_175                 = MakeId<  210,  512,  128,  8,  0, CRM_0,  NMT_V,  0 >::ID,
462 						NAMCOT_340                 = MakeId<  210,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
463 						// Nitra
464 						NITRA_TDA                  = MakeId<  250,  512,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
465 						// NTDEC
466 						NTDEC_N715062              = MakeId<    3,   32,   32,  0,  0, CRM_0,  NMT_X,  3 >::ID,
467 						NTDEC_ASDER_0              = MakeId<  112,  256,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
468 						NTDEC_ASDER_1              = MakeId<  112,  256,  512,  8,  0, CRM_0,  NMT_X,  0 >::ID,
469 						NTDEC_FIGHTINGHERO         = MakeId<  193,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
470 						// Nanjing
471 						NANJING_STD                = MakeId<  163, 2048,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
472 						// Nihon Bussan
473 						NIHON_UNROM_M5             = MakeId<  180,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
474 						// Open Corp
475 						OPENCORP_DAOU306           = MakeId<  156,  256,  512,  8,  0, CRM_0,  NMT_1,  0 >::ID,
476 						// RCM
477 						RCM_GS2004                 = MakeId<  283,  256,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
478 						RCM_GS2013                 = MakeId<  283,  512,    0,  0,  0, CRM_8,  NMT_X,  1 >::ID,
479 						RCM_GS2015                 = MakeId<  216,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
480 						RCM_TETRISFAMILY           = MakeId<   61,  512,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
481 						// Rex Soft
482 						REXSOFT_DBZ5               = MakeId<   12,  256,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
483 						REXSOFT_SL1632             = MakeId<   14,  256,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
484 						// Sachen
485 						SACHEN_8259A               = MakeId<  141,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
486 						SACHEN_8259B               = MakeId<  138,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
487 						SACHEN_8259C               = MakeId<  139,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
488 						SACHEN_8259D               = MakeId<  137,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
489 						SACHEN_TCA01               = MakeId<  143,   32,    8,  0,  0, CRM_0,  NMT_X,  0 >::ID,
490 						SACHEN_TCU01               = MakeId<  147,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
491 						SACHEN_TCU02               = MakeId<  136,   32,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
492 						SACHEN_SA0036              = MakeId<  149,   32,   16,  0,  0, CRM_0,  NMT_X,  0 >::ID,
493 						SACHEN_SA0037              = MakeId<  148,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
494 						SACHEN_SA0161M             = MakeId<  146,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
495 						SACHEN_SA72007             = MakeId<  145,   16,   16,  0,  0, CRM_0,  NMT_X,  0 >::ID,
496 						SACHEN_SA72008             = MakeId<  133,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
497 						SACHEN_74_374A             = MakeId<  243,   64,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
498 						SACHEN_74_374B             = MakeId<  150,   64,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
499 						// Someri Team
500 						SOMERITEAM_SL12            = MakeId<  116,  256,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
501 						// Subor
502 						SUBOR_TYPE0                = MakeId<  167, 1024,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
503 						SUBOR_TYPE1                = MakeId<  166, 1024,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
504 						SUBOR_STUDYNGAME           = MakeId<   39, 1024,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
505 						// Sunsoft
506 						SUNSOFT_1                  = MakeId<  184,   32,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
507 						SUNSOFT_2A                 = MakeId<   93,  128,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
508 						SUNSOFT_2B                 = MakeId<   89,  128,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
509 						SUNSOFT_3                  = MakeId<   67,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
510 						SUNSOFT_4_0                = MakeId<   68,  128,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
511 						SUNSOFT_4_1                = MakeId<   68,  128,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
512 						SUNSOFT_5B_0               = MakeId<   69,  256,  256,  0,  0, CRM_0,  NMT_V,  2 >::ID,
513 						SUNSOFT_5B_1               = MakeId<   69,  256,  256,  8,  0, CRM_0,  NMT_V,  2 >::ID,
514 						SUNSOFT_DCS                = MakeId<   68,  256,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
515 						SUNSOFT_FME7_0             = MakeId<   69,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
516 						SUNSOFT_FME7_1             = MakeId<   69,  256,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
517 						// Super Game
518 						SUPERGAME_LIONKING         = MakeId<  114,  256,  512,  0,  0, CRM_0,  NMT_V,  0 >::ID,
519 						SUPERGAME_BOOGERMAN        = MakeId<  215,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
520 						SUPERGAME_MK3E             = MakeId<  215,  256,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
521 						SUPERGAME_POCAHONTAS2      = MakeId< NMPR,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
522 						// Taito
523 						TAITO_TC0190FMC            = MakeId<   33,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
524 						TAITO_TC0190FMC_PAL16R4    = MakeId<   48,  256,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
525 						TAITO_X1005                = MakeId<   80,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
526 						TAITO_X1017                = MakeId<   82,  256,  256,  0,  0, CRM_0,  NMT_H,  0 >::ID,
527 						// Tengen
528 						TENGEN_800002              = MakeId<  206,   64,   64,  0,  0, CRM_0,  NMT_X,  1 >::ID,
529 						TENGEN_800004              = MakeId<  206,  128,   64,  0,  0, CRM_0,  NMT_2,  1 >::ID,
530 						TENGEN_800008              = MakeId<    3,   64,   64,  0,  0, CRM_0,  NMT_X,  0 >::ID,
531 						TENGEN_800030              = MakeId<  206,  128,   64,  0,  0, CRM_0,  NMT_X,  1 >::ID,
532 						TENGEN_800032              = MakeId<   64,  128,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
533 						TENGEN_800037              = MakeId<  158,  128,  128,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
534 						TENGEN_800042              = MakeId<   68,  128,  256,  0,  0, CRM_0,  NMT_V,  1 >::ID,
535 						// TXC
536 						TXC_22211A                 = MakeId<  132,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
537 						TXC_22211B                 = MakeId<  172,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
538 						TXC_22211C                 = MakeId<  173,   64,   32,  0,  0, CRM_0,  NMT_X,  0 >::ID,
539 						TXC_MXMDHTWO               = MakeId<  241, 1024,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
540 						TXC_POLICEMAN              = MakeId<   36,  512,  128,  0,  0, CRM_0,  NMT_X,  0 >::ID,
541 						TXC_TW                     = MakeId<  189,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
542 						// Unlicensed
543 						UNL_A9746                  = MakeId<  219,  128,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
544 						UNL_CC21                   = MakeId<   27,   32,    8,  0,  0, CRM_0,  NMT_Z,  0 >::ID,
545 						UNL_EDU2000                = MakeId<  329, 1024,    0,  0, 32, CRM_8,  NMT_Z,  0 >::ID,
546 						UNL_FS304                  = MakeId<  162, 2048,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
547 						UNL_KINGOFFIGHTERS96       = MakeId<  187,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
548 						UNL_KINGOFFIGHTERS97       = MakeId<  263,  256,  256,  0,  0, CRM_0,  NMT_X,  0 >::ID,
549 						UNL_MORTALKOMBAT2          = MakeId<   91,  256,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
550 						UNL_N625092                = MakeId<  221, 1024,    8,  0,  0, CRM_0,  NMT_V,  0 >::ID,
551 						UNL_SUPERFIGHTER3          = MakeId<  197,  512,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
552 						UNL_SHERO                  = MakeId<  262,  512,  512,  0,  0, CRM_8,  NMT_4,  0 >::ID,
553 						UNL_TF1201                 = MakeId<  298,  128,  128,  0,  0, CRM_0,  NMT_V,  0 >::ID,
554 						UNL_WORLDHERO              = MakeId<   27,  128,  512,  0,  0, CRM_0,  NMT_X,  0 >::ID,
555 						UNL_AXROM                  = MakeId<    7,  512,    8,  8,  0, CRM_0,  NMT_Z,  0 >::ID,
556 						UNL_BXROM                  = MakeId<   34, 4096,    8,  8,  0, CRM_8,  NMT_X,  0 >::ID,
557 						UNL_CXROM                  = MakeId<    3,   32, 2048,  8,  0, CRM_0,  NMT_X,  0 >::ID,
558 						UNL_GXROM                  = MakeId<   66,  512,  128,  8,  0, CRM_0,  NMT_X,  0 >::ID,
559 						UNL_NROM                   = MakeId<    0,   32,    8,  8,  0, CRM_8,  NMT_X,  0 >::ID,
560 						UNL_UXROM                  = MakeId<    2, 4096,    8,  8,  0, CRM_0,  NMT_X,  0 >::ID,
561 						UNL_UXROM_M5               = MakeId<  180, 4096,    8,  8,  0, CRM_0,  NMT_X,  0 >::ID,
562 						UNL_TRXROM                 = MakeId<    4,  512,  256,  8,  0, CRM_0,  NMT_4,  0 >::ID,
563 						UNL_XZY                    = MakeId<  176, 1024,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
564 						UNL_MMC3BIGCHRRAM          = MakeId<    4,  512,    0,  0,  0, CRM_32, NMT_X,  0 >::ID,
565 						// Waixing
566 						WAIXING_PS2_0              = MakeId<   15, 1024,    0,  0,  0, CRM_8,  NMT_V,  0 >::ID,
567 						WAIXING_PS2_1              = MakeId<   15, 1024,    0,  8,  0, CRM_8,  NMT_V,  0 >::ID,
568 						WAIXING_TYPE_A             = MakeId<   74, 1024,  256,  8,  1, CRM_2,  NMT_X,  0 >::ID,
569 						WAIXING_TYPE_B             = MakeId<  191,  512,  256,  8,  1, CRM_2,  NMT_X,  0 >::ID,
570 						WAIXING_TYPE_C             = MakeId<  192,  512,  256,  8,  1, CRM_4,  NMT_X,  0 >::ID,
571 						WAIXING_TYPE_D             = MakeId<  194,  512,  256,  8,  1, CRM_2,  NMT_X,  0 >::ID,
572 						WAIXING_TYPE_E             = MakeId<  195,  512,  256,  8,  1, CRM_4,  NMT_X,  0 >::ID,
573 						WAIXING_TYPE_F             = MakeId<  198, 1024,    0,  8,  1, CRM_8,  NMT_X,  0 >::ID,
574 						WAIXING_TYPE_G             = MakeId<  199,  512,  256,  8,  1, CRM_8,  NMT_X,  0 >::ID,
575 						WAIXING_TYPE_H             = MakeId<  245, 1024,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
576 						WAIXING_TYPE_I             = MakeId<  223,  512,  256,  8,  1, CRM_0,  NMT_X,  0 >::ID,
577 						WAIXING_TYPE_J             = MakeId<  224, 1024,  256,  8,  1, CRM_0,  NMT_X,  0 >::ID,
578 						WAIXING_FFV_0              = MakeId<  164, 1024,   32,  0,  0, CRM_8,  NMT_X,  0 >::ID,
579 						WAIXING_FFV_1              = MakeId<  164, 1024,   32,  8,  0, CRM_8,  NMT_X,  0 >::ID,
580 						WAIXING_SH2_0              = MakeId<  165,  512,  256,  0,  0, CRM_4,  NMT_X,  0 >::ID,
581 						WAIXING_SH2_1              = MakeId<  165,  512,  256,  8,  0, CRM_4,  NMT_X,  0 >::ID,
582 						WAIXING_SGZLZ              = MakeId<  178, 1024,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
583 						WAIXING_ZS                 = MakeId<  242,  512,    0,  8,  0, CRM_8,  NMT_V,  0 >::ID,
584 						WAIXING_DQVII              = MakeId<  242,  512,    0,  8,  0, CRM_8,  NMT_X,  0 >::ID,
585 						WAIXING_SGZ                = MakeId<  252,  512,  256,  8,  0, CRM_0,  NMT_X,  0 >::ID,
586 						WAIXING_SECURITY_0         = MakeId<  249,  512,  256,  0,  0, CRM_0,  NMT_V,  0 >::ID,
587 						WAIXING_SECURITY_1         = MakeId<  249,  512,  256,  8,  0, CRM_0,  NMT_V,  0 >::ID,
588 						// Whirlwind
589 						WHIRLWIND_2706             = MakeId<  108,  128,    0,  0,  0, CRM_8,  NMT_X,  0 >::ID,
590 						// Unknown
591 						UNKNOWN                    = 0
592 					};
593 
594 					Type();
595 					Type(Id,Ram&,Ram&,Nmt,bool,bool);
596 
597 					uint  GetMapper() const;
598 					dword GetMaxPrg() const;
599 					dword GetMaxChr() const;
600 					uint  GetWram() const;
601 					uint  GetSavableWram() const;
602 					uint  GetNonSavableWram() const;
603 					uint  GetChrRam() const;
604 					uint  GetNmtRam() const;
605 					uint  GetVram() const;
606 					uint  GetSavableVram() const;
607 					uint  GetNonSavableVram() const;
608 					Nmt   GetStartupNmt() const;
609 
610 				private:
611 
612 					Id id;
613 					byte nmt;
614 					byte chrRam;
615 					bool battery;
616 					bool wramAuto;
617 
618 				public:
619 
GetId() const620 					Id GetId() const
621 					{
622 						return id;
623 					}
624 
operator ==(Id i) const625 					bool operator == (Id i) const
626 					{
627 						return id == i;
628 					}
629 
operator !=(Id i) const630 					bool operator != (Id i) const
631 					{
632 						return id != i;
633 					}
634 
GetNmt() const635 					Nmt GetNmt() const
636 					{
637 						return static_cast<Nmt>(nmt);
638 					}
639 
HasBattery() const640 					bool HasBattery() const
641 					{
642 						return battery;
643 					}
644 
IsAutoWram() const645 					bool IsAutoWram() const
646 					{
647 						return wramAuto;
648 					}
649 				};
650 
651 				class Context
652 				{
653 					struct Element;
654 
655 				public:
656 
657 					Context(Cpu*,Apu*,Ppu*,Ram&,Ram&,const Ram&,Type::Nmt,bool,bool,Chips&);
658 
659 					bool DetectBoard(wcstring,dword);
660 					bool DetectBoard(word,byte,dword,dword,bool);
661 
662 					cstring name;
663 					Type type;
664 					Cpu* const cpu;
665 					Apu* const apu;
666 					Ppu* const ppu;
667 					Ram& prg;
668 					Ram& chr;
669 					const Ram& trainer;
670 					const Type::Nmt nmt;
671 					Chips& chips;
672 					const bool wramBattery;
673 					const bool mmcBattery;
674 				};
675 
676 				static Board* Create(const Context&);
677 				static void Destroy(Board*);
678 
679 				void Reset(bool);
680 
681 				virtual void Load(File&);
682 				virtual void Save(File&) const;
683 
684 				void SaveState(State::Saver&,dword) const;
685 				void LoadState(State::Loader&);
686 
687 				enum Event
688 				{
689 					EVENT_END_FRAME,
690 					EVENT_BEGIN_FRAME,
691 					EVENT_POWER_OFF
692 				};
693 
Sync(Event,Input::Controllers *)694 				virtual void Sync(Event,Input::Controllers*) {};
695 
696 				typedef void* Device;
697 
698 				enum DeviceType
699 				{
700 					DEVICE_DIP_SWITCHES = 1,
701 					DEVICE_BARCODE_READER
702 				};
703 
QueryDevice(DeviceType)704 				virtual Device QueryDevice(DeviceType)
705 				{
706 					return NULL;
707 				}
708 
709 			protected:
710 
711 				explicit Board(const Context&);
~Board()712 				virtual ~Board() {}
713 
714 				typedef Memory<SIZE_32K,SIZE_8K,2> Prg;
715 				typedef Memory<SIZE_8K,SIZE_8K,2> Wrk;
716 				typedef Ppu::ChrMem Chr;
717 				typedef Ppu::NmtMem Nmt;
718 				typedef Ram Vram;
719 
720 				Prg prg;
721 				Cpu& cpu;
722 				Ppu& ppu;
723 				Chr& chr;
724 				Nmt& nmt;
725 				Wrk wrk;
726 				const Vram vram;
727 				const Type board;
728 
729 			private:
730 
731 				virtual void SubReset(bool) = 0;
SubSave(State::Saver &) const732 				virtual void SubSave(State::Saver&) const {}
SubLoad(State::Loader &,dword)733 				virtual void SubLoad(State::Loader&,dword) {}
734 
735 				NES_DECL_PEEK( Prg_8 );
736 				NES_DECL_PEEK( Prg_A );
737 				NES_DECL_PEEK( Prg_C );
738 				NES_DECL_PEEK( Prg_E );
739 
740 				NES_DECL_POKE( Prg_8k_0     );
741 				NES_DECL_POKE( Prg_8k_0_bc  );
742 				NES_DECL_POKE( Prg_8k_1     );
743 				NES_DECL_POKE( Prg_8k_2     );
744 				NES_DECL_POKE( Prg_8k_3     );
745 				NES_DECL_POKE( Prg_16k_0    );
746 				NES_DECL_POKE( Prg_16k_0_bc );
747 				NES_DECL_POKE( Prg_16k_1    );
748 				NES_DECL_POKE( Prg_32k      );
749 				NES_DECL_POKE( Prg_32k_bc   );
750 
751 				NES_DECL_POKE( Chr_1k_0    );
752 				NES_DECL_POKE( Chr_1k_1    );
753 				NES_DECL_POKE( Chr_1k_2    );
754 				NES_DECL_POKE( Chr_1k_3    );
755 				NES_DECL_POKE( Chr_1k_4    );
756 				NES_DECL_POKE( Chr_1k_5    );
757 				NES_DECL_POKE( Chr_1k_6    );
758 				NES_DECL_POKE( Chr_1k_7    );
759 				NES_DECL_POKE( Chr_2k_0    );
760 				NES_DECL_POKE( Chr_2k_1    );
761 				NES_DECL_POKE( Chr_2k_2    );
762 				NES_DECL_POKE( Chr_2k_3    );
763 				NES_DECL_POKE( Chr_4k_0    );
764 				NES_DECL_POKE( Chr_4k_1    );
765 				NES_DECL_POKE( Chr_4k_1_bc );
766 				NES_DECL_POKE( Chr_8k      );
767 				NES_DECL_POKE( Chr_8k_bc   );
768 
769 				NES_DECL_PEEK( Wram_6 );
770 				NES_DECL_POKE( Wram_6 );
771 
772 				NES_DECL_POKE( Nmt_Hv );
773 				NES_DECL_POKE( Nmt_Vh );
774 				NES_DECL_POKE( Nmt_Vh01 );
775 				NES_DECL_POKE( Nmt_Hv01 );
776 
777 				NES_DECL_PEEK( Nop );
778 				NES_DECL_POKE( Nop );
779 
780 			protected:
781 
782 				enum PrgSwap8k0    { PRG_SWAP_8K_0      };
783 				enum PrgSwap8k0Bc  { PRG_SWAP_8K_0_BC   };
784 				enum PrgSwap8k1    { PRG_SWAP_8K_1      };
785 				enum PrgSwap8k2    { PRG_SWAP_8K_2      };
786 				enum PrgSwap8k3    { PRG_SWAP_8K_3      };
787 				enum PrgSwap16k0   { PRG_SWAP_16K_0     };
788 				enum PrgSwap16k0Bc { PRG_SWAP_16K_0_BC  };
789 				enum PrgSwap16k1   { PRG_SWAP_16K_1     };
790 				enum PrgSwap32k    { PRG_SWAP_32K       };
791 				enum PrgSwap32kBc  { PRG_SWAP_32K_BC    };
792 				enum ChrSwap1k0    { CHR_SWAP_1K_0      };
793 				enum ChrSwap1k1    { CHR_SWAP_1K_1      };
794 				enum ChrSwap1k2    { CHR_SWAP_1K_2      };
795 				enum ChrSwap1k3    { CHR_SWAP_1K_3      };
796 				enum ChrSwap1k4    { CHR_SWAP_1K_4      };
797 				enum ChrSwap1k5    { CHR_SWAP_1K_5      };
798 				enum ChrSwap1k6    { CHR_SWAP_1K_6      };
799 				enum ChrSwap1k7    { CHR_SWAP_1K_7      };
800 				enum ChrSwap2k0    { CHR_SWAP_2K_0      };
801 				enum ChrSwap2k1    { CHR_SWAP_2K_1      };
802 				enum ChrSwap2k2    { CHR_SWAP_2K_2      };
803 				enum ChrSwap2k3    { CHR_SWAP_2K_3      };
804 				enum ChrSwap4k0    { CHR_SWAP_4K_0      };
805 				enum ChrSwap4k1    { CHR_SWAP_4K_1      };
806 				enum ChrSwap4k1Bc  { CHR_SWAP_4K_1_BC   };
807 				enum ChrSwap8k     { CHR_SWAP_8K        };
808 				enum ChrSwap8kBc   { CHR_SWAP_8K_BC     };
809 				enum NmtSwapHv     { NMT_SWAP_HV        };
810 				enum NmtSwapVh     { NMT_SWAP_VH        };
811 				enum NmtSwapVh01   { NMT_SWAP_VH01      };
812 				enum NmtSwapHv01   { NMT_SWAP_HV01      };
813 				enum NopPeek       { NOP_PEEK           };
814 				enum NopPoke       { NOP_POKE           };
815 				enum NopPeekPoke   { NOP_PEEK_POKE      };
816 
817 				uint GetBusData(uint,uint=0xFF) const;
818 
SetMirroringHV(uint data)819 				void SetMirroringHV(uint data) { NES_DO_POKE(Nmt_Hv,0,data); }
SetMirroringVH(uint data)820 				void SetMirroringVH(uint data) { NES_DO_POKE(Nmt_Vh,0,data); }
821 
SetMirroringVH01(uint data)822 				void SetMirroringVH01(uint data) { NES_DO_POKE(Nmt_Vh01,0,data); }
SetMirroringHV01(uint data)823 				void SetMirroringHV01(uint data) { NES_DO_POKE(Nmt_Hv01,0,data); }
824 
825 				void Map( uint,uint,PrgSwap8k0  ) const;
826 				void Map( uint,uint,PrgSwap8k1  ) const;
827 				void Map( uint,uint,PrgSwap8k2  ) const;
828 				void Map( uint,uint,PrgSwap8k3  ) const;
829 				void Map( uint,uint,PrgSwap16k0 ) const;
830 				void Map( uint,uint,PrgSwap16k1 ) const;
831 				void Map( uint,uint,PrgSwap32k  ) const;
832 				void Map( uint,uint,ChrSwap1k0  ) const;
833 				void Map( uint,uint,ChrSwap1k1  ) const;
834 				void Map( uint,uint,ChrSwap1k2  ) const;
835 				void Map( uint,uint,ChrSwap1k3  ) const;
836 				void Map( uint,uint,ChrSwap1k4  ) const;
837 				void Map( uint,uint,ChrSwap1k5  ) const;
838 				void Map( uint,uint,ChrSwap1k6  ) const;
839 				void Map( uint,uint,ChrSwap1k7  ) const;
840 				void Map( uint,uint,ChrSwap2k0  ) const;
841 				void Map( uint,uint,ChrSwap2k1  ) const;
842 				void Map( uint,uint,ChrSwap2k2  ) const;
843 				void Map( uint,uint,ChrSwap2k3  ) const;
844 				void Map( uint,uint,ChrSwap4k0  ) const;
845 				void Map( uint,uint,ChrSwap4k1  ) const;
846 				void Map( uint,uint,ChrSwap8k   ) const;
847 				void Map( uint,uint,NmtSwapHv   ) const;
848 				void Map( uint,uint,NmtSwapVh   ) const;
849 				void Map( uint,uint,NmtSwapVh01 ) const;
850 				void Map( uint,uint,NmtSwapHv01 ) const;
851 				void Map( uint,uint,NopPeek     ) const;
852 				void Map( uint,uint,NopPoke     ) const;
853 				void Map( uint,uint,NopPeekPoke ) const;
854 
855 				void Map( PrgSwap8k0Bc  ) const;
856 				void Map( PrgSwap16k0Bc ) const;
857 				void Map( PrgSwap32kBc  ) const;
858 				void Map( ChrSwap4k1Bc  ) const;
859 				void Map( ChrSwap8kBc   ) const;
860 
861 				template<typename T>
Map(uint first,uint last,T t) const862 				void Map(uint first,uint last,T t) const
863 				{
864 					cpu.Map( first, last ).Set( t );
865 				}
866 
867 				template<typename T,typename U>
Map(uint first,uint last,T t,U u) const868 				void Map(uint first,uint last,T t,U u) const
869 				{
870 					cpu.Map( first, last ).Set( t, u );
871 				}
872 
873 				template<typename T>
Map(uint address,T t) const874 				void Map(uint address,T t) const
875 				{
876 					Map( address, address, t );
877 				}
878 
879 				template<typename T,typename U>
Map(uint address,T t,U u) const880 				void Map(uint address,T t,U u) const
881 				{
882 					cpu.Map( address ).Set( t, u );
883 				}
884 			};
885 		}
886 	}
887 }
888 
889 #endif
890