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