├── .editorconfig ├── .gitattributes ├── .gitignore ├── .gitmodules ├── README.md ├── countries.json ├── dats.json ├── download.js ├── index.js ├── package-lock.json ├── package.json └── static ├── English Translation ROMs ├── Nintendo - Super Famicom [T-En] Collection (11-06-2024).dat └── README.md └── Headered ├── Nintendo - Family Computer Disk System [Headered] (20180610-093800).dat └── Nintendo - Nintendo Entertainment System [Headered] (20180623-100311).xml /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 4 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Declare files that will always have LF line endings on checkout. 2 | *.dat text eol=lf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | input* 2 | node_modules 3 | temp 4 | *.zip 5 | ._* 6 | !input/no-intro/.gitkeep 7 | !input/tosec/.gitkeep 8 | !input/redump/.gitkeep 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "database"] 2 | path = database 3 | url = https://github.com/libretro/libretro-database.git 4 | ignore = dirty 5 | branch = master 6 | shallow = true 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # libretro-dats 2 | 3 | Builds a set of DATs for [libretro-database](http://github.com/libretro/libretro-database). 4 | 5 | ## Features 6 | 7 | Builds the following sources... 8 | 9 | - Redump 10 | - No-Intro 11 | - TOSEC 12 | 13 | ## Dependencies 14 | 15 | - Node.js 16 | 17 | ## Usage 18 | 19 | 1. Download the source dat files from... 20 | 1. Download https://datomatic.no-intro.org/?page=download&op=daily , toggling "Pirate, Homebrew, Aftermarket" 21 | 2. Download https://www.tosecdev.org/downloads 22 | 23 | 1. Extract them and set up the .dat files to match... 24 | ``` 25 | input/no-intro/Nintendo - Nintendo Entertainment System*.dat 26 | input/tosec/TOSEC/Sony PlayStation*.dat 27 | ``` 28 | 29 | 1. Run the script... 30 | ``` bash 31 | git clone https://github.com/RobLoach/libretro-dats.git 32 | cd libretro-dats 33 | git submodule update --init 34 | npm install 35 | npm test 36 | ``` 37 | -------------------------------------------------------------------------------- /countries.json: -------------------------------------------------------------------------------- 1 | [ 2 | "USA", 3 | "Canada", 4 | "South America", 5 | "Europe", 6 | "Asia", 7 | "Albania", 8 | "Austria", 9 | "Belarus", 10 | "Belgium", 11 | "Bosnia and Herzegovina", 12 | "Bulgaria", 13 | "Croatia", 14 | "Cyprus", 15 | "Czech Republic", 16 | "Denmark", 17 | "Estonia", 18 | "Finland", 19 | "France", 20 | "Germany", 21 | "Greece", 22 | "Hungary", 23 | "Iceland", 24 | "Ireland", 25 | "Italy", 26 | "Latvia", 27 | "Lithuania", 28 | "Luxembourg", 29 | "Netherlands", 30 | "Norway", 31 | "Poland", 32 | "Portugal", 33 | "Romania", 34 | "Serbia and Montenegro", 35 | "Slovenia", 36 | "Slovakia", 37 | "Spain", 38 | "Sweden", 39 | "Switzerland", 40 | "Turkey", 41 | "Ukraine", 42 | "United Kingdom", 43 | "Yugoslavia", 44 | "Australia", 45 | "Brazil", 46 | "Chile", 47 | "China", 48 | "Egypt", 49 | "Hong Kong", 50 | "India", 51 | "Iran", 52 | "Israel", 53 | "Indonesia", 54 | "Japan", 55 | "Jordan", 56 | "Korea", 57 | "Malaysia", 58 | "Mexico", 59 | "Mongolia", 60 | "Nepal", 61 | "New Zealand", 62 | "Oman", 63 | "Peru", 64 | "Philippines", 65 | "Qatar", 66 | "Russia", 67 | "Singapore", 68 | "South Africa", 69 | "Taiwan", 70 | "Thailand", 71 | "United Arab Emirates", 72 | "Vietnam" 73 | ] 74 | -------------------------------------------------------------------------------- /dats.json: -------------------------------------------------------------------------------- 1 | { 2 | "database/metadat/redump/Atari - Jaguar CD": { 3 | "files": [ 4 | "input/redump/ajcd/Atari - Jaguar CD*.dat" 5 | ] 6 | }, 7 | "database/metadat/redump/Microsoft - Xbox": { 8 | "files": [ 9 | "input/redump/xbox/Microsoft - Xbox - Dat*.dat" 10 | ] 11 | }, 12 | "database/metadat/redump/Microsoft - Xbox 360": { 13 | "files": [ 14 | "input/redump/xbox360/Microsoft - Xbox 360*.dat" 15 | ] 16 | }, 17 | "database/metadat/redump/Philips - CD-i": { 18 | "files": [ 19 | "input/redump/cdi/Philips - CD-i*.dat" 20 | ] 21 | }, 22 | "database/metadat/redump/NEC - PC Engine CD - TurboGrafx-CD": { 23 | "files": [ 24 | "input/redump/pce/NEC - PC Engine CD*.dat" 25 | ] 26 | }, 27 | "database/metadat/redump/NEC - PC-FX": { 28 | "files": [ 29 | "input/redump/pc-fx/NEC - PC-FX*.dat" 30 | ] 31 | }, 32 | "database/metadat/redump/SNK - Neo Geo CD": { 33 | "files": [ 34 | "input/redump/ngcd/SNK - Neo Geo CD - D*.dat" 35 | ] 36 | }, 37 | "database/metadat/redump/Nintendo - GameCube": { 38 | "files": [ 39 | "input/redump/gc/Nintendo - GameCube - D*.dat" 40 | ] 41 | }, 42 | "database/metadat/redump/Nintendo - Wii": { 43 | "files": [ 44 | "input/redump/wii/Nintendo - Wii - *" 45 | ] 46 | }, 47 | "database/metadat/redump/Sega - Dreamcast": { 48 | "files": [ 49 | "input/redump/dc/Sega - Dreamcast*.dat" 50 | ] 51 | }, 52 | "database/metadat/redump/Sega - Mega-CD - Sega CD": { 53 | "files": [ 54 | "input/redump/mcd/Sega - Mega*.dat" 55 | ] 56 | }, 57 | "database/metadat/redump/Sega - Naomi": { 58 | "files": [ 59 | "input/redump/naomi/Arcade - Sega - Naomi - D*.dat" 60 | ] 61 | }, 62 | "database/metadat/redump/Sega - Naomi 2": { 63 | "files": [ 64 | "input/redump/naomi2/Arcade - Sega - Naomi 2 - D*.dat" 65 | ] 66 | }, 67 | "database/metadat/redump/Sega - Saturn": { 68 | "files": [ 69 | "input/redump/ss/Sega - Saturn*.dat" 70 | ] 71 | }, 72 | "database/metadat/redump/Sony - PlayStation": { 73 | "files": [ 74 | "input/redump/psx/Sony - PlayStation - Dat*.dat" 75 | ] 76 | }, 77 | "database/metadat/redump/Sony - PlayStation 2": { 78 | "files": [ 79 | "input/redump/ps2/Sony - PlayStation 2 - Dat*.dat" 80 | ] 81 | }, 82 | "database/metadat/redump/Sony - PlayStation 3": { 83 | "files": [ 84 | "input/redump/ps3/Sony - PlayStation 3 - Dat*.dat" 85 | ] 86 | }, 87 | "database/metadat/redump/Sony - PlayStation Portable": { 88 | "files": [ 89 | "input/redump/psp/Sony - PlayStation Portable - Dat*" 90 | ] 91 | }, 92 | "database/metadat/redump/The 3DO Company - 3DO": { 93 | "files": [ 94 | "input/redump/3do/Panasonic - 3DO*.dat" 95 | ] 96 | }, 97 | "database/metadat/redump/Commodore - CD32": { 98 | "files": [ 99 | "input/redump/cd32/Commodore - Amiga CD32*.dat" 100 | ] 101 | }, 102 | "database/metadat/redump/Commodore - CDTV": { 103 | "files": [ 104 | "input/redump/cdtv/Commodore - Amiga CDTV*.dat" 105 | ] 106 | }, 107 | "database/metadat/libretro-dats/Nintendo - Super Nintendo Entertainment System": { 108 | "files": [ 109 | "static/English Translation ROMs/Nintendo - Super Famicom *.dat" 110 | ] 111 | }, 112 | "database/metadat/libretro-dats/Nintendo - Nintendo Entertainment System": { 113 | "files": [ 114 | "static/Headered/Nintendo - Nintendo*.dat" 115 | ] 116 | }, 117 | "database/metadat/libretro-dats/Nintendo - Family Computer Disk System": { 118 | "files": [ 119 | "static/Headered/Nintendo - Family*.dat" 120 | ] 121 | }, 122 | "database/metadat/libretro-dats/Sega - Saturn": { 123 | "files": [ 124 | "input/darkwater/Saturn*" 125 | ] 126 | }, 127 | "database/metadat/tosec/Atari - 8-bit": { 128 | "files": [ 129 | "input/tosec/TOSEC/Atari 8bit - Games*" 130 | ] 131 | }, 132 | "database/metadat/tosec/Atari - 2600": { 133 | "files": [ 134 | "input/tosec/TOSEC/Atari 2600 & VCS - Games*" 135 | ] 136 | }, 137 | "database/metadat/tosec/Atari - 5200": { 138 | "files": [ 139 | "input/tosec/TOSEC/Atari 5200 - Games*" 140 | ] 141 | }, 142 | "database/metadat/tosec/Atari - 7800": { 143 | "files": [ 144 | "input/tosec/TOSEC/Atari 7800 - Games*" 145 | ] 146 | }, 147 | "database/metadat/tosec/Atari - ST": { 148 | "files": [ 149 | "input/tosec/TOSEC/Atari ST - Games*" 150 | ] 151 | }, 152 | "database/metadat/tosec/Atari - Lynx": { 153 | "files": [ 154 | "input/tosec/TOSEC/Atari Lynx - Games*" 155 | ] 156 | }, 157 | "database/metadat/tosec/Atari - Jaguar": { 158 | "files": [ 159 | "input/tosec/TOSEC/Atari Jaguar - Games*" 160 | ] 161 | }, 162 | "database/metadat/tosec/Commodore - PET": { 163 | "files": [ 164 | "input/tosec/TOSEC/Commodore PET - Games*" 165 | ] 166 | }, 167 | "database/metadat/tosec/Amstrad - CPC": { 168 | "files": [ 169 | "input/tosec/TOSEC/Amstrad CPC - Games*" 170 | ] 171 | }, 172 | "database/metadat/tosec/Amstrad - GX4000": { 173 | "files": [ 174 | "input/tosec/TOSEC/Amstrad GX4000 - Games*" 175 | ] 176 | }, 177 | "database/metadat/tosec/Infocom - Z-Machine": { 178 | "files": [ 179 | "input/tosec/TOSEC/Infocom Z-Machine - *" 180 | ] 181 | }, 182 | "database/metadat/tosec/NEC - PC Engine CD - TurboGrafx-CD": { 183 | "files-ignore-missing-serial": [ 184 | "input/tosec/TOSEC-ISO/NEC PC-Engine CD*" 185 | ] 186 | }, 187 | "database/metadat/tosec/NEC - PC-98": { 188 | "files": [ 189 | "input/tosec/TOSEC/NEC PC-9801 - Games*" 190 | ] 191 | }, 192 | "database/metadat/tosec/NEC - PC-FX": { 193 | "files-ignore-missing-serial": [ 194 | "input/tosec/TOSEC-ISO/NEC PC-FX - Games*" 195 | ] 196 | }, 197 | "database/metadat/tosec/Mattel - Intellivision": { 198 | "files": [ 199 | "input/tosec/TOSEC/Mattel Intellivision - Games*" 200 | ] 201 | }, 202 | "database/metadat/tosec/Nintendo - GameCube": { 203 | "files-ignore-missing-serial": [ 204 | "input/tosec/TOSEC-ISO/Nintendo GameCube - Games*" 205 | ] 206 | }, 207 | "database/metadat/tosec/Nintendo - Nintendo Entertainment System": { 208 | "files": [ 209 | "input/tosec/TOSEC/Nintendo Famicom & Entertainment System - Games*" 210 | ] 211 | }, 212 | "database/metadat/tosec/Nintendo - Super Nintendo Entertainment System": { 213 | "files": [ 214 | "input/tosec/TOSEC/Nintendo Super Famicom & Super Entertainment System - Games*" 215 | ] 216 | }, 217 | "database/metadat/tosec/Nintendo - Game Boy": { 218 | "files": [ 219 | "input/tosec/TOSEC/Nintendo Game Boy - Games*" 220 | ] 221 | }, 222 | "database/metadat/tosec/Nintendo - Game Boy Color": { 223 | "files": [ 224 | "input/tosec/TOSEC/Nintendo Game Boy Color - Games*" 225 | ] 226 | }, 227 | "database/metadat/tosec/Nintendo - Game Boy Advance": { 228 | "files": [ 229 | "input/tosec/TOSEC/Nintendo Game Boy Advance - Games*" 230 | ] 231 | }, 232 | "database/metadat/tosec/Sega - Mega Drive - Genesis": { 233 | "files": [ 234 | "input/tosec/TOSEC/Sega Mega Drive & Genesis - Games*" 235 | ] 236 | }, 237 | "database/metadat/tosec/Sega - Master System - Mark III": { 238 | "files": [ 239 | "input/tosec/TOSEC/Sega Mark III & Master System - Games*" 240 | ] 241 | }, 242 | "database/metadat/tosec/Sega - SG-1000": { 243 | "files": [ 244 | "input/tosec/TOSEC/Sega Game 1000 - Games*" 245 | ] 246 | }, 247 | "database/metadat/tosec/Sega - 32X": { 248 | "files": [ 249 | "input/tosec/TOSEC/Sega 32X - Games*" 250 | ] 251 | }, 252 | "database/metadat/tosec/Sega - PICO": { 253 | "files": [ 254 | "input/tosec/TOSEC/Sega Pico - Educational*" 255 | ] 256 | }, 257 | "database/metadat/tosec/Sega - Game Gear": { 258 | "files": [ 259 | "input/tosec/TOSEC/Sega Game Gear - Games*" 260 | ] 261 | }, 262 | "database/metadat/tosec/Sega - Dreamcast": { 263 | "files-ignore-missing-serial": [ 264 | "input/tosec/TOSEC-ISO/Sega Dreamcast - Games*" 265 | ] 266 | }, 267 | "database/metadat/tosec/Sega - Mega-CD - Sega CD": { 268 | "files-ignore-missing-serial": [ 269 | "input/tosec/TOSEC-ISO/Sega Mega-CD & Sega CD - CD - Games*" 270 | ] 271 | }, 272 | "database/metadat/tosec/Sega - Saturn": { 273 | "files-ignore-missing-serial": [ 274 | "input/tosec/TOSEC-ISO/Sega Saturn - Ga*", 275 | "input/darkwater/Saturn*" 276 | ] 277 | }, 278 | "database/metadat/tosec/Sony - PlayStation": { 279 | "files-ignore-missing-serial": [ 280 | "input/tosec/TOSEC-ISO/Sony PlayStation - Games*" 281 | ] 282 | }, 283 | "database/metadat/tosec/Sinclair - ZX Spectrum": { 284 | "files": [ 285 | "input/tosec/TOSEC/Sinclair ZX Spectrum - Compilations - Games *", 286 | "input/tosec/TOSEC/Sinclair ZX Spectrum - Games - *" 287 | ] 288 | }, 289 | "database/metadat/tosec/Sharp - X1": { 290 | "files": [ 291 | "input/tosec/TOSEC/Sharp X1 - Games*" 292 | ] 293 | }, 294 | "database/metadat/tosec/Sharp - X68000": { 295 | "files": [ 296 | "input/tosec/TOSEC/Sharp X68000 - Games*" 297 | ] 298 | }, 299 | "database/metadat/tosec/Spectravideo - SVI-318 - SVI-328": { 300 | "files": [ 301 | "input/tosec/TOSEC/Spectravideo *" 302 | ] 303 | }, 304 | "database/metadat/tosec/NEC - PC-8001 - PC-8801": { 305 | "files": [ 306 | "input/tosec/TOSEC/NEC PC-8801 - Applications *", 307 | "input/tosec/TOSEC/NEC PC-8801 - Games *" 308 | ] 309 | }, 310 | "database/metadat/tosec/The 3DO Company - 3DO": { 311 | "files-ignore-missing-serial": [ 312 | "input/tosec/TOSEC-ISO/3DO 3DO Interactive Multiplayer - Games*" 313 | ] 314 | }, 315 | "database/metadat/tosec/Thomson - MOTO": { 316 | "files": [ 317 | "input/tosec/TOSEC/Thomson MO5 - Games *", 318 | "input/tosec/TOSEC/Thomson MO6 - Games *", 319 | "input/tosec/TOSEC/Thomson TO7 - Games *", 320 | "input/tosec/TOSEC/Thomson TO8, TO8D, TO9, TO9+ - Games *" 321 | ] 322 | }, 323 | "database/metadat/tosec/Apple - II": { 324 | "files": [ 325 | "input/tosec/TOSEC/Apple II - Games*" 326 | ] 327 | }, 328 | "database/metadat/tosec/Commodore - Amiga": { 329 | "files": [ 330 | "input/tosec/TOSEC/Commodore Amiga - Games -*" 331 | ] 332 | }, 333 | "database/metadat/tosec/Commodore - CD32": { 334 | "files-ignore-missing-serial": [ 335 | "input/tosec/TOSEC-ISO/Commodore Amiga CD32 - Games*" 336 | ] 337 | }, 338 | "database/metadat/tosec/Commodore - CDTV": { 339 | "files-ignore-missing-serial": [ 340 | "input/tosec/TOSEC-ISO/Commodore Amiga CDTV - Games *" 341 | ] 342 | }, 343 | "database/metadat/no-intro/Arduboy Inc - Arduboy": { 344 | "files": [ 345 | "input/no-intro/No-Intro/Arduboy Inc - Arduboy*" 346 | ] 347 | }, 348 | "database/metadat/no-intro/Atari - 8-bit": { 349 | "files": [ 350 | "input/no-intro/No-Intro/Atari - 8-bit Family *", 351 | "input/no-intro/Aftermarket/Atari - 8-bit Family *" 352 | ] 353 | }, 354 | "database/metadat/no-intro/Atari - 2600": { 355 | "files": [ 356 | "input/no-intro/No-Intro/Atari - 2600*", 357 | "input/no-intro/Aftermarket/Atari - 2600 *" 358 | ] 359 | }, 360 | "database/metadat/no-intro/Atari - 5200": { 361 | "files": [ 362 | "input/no-intro/No-Intro/Atari - 5200*", 363 | "input/no-intro/Aftermarket/Atari - 5200*" 364 | ] 365 | }, 366 | "database/metadat/no-intro/Atari - 7800": { 367 | "files": [ 368 | "input/no-intro/No-Intro/Atari - 7800*", 369 | "input/no-intro/Aftermarket/Atari - 7800*" 370 | ] 371 | }, 372 | "database/metadat/no-intro/Atari - Jaguar": { 373 | "files": [ 374 | "input/no-intro/No-Intro/Atari - Jaguar*", 375 | "input/no-intro/Aftermarket/Atari - Jaguar *" 376 | ] 377 | }, 378 | "database/metadat/no-intro/Atari - Lynx": { 379 | "files": [ 380 | "input/no-intro/No-Intro/Atari - Lynx*", 381 | "input/no-intro/Aftermarket/Atari - Lynx*" 382 | ] 383 | }, 384 | "database/metadat/no-intro/Atari - ST": { 385 | "files": [ 386 | "input/no-intro/No-Intro/Atari - ST (20*" 387 | ] 388 | }, 389 | "database/metadat/no-intro/Bandai - WonderSwan": { 390 | "files": [ 391 | "input/no-intro/No-Intro/Bandai - WonderSwan (*", 392 | "input/no-intro/Aftermarket/Bandai - WonderSwan (*" 393 | ] 394 | }, 395 | "database/metadat/no-intro/Bandai - WonderSwan Color": { 396 | "files": [ 397 | "input/no-intro/No-Intro/Bandai - WonderSwan Color*", 398 | "input/no-intro/Aftermarket/Bandai - WonderSwan Color *" 399 | ] 400 | }, 401 | "database/metadat/no-intro/Benesse - Pocket Challenge V2": { 402 | "files": [ 403 | "input/no-intro/No-Intro/Benesse - Pocket Challenge V2*" 404 | ] 405 | }, 406 | "database/metadat/no-intro/Casio - Loopy": { 407 | "files": [ 408 | "input/no-intro/No-Intro/Casio - Loopy*" 409 | ] 410 | }, 411 | "database/metadat/no-intro/Casio - PV-1000": { 412 | "files": [ 413 | "input/no-intro/No-Intro/Casio - PV-1000*" 414 | ] 415 | }, 416 | "database/metadat/no-intro/Coleco - ColecoVision": { 417 | "files": [ 418 | "input/no-intro/No-Intro/Coleco - ColecoVision*", 419 | "input/no-intro/Aftermarket/Coleco - ColecoVision *" 420 | ] 421 | }, 422 | "database/metadat/no-intro/Commodore - 64": { 423 | "files": [ 424 | "input/no-intro/No-Intro/Commodore - Commodore 64 *", 425 | "input/no-intro/Aftermarket/Commodore - Commodore 64 *" 426 | ] 427 | }, 428 | "database/metadat/no-intro/Commodore - Amiga": { 429 | "files": [ 430 | "input/no-intro/No-Intro/Commodore - Amiga (20*" 431 | ] 432 | }, 433 | "database/metadat/no-intro/Commodore - Plus-4": { 434 | "files": [ 435 | "input/no-intro/No-Intro/Commodore - Plus-4*" 436 | ] 437 | }, 438 | "database/metadat/no-intro/Commodore - VIC-20": { 439 | "files": [ 440 | "input/no-intro/No-Intro/Commodore - VIC-20*" 441 | ] 442 | }, 443 | "database/metadat/no-intro/Emerson - Arcadia 2001": { 444 | "files": [ 445 | "input/no-intro/No-Intro/Emerson - Arcadia 2001*" 446 | ] 447 | }, 448 | "database/metadat/no-intro/Entex - Adventure Vision": { 449 | "files": [ 450 | "input/no-intro/No-Intro/Entex - Adventure Vision*" 451 | ] 452 | }, 453 | "database/metadat/no-intro/Epoch - Super Cassette Vision": { 454 | "files": [ 455 | "input/no-intro/No-Intro/Epoch - Super Cassette Vision*" 456 | ] 457 | }, 458 | "database/metadat/no-intro/Fairchild - Channel F": { 459 | "files": [ 460 | "input/no-intro/No-Intro/Fairchild - Channel F*" 461 | ] 462 | }, 463 | "database/metadat/no-intro/Funtech - Super Acan": { 464 | "files": [ 465 | "input/no-intro/No-Intro/Funtech - Super Acan*" 466 | ] 467 | }, 468 | "database/metadat/no-intro/GamePark - GP32": { 469 | "files": [ 470 | "input/no-intro/No-Intro/GamePark - GP32*" 471 | ] 472 | }, 473 | "database/metadat/no-intro/GCE - Vectrex": { 474 | "files": [ 475 | "input/no-intro/No-Intro/GCE - Vectrex*", 476 | "input/no-intro/Aftermarket/GCE - Vectrex*" 477 | ] 478 | }, 479 | "database/metadat/no-intro/Hartung - Game Master": { 480 | "files": [ 481 | "input/no-intro/No-Intro/Hartung - Game Master*" 482 | ] 483 | }, 484 | "database/metadat/no-intro/Konami - Picno": { 485 | "files": [ 486 | "input/no-intro/No-Intro/Konami - Picno*" 487 | ] 488 | }, 489 | "database/metadat/no-intro/LeapFrog - LeapPad": { 490 | "files": [ 491 | "input/no-intro/No-Intro/LeapFrog - LeapPad *" 492 | ] 493 | }, 494 | "database/metadat/no-intro/LeapFrog - Leapster Learning Game System": { 495 | "files": [ 496 | "input/no-intro/No-Intro/LeapFrog - Leapster Learning Game System*" 497 | ] 498 | }, 499 | "database/metadat/no-intro/Magnavox - Odyssey2": { 500 | "files": [ 501 | "input/no-intro/No-Intro/Magnavox - Odyssey2*" 502 | ] 503 | }, 504 | "database/metadat/no-intro/Mattel - Intellivision": { 505 | "files": [ 506 | "input/no-intro/No-Intro/Mattel - Intellivision*", 507 | "input/no-intro/Aftermarket/Mattel - Intellivision*" 508 | ] 509 | }, 510 | "database/metadat/no-intro/Microsoft - MSX2": { 511 | "files": [ 512 | "input/no-intro/No-Intro/Microsoft - MSX2*", 513 | "input/no-intro/Aftermarket/Microsoft - MSX2*" 514 | ] 515 | }, 516 | "database/metadat/no-intro/Microsoft - MSX": { 517 | "files": [ 518 | "input/no-intro/No-Intro/Microsoft - MSX (*", 519 | "input/no-intro/Aftermarket/Microsoft - MSX (*" 520 | ] 521 | }, 522 | "database/metadat/no-intro/Microsoft - Xbox 360": { 523 | "files": [ 524 | "input/no-intro/No-Intro/Microsoft - XBOX 360*", 525 | "input/no-intro/No-Intro/Unofficial - Microsoft - XBOX 360*" 526 | ] 527 | }, 528 | "database/metadat/no-intro/Mobile - J2ME": { 529 | "files": [ 530 | "input/no-intro/No-Intro/Mobile - J2ME *" 531 | ] 532 | }, 533 | "database/metadat/no-intro/Mobile - Palm OS": { 534 | "files": [ 535 | "input/no-intro/No-Intro/Mobile - Palm OS *" 536 | ] 537 | }, 538 | "database/metadat/no-intro/Mobile - Symbian": { 539 | "files": [ 540 | "input/no-intro/No-Intro/Mobile - Symbian *" 541 | ] 542 | }, 543 | "database/metadat/no-intro/Mobile - Zeebo": { 544 | "files": [ 545 | "input/no-intro/No-Intro/Mobile - Zeebo *" 546 | ] 547 | }, 548 | "database/metadat/no-intro/NEC - PC Engine SuperGrafx": { 549 | "files": [ 550 | "input/no-intro/No-Intro/NEC - PC Engine SuperGrafx*", 551 | "input/no-intro/Aftermarket/NEC - PC Engine SuperGrafx *" 552 | ] 553 | }, 554 | "database/metadat/no-intro/NEC - PC Engine - TurboGrafx 16": { 555 | "files": [ 556 | "input/no-intro/No-Intro/NEC - PC Engine - TurboGrafx 16*", 557 | "input/no-intro/Aftermarket/NEC - PC Engine - TurboGrafx 16 *" 558 | ] 559 | }, 560 | "database/metadat/no-intro/Nintendo - e-Reader": { 561 | "files": [ 562 | "input/no-intro/No-Intro/Nintendo - e-Reader (*" 563 | ] 564 | }, 565 | "database/metadat/no-intro/Nintendo - Family Computer Disk System": { 566 | "files": [ 567 | "input/no-intro/No-Intro/Nintendo - Family Computer Disk System*", 568 | "input/no-intro/Aftermarket/Nintendo - Family Computer Disk System *" 569 | ] 570 | }, 571 | "database/metadat/no-intro/Nintendo - Game Boy": { 572 | "files": [ 573 | "input/no-intro/No-Intro/Nintendo - Game Boy (*", 574 | "input/no-intro/Aftermarket/Nintendo - Game Boy (*" 575 | ] 576 | }, 577 | "database/metadat/no-intro/Nintendo - Game Boy Advance": { 578 | "files": [ 579 | "input/no-intro/No-Intro/Nintendo - Game Boy Advance (2*", 580 | "input/no-intro/Aftermarket/Nintendo - Game Boy Advance (A*" 581 | ] 582 | }, 583 | "database/metadat/no-intro/Nintendo - Game Boy Color": { 584 | "files": [ 585 | "input/no-intro/No-Intro/Nintendo - Game Boy Color (*", 586 | "input/no-intro/Aftermarket/Nintendo - Game Boy Color (*" 587 | ] 588 | }, 589 | "database/metadat/no-intro/Nintendo - New Nintendo 3DS": { 590 | "files": [ 591 | "input/no-intro/No-Intro/Nintendo - New Nintendo 3DS (Decrypted) (2*" 592 | ] 593 | }, 594 | "database/metadat/no-intro/Nintendo - Nintendo 3DS": { 595 | "files": [ 596 | "input/no-intro/No-Intro/Nintendo - Nintendo 3DS (Decrypted) (2*", 597 | "input/no-intro/No-Intro/Unofficial - Nintendo - Nintendo 3DS (Digital) (Updates and DLC) (Decrypted) (2*" 598 | ] 599 | }, 600 | "database/metadat/no-intro/Nintendo - Nintendo 64": { 601 | "files": [ 602 | "input/no-intro/No-Intro/Nintendo - Nintendo 64 (*", 603 | "input/no-intro/No-Intro/iQue - iQue (D*", 604 | "input/no-intro/Aftermarket/Nintendo - Nintendo 64 (*" 605 | ] 606 | }, 607 | "database/metadat/no-intro/Nintendo - Nintendo 64DD": { 608 | "files": [ 609 | "input/no-intro/No-Intro/Nintendo - Nintendo 64DD (2*" 610 | ] 611 | }, 612 | "database/metadat/no-intro/Nintendo - Nintendo DS": { 613 | "files": [ 614 | "input/no-intro/No-Intro/Nintendo - Nintendo DS (Decrypted) (2*", 615 | "input/no-intro/No-Intro/Nintendo - Nintendo DS (Download Play)*", 616 | "input/no-intro/Aftermarket/Nintendo - Nintendo DS (*" 617 | ] 618 | }, 619 | "database/metadat/no-intro/Nintendo - Nintendo DSi": { 620 | "files": [ 621 | "input/no-intro/No-Intro/Nintendo - Nintendo DSi (Digital) (2*" 622 | ] 623 | }, 624 | "database/metadat/no-intro/Nintendo - Nintendo Entertainment System": { 625 | "files": [ 626 | "input/no-intro/No-Intro/Nintendo - Nintendo Entertainment System*", 627 | "input/no-intro/Aftermarket/Nintendo - Nintendo Entertainment System*" 628 | ] 629 | }, 630 | "database/metadat/no-intro/Nintendo - Pokemon Mini": { 631 | "files": [ 632 | "input/no-intro/No-Intro/Nintendo - Pokemon Mini (2*", 633 | "input/no-intro/Aftermarket/Nintendo - Pokemon Mini *" 634 | ] 635 | }, 636 | "database/metadat/no-intro/Nintendo - Satellaview": { 637 | "files": [ 638 | "input/no-intro/No-Intro/Nintendo - Satellaview (2*", 639 | "input/no-intro/Aftermarket/Nintendo - Satellaview *" 640 | ] 641 | }, 642 | "database/metadat/no-intro/Nintendo - Sufami Turbo": { 643 | "files": [ 644 | "input/no-intro/No-Intro/Nintendo - Sufami Turbo (2*" 645 | ] 646 | }, 647 | "database/metadat/no-intro/Nintendo - Super Nintendo Entertainment System": { 648 | "files": [ 649 | "input/no-intro/No-Intro/Nintendo - Super Nintendo Entertainment System *", 650 | "input/no-intro/Aftermarket/Nintendo - Super Nintendo Entertainment System *" 651 | ] 652 | }, 653 | "database/metadat/no-intro/Nintendo - Virtual Boy": { 654 | "files": [ 655 | "input/no-intro/No-Intro/Nintendo - Virtual Boy (2*", 656 | "input/no-intro/Aftermarket/Nintendo - Virtual Boy *" 657 | ] 658 | }, 659 | "database/metadat/no-intro/Nintendo - Wii (Digital)": { 660 | "files": [ 661 | "input/no-intro/No-Intro/Nintendo - Wii (Digital) (W*" 662 | ] 663 | }, 664 | "database/metadat/no-intro/Nintendo - Wii U (Digital)": { 665 | "files": [ 666 | "input/no-intro/No-Intro/Nintendo - Wii U (Digital) (2*" 667 | ] 668 | }, 669 | "database/metadat/no-intro/Philips - Videopac+": { 670 | "files": [ 671 | "input/no-intro/No-Intro/Philips - Videopac+*" 672 | ] 673 | }, 674 | "database/metadat/no-intro/RCA - Studio II": { 675 | "files": [ 676 | "input/no-intro/No-Intro/RCA - Studio II*" 677 | ] 678 | }, 679 | "database/metadat/no-intro/Sega - 32X": { 680 | "files": [ 681 | "input/no-intro/No-Intro/Sega - 32X*" 682 | ] 683 | }, 684 | "database/metadat/no-intro/Sega - Beena": { 685 | "files": [ 686 | "input/no-intro/No-Intro/Sega - Beena*" 687 | ] 688 | }, 689 | "database/metadat/no-intro/Sega - Game Gear": { 690 | "files": [ 691 | "input/no-intro/No-Intro/Sega - Game Gear*", 692 | "input/no-intro/Aftermarket/Sega - Game Gear*" 693 | ] 694 | }, 695 | "database/metadat/no-intro/Sega - Master System - Mark III": { 696 | "files": [ 697 | "input/no-intro/No-Intro/Sega - Master System - Mark III*", 698 | "input/no-intro/Aftermarket/Sega - Master System - Mark III*" 699 | ] 700 | }, 701 | "database/metadat/no-intro/Sega - Mega Drive - Genesis": { 702 | "files": [ 703 | "input/no-intro/No-Intro/Sega - Mega Drive - Genesis*", 704 | "input/no-intro/Aftermarket/Sega - Mega Drive - Genesis*" 705 | ] 706 | }, 707 | "database/metadat/no-intro/Sega - PICO": { 708 | "files": [ 709 | "input/no-intro/No-Intro/Sega - PICO*" 710 | ] 711 | }, 712 | "database/metadat/no-intro/Sega - SG-1000": { 713 | "files": [ 714 | "input/no-intro/No-Intro/Sega - SG-1000*", 715 | "input/no-intro/Aftermarket/Sega - SG-1000*" 716 | ] 717 | }, 718 | "database/metadat/no-intro/Sharp - X68000": { 719 | "files": [ 720 | "input/no-intro/No-Intro/Sharp - X68000*" 721 | ] 722 | }, 723 | "database/metadat/no-intro/Sinclair - ZX Spectrum +3": { 724 | "files": [ 725 | "input/no-intro/No-Intro/Sinclair - ZX Spectrum +3 (2*" 726 | ] 727 | }, 728 | "database/metadat/no-intro/SNK - Neo Geo Pocket": { 729 | "files": [ 730 | "input/no-intro/No-Intro/SNK - Neo Geo Pocket (2*" 731 | ] 732 | }, 733 | "database/metadat/no-intro/SNK - Neo Geo Pocket Color": { 734 | "files": [ 735 | "input/no-intro/No-Intro/SNK - Neo Geo Pocket Color*" 736 | ] 737 | }, 738 | "database/metadat/no-intro/Sony - PlayStation 3 (PSN)": { 739 | "files": [ 740 | "input/no-intro/No-Intro/Sony - PlayStation 3 (PSN) (Decrypted)*", 741 | "input/no-intro/No-Intro/Unofficial - Sony - PlayStation 3 (PSN) (Decrypted) (2*" 742 | ] 743 | }, 744 | "database/metadat/no-intro/Sony - PlayStation Portable (PSN)": { 745 | "files": [ 746 | "input/no-intro/No-Intro/Unofficial - Sony - PlayStation Portable (PSN) (Decrypted) (2*" 747 | ] 748 | }, 749 | "database/metadat/no-intro/Sony - PlayStation Vita": { 750 | "files": [ 751 | "input/no-intro/No-Intro/Sony - PlayStation Vita (V*" 752 | ] 753 | }, 754 | "database/metadat/no-intro/Sony - PlayStation Vita (PSN)": { 755 | "files": [ 756 | "input/no-intro/No-Intro/Sony - PlayStation Vita (PSN) (Decrypted)*", 757 | "input/no-intro/No-Intro/Unofficial - Sony - PlayStation Vita (PSN) (Decrypted)*" 758 | ] 759 | }, 760 | "database/metadat/no-intro/Tiger - Game.com": { 761 | "files": [ 762 | "input/no-intro/No-Intro/Tiger - Game*" 763 | ] 764 | }, 765 | "database/metadat/no-intro/VTech - CreatiVision": { 766 | "files": [ 767 | "input/no-intro/No-Intro/VTech - CreatiVision*" 768 | ] 769 | }, 770 | "database/metadat/no-intro/VTech - V.Smile": { 771 | "files": [ 772 | "input/no-intro/No-Intro/VTech - V.Smile*" 773 | ] 774 | }, 775 | "database/metadat/no-intro/Watara - Supervision": { 776 | "files": [ 777 | "input/no-intro/No-Intro/Watara - Supervision*", 778 | "input/no-intro/Aftermarket/Watara - Supervision*" 779 | ] 780 | } 781 | } 782 | -------------------------------------------------------------------------------- /download.js: -------------------------------------------------------------------------------- 1 | const mkdirp = require('mkdirp') 2 | const extract = require('extract-zip') 3 | const fs = require('fs') 4 | const request = require('request') 5 | const path = require('path') 6 | const download = require('download') 7 | const puppeteer = require('puppeteer') 8 | 9 | module.exports = async function download() { 10 | //await nointro() 11 | //await tosec() 12 | mkdirp.sync('input/redump') 13 | await redump() 14 | } 15 | 16 | function tosec() { 17 | return new Promise(function(resolve, reject) { 18 | if (fs.existsSync('tosec.zip')) { 19 | if (!fs.existsSync('input/tosec')) { 20 | mkdirp.sync('input/tosec') 21 | extractFile('tosec.zip', 'input/tosec').then(resolve, reject).catch(reject) 22 | } 23 | else { 24 | resolve(); 25 | } 26 | } else { 27 | console.log('Downloading TOSEC') 28 | request.post('https://www.tosecdev.org/downloads/category/57-2023-07-10?download=112:tosec-dat-pack-complete-3983-tosec-v2023-07-10') 29 | .on('error', function(err) { 30 | reject(err) 31 | }) 32 | .on('finish', function(err) { 33 | if (err) { 34 | return reject(err) 35 | } else { 36 | setTimeout(function() { 37 | extractFile('tosec.zip', 'input/tosec').then(resolve, reject).catch(reject) 38 | }, 500) 39 | } 40 | }) 41 | .pipe(fs.createWriteStream('tosec.zip')) 42 | } 43 | }) 44 | } 45 | 46 | function nointro() { 47 | return new Promise(async function(resolve, reject) { 48 | if (fs.existsSync('nointro.zip')) { 49 | if (!fs.existsSync('input/no-intro')) { 50 | extractFile('nointro.zip', 'input/no-intro').then(resolve, reject).catch(reject) 51 | } 52 | else { 53 | resolve(); 54 | } 55 | } else { 56 | console.log('Downloading No-Intro') 57 | const downloadPath = process.cwd() 58 | const browser = await puppeteer.launch({ 59 | headless: true // change to false to show browser window while debugging 60 | }) 61 | const page = await browser.newPage() 62 | const client = await page.target().createCDPSession() 63 | await client.send('Page.setDownloadBehavior', { 64 | behavior: 'allow', 65 | downloadPath, 66 | }) 67 | await page.goto('https://datomatic.no-intro.org/index.php?page=download&op=daily') 68 | await page.waitForSelector('input[value="Request"]') 69 | await page.click('input[value="Request"]') 70 | await page.waitForSelector('input[value="Download"]') 71 | await page.click('input[value="Download"]') 72 | // Wait until zip download finish 73 | const timer = setInterval(() => { 74 | const content = fs.readdirSync(downloadPath) 75 | const filePath = content.find((f) => f.startsWith('No-Intro') && f.endsWith('.zip')) 76 | if (filePath) { 77 | setTimeout(function() { 78 | fs.renameSync(filePath, 'nointro.zip') 79 | extractFile('nointro.zip', 'input/no-intro').then(resolve, reject).catch(reject) 80 | }, 500) 81 | clearInterval(timer) 82 | } 83 | }, 1000) 84 | } 85 | }) 86 | } 87 | 88 | function extractFile(source, dest) { 89 | console.log('extract ' + source) 90 | return new Promise(function(resolve, reject) { 91 | console.log('Extracting ' + source) 92 | const destDir = __dirname + '/' + dest 93 | mkdirp.sync(destDir) 94 | extract(source, {dir: destDir}, function (err) { 95 | if (err) { 96 | reject(err) 97 | } else { 98 | resolve() 99 | } 100 | }) 101 | }) 102 | } 103 | 104 | async function redumpDownload(element) { 105 | // Uncomment this to skip downloading Redump 106 | //return 107 | const redumpDatDownload = `input/redump/${element}/dat.zip` 108 | 109 | if (fs.existsSync(`input/redump/${element}`)) { 110 | return; 111 | } 112 | 113 | if (!fs.existsSync(redumpDatDownload)) { 114 | await downloadFile(`http://redump.org/datfile/${element}/serial,version`, redumpDatDownload) 115 | } 116 | 117 | const cueDownload = `input/redump/${element}/cue.zip` 118 | if (!fs.existsSync(cueDownload)) { 119 | await downloadFile(`http://redump.org/cues/${element}/serial,version`, cueDownload) 120 | } 121 | } 122 | 123 | async function redump() { 124 | console.log('Downloading Redump') 125 | mkdirp.sync('input/redump') 126 | const systems = [ 127 | 'arch', 128 | 'mac', 129 | 'ajcd', 130 | 'pippin', 131 | 'qis', 132 | 'acd', 133 | 'cd32', 134 | 'cdtv', 135 | 'fmt', 136 | 'fpp', 137 | 'pc', 138 | 'ite', 139 | 'kea', 140 | 'kfb', 141 | 'ksgv', 142 | 'ixl', 143 | 'hs', 144 | 'vis', 145 | 'xbox', 146 | 'xbox360', 147 | 'trf', 148 | 'ns246', 149 | 'pce', 150 | 'pc-88', 151 | 'pc-98', 152 | 'pc-fx', 153 | 'ngcd', 154 | 'gc', 155 | 'wii', 156 | 'palm', 157 | '3do', 158 | 'cdi', 159 | 'photo-cd', 160 | 'psxgs', 161 | 'ppc', 162 | 'chihiro', 163 | 'dc', 164 | 'mcd', 165 | 'naomi', 166 | 'naomi2', 167 | 'sp21', 168 | 'sre', 169 | 'sre2', 170 | 'ss', 171 | 'x68k', 172 | 'psx', 173 | 'ps2', 174 | 'ps3', 175 | 'psp', 176 | 'quizard', 177 | 'ksite', 178 | 'nuon', 179 | 'vflash', 180 | 'gamewave' 181 | ] 182 | for (let element of systems) { 183 | console.log(`Downloading: ${element}`) 184 | await redumpDownload(element) 185 | } 186 | /* 187 | systems.forEach(async (system) => { 188 | console.log(system) 189 | //await downloadFile(`http://redump.org/datfile/${system}/`, `input/redump/${system}.zip`) 190 | //await extractFile(`input/redump/${system}.zip`, 'input/redump') 191 | 192 | })*/ 193 | 194 | 195 | // 196 | 197 | /*var promises = systems.map(redumpDownload) 198 | await Promise.all(promises) 199 | promises = systems.map(redumpExtract) 200 | await Promise.all(promises)*/ 201 | 202 | /* 203 | for (var element of systems) { 204 | await downloadFile(`http://redump.org/datfile/${element}/`, `input/redump/${element}.zip`) 205 | await extractFile(`input/redump/${element}.zip`, 'input/redump') 206 | }*/ 207 | /*systems.forEach(async function (element) { 208 | setTimeout(async function () { 209 | await extractFile(`input/redump/${element}.zip`, 'input/redump') 210 | }, 500) 211 | })*/ 212 | } 213 | 214 | async function downloadFile(url, dest) { 215 | const destDir = __dirname + '/' + dest 216 | const finalDir = path.dirname(destDir) 217 | if (!fs.existsSync(finalDir)) { 218 | fs.mkdirSync(finalDir); 219 | } 220 | await download(url, finalDir, { 221 | extract: true 222 | }) 223 | } 224 | 225 | function downloadFile2(url, dest) { 226 | return new Promise(function (resolve, reject) { 227 | const destDir = __dirname + '/' + dest 228 | if (!fs.existsSync(destDir)) { 229 | console.log('Downloading ' + url) 230 | 231 | fetch(url) 232 | 233 | request.get(url) 234 | .on('error', function(err) { 235 | console.error('Error on download ', url, dest) 236 | reject(err) 237 | }) 238 | .on('finish', function(err) { 239 | if (err) { 240 | console.error('Failed finish to download ', url, dest) 241 | reject(err) 242 | } else { 243 | console.log('finished ', dest) 244 | resolve() 245 | } 246 | }) 247 | .pipe(fs.createWriteStream(destDir)) 248 | resolve(); 249 | } else { 250 | resolve() 251 | } 252 | }) 253 | } 254 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const pkg = require('./package') 4 | const async = require('async') 5 | const glob = require('multi-glob').glob 6 | const xml = require('xml2js').Parser() 7 | const sort = require('sort-keys') 8 | const unidecode = require('unidecode') 9 | const sanitizeFilename = require('sanitize-filename') 10 | const dats = require('./dats.json') 11 | const request = require('request') 12 | const download = require('./download') 13 | const replaceAll = require('replace-string') 14 | const dateFormat = require('dateformat') 15 | 16 | async function start() { 17 | await download() 18 | async.mapValues(dats, processDat, function (err, results) { 19 | if (err) { 20 | throw err 21 | } 22 | }) 23 | } 24 | 25 | start() 26 | 27 | /** 28 | * Verifies whether or not the entry is valid to be added to the DAT. 29 | */ 30 | function validEntry(gameName) { 31 | // Skip all BIOS files. 32 | if (gameName.indexOf('[BIOS]') >= 0) { 33 | return false 34 | } 35 | 36 | // Skip all bad dumps 37 | if (gameName.indexOf('[b]') >= 0) { 38 | return false 39 | } 40 | 41 | // Skip all demos and programs. 42 | if (gameName.indexOf('(Test Program)') >= 0) { 43 | return false 44 | } 45 | if (gameName.indexOf(' (Demo)') >= 0) { 46 | return false 47 | } 48 | if (gameName.indexOf('(Program)') >= 0) { 49 | return false 50 | } 51 | if (gameName.indexOf('- Program -') >= 0) { 52 | return false 53 | } 54 | if (gameName.indexOf('Test Cartridge') >= 0) { 55 | return false 56 | } 57 | if (gameName.indexOf('Super Nintendo Tester') >= 0) { 58 | return false 59 | } 60 | if (gameName.indexOf('Version Data') >= 0) { 61 | return false; 62 | } 63 | if (gameName.indexOf('(System)') >= 0) { 64 | return false; 65 | } 66 | 67 | // The serial conflicts with Sonic Adventure 2 68 | // https://github.com/libretro/libretro-database/issues/1444 69 | if (gameName.indexOf('Phantasy Star Online' >= 0) && gameName.indexOf('(Rev B)') >= 0) { 70 | return false 71 | } 72 | 73 | return true 74 | } 75 | 76 | /** 77 | * Act on a DAT file. 78 | */ 79 | function processDat(datsInfo, name, done) { 80 | // Retrieve all associated files for the DAT. 81 | glob(datsInfo.files, function (err, files) { 82 | if (!files) { 83 | console.log('EMPTY', name) 84 | } 85 | // Output the files to the user. 86 | //console.log(name, files) 87 | // Loop through each given XML file associated with the DAT. 88 | async.map(files, processXml, function (err, results) { 89 | // Error handling. 90 | if (err) { 91 | return done(err) 92 | } 93 | 94 | // Loop through the results and build a game database. 95 | var games = {} 96 | for (var i in results) { 97 | for (var game in results[i]) { 98 | var gameName = results[i][game].title 99 | if (validEntry(gameName)) { 100 | while (gameName in games) { 101 | gameName = gameName + ' ' 102 | } 103 | games[gameName] = results[i][game] 104 | } 105 | } 106 | } 107 | 108 | if (Object.entries(games).length === 0) { 109 | return 110 | } 111 | var output = getHeader(name, pkg) 112 | 113 | // Loop through the sorted games database, and output the rom. 114 | for (let game in sort(games)) { 115 | let rom = games[game] 116 | game = game.trim() 117 | let gameOutput = getGameEntry(game, rom, name) 118 | output += gameOutput 119 | } 120 | 121 | // Save the new DAT file. 122 | var outputFile = `${name}.dat` 123 | //console.log(outputFile) 124 | fs.writeFile(outputFile, output, done) 125 | }) 126 | }) 127 | } 128 | 129 | /** 130 | * Construct a header for a DAT file. 131 | */ 132 | function getHeader(name, pkg) { 133 | const version = dateFormat(new Date(), "yyyy.mm.dd") 134 | return `clrmamepro ( 135 | name "${path.basename(name)}" 136 | description "${path.basename(name)}" 137 | version "${version}" 138 | homepage "${pkg.homepage}" 139 | )\n` 140 | } 141 | 142 | /** 143 | * Construct a game entry for a DAT file. 144 | */ 145 | function getGameEntry(game, rom, name) { 146 | // Replace Unicode characters, and trim the title. 147 | let gameName = unidecode(game).trim(); 148 | 149 | // Clean the name some more. 150 | gameName = gameName 151 | .replace('Games (Europe)\\', '') 152 | .replace('Games\\', '') 153 | .replace('Games (USA)\\', '') 154 | .replace('Games (Japan)\\', '') 155 | .replace('Games (cdi)\\', '') 156 | .replace('Games (elf)\\', '') 157 | .replace('MISSING\\', '') 158 | .replace('Samplers\\', '') 159 | .replace('Multimedia\\', '') 160 | .replace('(Sony Imagesoft)', '') 161 | .replace('(Sony)', '') 162 | .replace('(Sega)', '') 163 | .replace('(Riot)', '') 164 | .replace('(Bignet - Micronet)', '') 165 | .replace('(Bignet)', '') 166 | .replace('(M4)', '') 167 | .replace('(Acclaim - Domark)', '') 168 | .replace('(Acclaim)', '') 169 | .replace('(Gametek)', '') 170 | .replace('(Good Deal Games)', '') 171 | .replace('(Good Deal Games - Stargate Films)', '') 172 | .replace('(Sega - Tec Toy)', '') 173 | .replace('(SIMS)', '') 174 | .replace('(Sims)', '') 175 | .replace('(Tecmo)', '') 176 | .replace('(Sensible Software - Sony)', '') 177 | .replace('(Taito)', '') 178 | .replace('(Infogrames)', '') 179 | .replace('(Interplay)', '') 180 | .replace('(Domark)', '') 181 | .replace('(Pony Canyon)', '') 182 | .replace('(Panasonic)', '') 183 | .replace('(LG)', '') 184 | .replace('(Yoshimoto Kogyo)', '') 185 | .replace('(Studio 3DO)', '') 186 | .replace('(GoldStar)', '') 187 | .replace('(Human)', '') 188 | .replace('(Bandai)', '') 189 | .replace('(Activision)', '') 190 | .replace('(Infomedia)', '') 191 | .replace('(RE)', '') 192 | .replace('(Data East - Sega)', '') 193 | .replace('(ReadySoft)', '') 194 | .replace('(Virgin)', '') 195 | .replace('[a]', '(Alt 1)') 196 | .replace('[a1]', '(Alt 1)') 197 | .replace('[a2]', '(Alt 2)') 198 | .replace('[a3]', '(Alt 3)') 199 | .replace('[a4]', '(Alt 4)') 200 | .replace('[a5]', '(Alt 5)') 201 | .replace('[a6]', '(Alt 6)') 202 | .replace('[a7]', '(Alt 7)') 203 | .replace('[a8]', '(Alt 8)') 204 | .replace('[a9]', '(Alt 9)') 205 | .replace('[a10]', '(Alt 10)') 206 | .replace('[a11]', '(Alt 11)') 207 | .replace('(EA Sports)', '') 208 | .replace('(Electronic Arts)', '') 209 | .replace('(Digital Pictures)', '') 210 | .replace('(Good Deal Games - Oldergames)', '') 211 | .replace('(Victor)', '') 212 | .replace('(JVC)', '') 213 | .replace('(Wolf Team)', '') 214 | .replace('(Polydor K.K.)', '') 215 | .replace('(NTSC)', '') 216 | .replace(' (Mega Power)', '') 217 | .replace(' (SMW Hack)', '') 218 | .replace('Games - Unlicensed\\', '') 219 | .replace('Magazines\\', '') 220 | .replace('Applications (cdi)\\', '') 221 | .replace('Applications (elf)\\', '') 222 | .replace('Demos (cdi)\\', '') 223 | .replace('Demos (elf)\\', '') 224 | .replace(' (United States)', ' (USA)') 225 | //does not seem to improve situation nowadays .replace('(PAL)', '(Europe)') 226 | .replace('(EU)', '(Europe)') 227 | .replace('(en)', '') 228 | .replace(')(beta)', ') (Beta)') 229 | .replace('(fr)', '(France)') 230 | .replace('(es)', '(Spain)') 231 | .replace('(JP)', '(Japan)') 232 | .replace('(US)', '(USA)') 233 | .replace('(AE)', '(United Arab Emirates)') 234 | .replace('(AL)', '(Albania)') 235 | .replace('(AS)', '(Asia)') 236 | .replace('(AT)', '(Austria)') 237 | .replace('(AU)', '(Australia)') 238 | .replace('(BA)', '(Bosnia and Herzegovina)') 239 | .replace('(BE)', '(Belgium)') 240 | .replace('(BG)', '(Bulgaria)') 241 | .replace('(BR)', '(Brazil)') 242 | .replace('(CA)', '(Canada)') 243 | .replace('(CH)', '(Switzerland)') 244 | .replace('(CL)', '(Chile)') 245 | .replace('(CN)', '(China)') 246 | .replace('(CS)', '(Serbia and Montenegro)') 247 | .replace('(CY)', '(Cyprus)') 248 | .replace('(CZ)', '(Czech Republic)') 249 | .replace('(DE)', '(Germany)') 250 | .replace('(DK)', '(Denmark)') 251 | .replace('(EE)', '(Estonia)') 252 | .replace('(EG)', '(Egypt)') 253 | .replace('(ES)', '(Spain)') 254 | .replace('(FI)', '(Finland)') 255 | .replace('(FR)', '(France)') 256 | .replace('(GB)', '(United Kingdom)') 257 | .replace('(GR)', '(Greece)') 258 | .replace('(HK)', '(Hong Kong)') 259 | .replace('(HR)', '(Croatia)') 260 | .replace('(HU)', '(Hungary)') 261 | .replace('(ID)', '(Indonesia)') 262 | .replace('(IE)', '(Ireland)') 263 | .replace('(IL)', '(Israel)') 264 | .replace('(IN)', '(India)') 265 | .replace('(IR)', '(Iran)') 266 | .replace('(IS)', '(Iceland)') 267 | .replace('(IT)', '(Italy)') 268 | .replace('(JO)', '(Jordan)') 269 | .replace('(JP)', '(Japan)') 270 | .replace('(KR)', '(Korea)') 271 | .replace('(LT)', '(Lithuania)') 272 | .replace('(LU)', '(Luxembourg)') 273 | .replace('(LV)', '(Latvia)') 274 | .replace('(MN)', '(Mongolia)') 275 | .replace('(MX)', '(Mexico)') 276 | .replace('(MY)', '(Malaysia)') 277 | .replace('(NL)', '(Netherlands)') 278 | .replace('(NO)', '(Norway)') 279 | // conflicts with (NP) flag .replace('(NP)', '(Nepal)') 280 | .replace('(NZ)', '(New Zealand)') 281 | .replace('(OM)', '(Oman)') 282 | .replace('(PE)', '(Peru)') 283 | .replace('(PH)', '(Philippines)') 284 | .replace('(PL)', '(Poland)') 285 | .replace('(PT)', '(Portugal)') 286 | .replace('(QA)', '(Qatar)') 287 | .replace('(RO)', '(Romania)') 288 | .replace('(RU)', '(Russia)') 289 | .replace('(SE)', '(Sweden)') 290 | .replace('(SG)', '(Singapore)') 291 | .replace('(SI)', '(Slovenia)') 292 | .replace('(SK)', '(Slovakia)') 293 | .replace('(TH)', '(Thailand)') 294 | .replace('(TR)', '(Turkey)') 295 | .replace('(TW)', '(Taiwan)') 296 | .replace('(VN)', '(Vietnam)') 297 | .replace('(YU)', '(Yugoslavia)') 298 | .replace('(ZA)', '(South Africa)') 299 | .replace('(BY)', '(Belarus)') 300 | .replace('(UA)', '(Ukraine)') 301 | .replace('(proto)', '(Proto)') 302 | .replace('[!]', '') 303 | .replace('[joystick]', '') 304 | .replace('Applications\\', '') 305 | .replace(''', '\'') 306 | .replace('[MIA] ', '') 307 | .replace(' (Track 1)', '') 308 | .replace(' (Disc 1)', '') 309 | .replace(' (Made in Japan)', '') 310 | 311 | // Remove the " of y" in " (Disc x of y)" 312 | const diskRegexp = /\(((Tape|Dis[ck]) \d{1,2}) of \d{1,2}\)/; 313 | const diskArray = diskRegexp.exec(gameName); 314 | if (diskArray !== null) { 315 | gameName = gameName.replace(diskRegexp, "($1)") 316 | } 317 | 318 | // Parse release date and remove from title 319 | let extraParams = '' 320 | const dateRegexp = /\((\d{4})-?(\d{0,2})-?(\d{0,2})\)/; 321 | const dateArray = dateRegexp.exec(gameName); 322 | if (dateArray !== null) { 323 | if (dateArray[1] > 1950 && dateArray[1] < 2025) { 324 | extraParams += `\n\treleaseyear "${dateArray[1]}"` 325 | if (dateArray[2] !== '' && dateArray[2] > 0 && dateArray[2] < 13) { 326 | extraParams += `\n\treleasemonth "${dateArray[2]}"` 327 | if (dateArray[3] !== '' && dateArray[3] > 0 && dateArray[3] < 32) { 328 | extraParams += `\n\treleaseday "${dateArray[3]}"` 329 | } 330 | } 331 | gameName = gameName.replace(dateRegexp, '') 332 | } 333 | } 334 | 335 | // Remove unclear TOSEC date indications 336 | gameName = gameName.replace('(19xx)', '') 337 | .replace('(197x)', '') 338 | .replace('(198x)', '') 339 | .replace('(199x)', '') 340 | .replace('(20xx)', '') 341 | .replace('(200x)', '') 342 | .replace('(201x)', '') 343 | .replace('(202x)', '') 344 | 345 | gameName = gameName.replace(' ', ' ') 346 | .replace('(RE1)', '(Rev 1)') 347 | .replace('(RE2)', '(Rev 2)') 348 | .replace('(RE3)', '(Rev 3)') 349 | .replace('(RE4)', '(Rev 4)') 350 | .replace('(RE5)', '(Rev 5)') 351 | .replace('(RE6)', '(Rev 6)') 352 | .replace(')(', ') (') 353 | .replace(')(', ') (') 354 | .replace(')(', ') (') 355 | .replace(')(', ') (') 356 | .trim() 357 | 358 | // Protect against #### - Game Name (Country) -- Remove the prefixing numbers. 359 | // Game Boy Advance only does this numbering? 360 | if (name.includes('Game Boy Advance') || name.includes('Nintendo DS')) { 361 | if (/^[0-9xyz][0-9][0-9][0-9] - /.test(gameName)) { 362 | gameName = gameName.substring(7) 363 | } 364 | } 365 | 366 | // The filename must be a valid filename. 367 | let gameFile = sanitizeFilename(path.basename(unidecode(rom.name))) 368 | 369 | // Skip any .sav files. 370 | if (gameFile.indexOf('.sav') >= 0) { 371 | return '' 372 | } 373 | 374 | let gameParams = `name "${gameFile}"` 375 | if (rom.size) { 376 | gameParams += ` size ${rom.size}` 377 | } 378 | if (rom.crc) { 379 | gameParams += ` crc ${rom.crc.toUpperCase()}` 380 | } 381 | if (rom.md5) { 382 | gameParams += ` md5 ${rom.md5.toUpperCase()}` 383 | } 384 | if (rom.sha1) { 385 | gameParams += ` sha1 ${rom.sha1.toUpperCase()}` 386 | } 387 | 388 | let countries = require('./countries') 389 | for (let country of countries) { 390 | if (game.includes('(' + country + ')') || gameName.includes('(' + country + ')')) { 391 | extraParams += `\n\tregion "${country}"` 392 | break; 393 | } 394 | if (game.includes('(' + country + ', ') || gameName.includes('(' + country + ', ')) { 395 | extraParams += `\n\tregion "${country}"` 396 | break; 397 | } 398 | } 399 | 400 | // Handle when there's a serial. 401 | let ignoreserials = [ 402 | '1', 403 | 1, 404 | 'n/a', 405 | 'N/A', 406 | '!none' 407 | ] 408 | if (rom.serial && !ignoreserials.includes(rom.serial.trim())) { 409 | // Multiple serial split into multiple games. 410 | let seperator = ' / ' 411 | if (rom.serial.includes(', ')) { 412 | seperator = ', ' 413 | } 414 | 415 | let serials = rom.serial.split(seperator) 416 | let output = '' 417 | for (let serial of serials) { 418 | let ogParams = extraParams 419 | serial = cleanSerial(serial) 420 | if (serial) { 421 | let discNumber = grabDiscNumber(gameName) 422 | if (discNumber !== false) { 423 | 424 | output += `\ngame ( 425 | name "${gameName}" 426 | description "${gameName}"${ogParams} 427 | serial "${serial}" 428 | rom ( ${gameParams} serial "${serial}" ) 429 | )` 430 | 431 | serial = serial + '-' + (discNumber - 1).toString() 432 | } 433 | ogParams += `\n\tserial "${serial}"` 434 | output += `\ngame ( 435 | name "${gameName}" 436 | description "${gameName}"${ogParams} 437 | rom ( ${gameParams} serial "${serial}" ) 438 | )` 439 | } 440 | } 441 | return output 442 | } 443 | 444 | return `\ngame ( 445 | name "${gameName}" 446 | description "${gameName}"${extraParams} 447 | rom ( ${gameParams} ) 448 | )` 449 | } 450 | 451 | function grabDiscNumber(gameName) { 452 | gameName = gameName.replace('(Disk ', '(Disc ') 453 | const regex = /\(Disc (\d+)/gm; 454 | let m; 455 | 456 | while ((m = regex.exec(gameName)) !== null) { 457 | // This is necessary to avoid infinite loops with zero-width matches 458 | if (m.index === regex.lastIndex) { 459 | regex.lastIndex++ 460 | } 461 | let output = parseInt(m[1]) 462 | if (!Number.isNaN(output)) { 463 | return output 464 | } 465 | } 466 | 467 | return false 468 | } 469 | 470 | function cleanSerial(serial) { 471 | if (!serial) { 472 | return '' 473 | } 474 | let output = serial.trim() 475 | output = replaceAll(output, ' ', '-') 476 | output = replaceAll(output, '#', '') 477 | if (output.charAt(0) == '-') { 478 | output = output.substr(1) 479 | } 480 | return output.trim() 481 | } 482 | 483 | /** 484 | * Process the given XML file. 485 | */ 486 | function processXml(filepath, done) { 487 | if (fs.lstatSync(filepath).isDirectory()) { 488 | return done(null, []) 489 | } 490 | // Read in the file asyncronously. 491 | fs.readFile(filepath, {encoding: 'utf8'}, (err, data) => { 492 | if (err) { 493 | return done(err) 494 | } 495 | 496 | // Convert the string to a JSON object. 497 | console.log(filepath) 498 | xml.parseString(data, (error, dat) => { 499 | if (error) { 500 | return done(error) 501 | } 502 | 503 | // Convert the JSON object to a Games array. 504 | var result = getGamesFromXml(filepath, dat) 505 | 506 | // We have the result, move to the next one. 507 | done(null, result) 508 | }) 509 | }) 510 | } 511 | 512 | /** 513 | * Convert an XML dat object to a games array. 514 | */ 515 | function getGamesFromXml(filepath, dat) { 516 | var dir = path.dirname(filepath) 517 | var out = {} 518 | var header = dat.datafile || dat.dat 519 | var games = header.machine || header.game || null 520 | // Find the games array. 521 | if (!games) { 522 | if (header.games && header.games[0] && header.games[0].game) { 523 | games = header.games[0].game 524 | } 525 | else { 526 | console.log('No Games Found: ', header.header[0].name[0]) 527 | return {} 528 | } 529 | } 530 | 531 | // Loop through each game. 532 | games.forEach(function (game, i) { 533 | // Set up the entries to watch for. 534 | var title = null 535 | var largestData = 0 536 | var dataTracks = [] 537 | var finalPrimary = null 538 | var finalBin = null 539 | var finalIso = null 540 | var finalImg = null 541 | var finalEntry = null 542 | 543 | // Find all the entries. 544 | if (game.rom) { 545 | if (game.title) { 546 | title = game.title 547 | } 548 | else if (game['$'] && game['$'].name) { 549 | title = game['$'].name 550 | } 551 | else if (game.description && game.description[0]) { 552 | title = game.description[0] 553 | } 554 | else if (game.rom[0]['$']) { 555 | title = path.basename(game.rom[0]['$'].name) 556 | } 557 | else { 558 | console.log('Could not find title for....') 559 | console.log(game, i) 560 | process.exit() 561 | } 562 | for (var x in game.rom) { 563 | var rom = game.rom[x]['$'] 564 | let lowerCaseName = rom.name.toLowerCase() 565 | let extname = path.extname(lowerCaseName) 566 | if (lowerCaseName.endsWith('.cue')) { 567 | dataTracks = cueDataTracks(path.join(dir, rom.name)) 568 | } 569 | else if (lowerCaseName.endsWith('.gdi')) { 570 | dataTracks = gdiDataTracks(path.join(dir, rom.name)) 571 | } 572 | else if (dataTracks.includes(rom.name) && Number(rom.size) > largestData) { 573 | finalPrimary = rom 574 | largestData = Number(rom.size) 575 | } 576 | else if (lowerCaseName.endsWith('.bin') && !finalBin) { 577 | finalBin = rom 578 | } 579 | else if (lowerCaseName.endsWith('.iso') && !finalIso) { 580 | finalIso = rom 581 | } 582 | else if (lowerCaseName.endsWith('.img') && !finalImg) { 583 | finalImg = rom 584 | } 585 | else if (lowerCaseName.endsWith('.txt')) { 586 | // Ignore text files 587 | } 588 | else if (extname == '.snd') { 589 | // Ignore 590 | } 591 | else if (extname == '.cg1') { 592 | // Ignore 593 | } 594 | else if (extname == '.eg1') { 595 | // Ignore 596 | } 597 | else if (extname == '.mg1') { 598 | // Ignore 599 | } 600 | else if (extname.length == 0) { 601 | // Ignore zero extension 602 | } 603 | else { 604 | finalEntry = rom 605 | } 606 | } 607 | } 608 | else if (!game.trurip) { 609 | // AdvanceSCENE 610 | title = game.title 611 | finalIso = { 612 | name: game.title + '.iso', 613 | size: game.romSize, 614 | serial: game.serial, 615 | crc: game.files[0].romCRC[0]['_'] 616 | } 617 | } 618 | else { 619 | console.log('Could not entry for....') 620 | if (game['$']) { 621 | console.log(game['$'], i) 622 | } 623 | else { 624 | console.log(game, i) 625 | } 626 | return; 627 | } 628 | 629 | // Choose which entry to use. 630 | var final = null 631 | if (finalPrimary) { 632 | final = finalPrimary 633 | } 634 | else if (finalBin) { 635 | final = finalBin 636 | } 637 | else if (finalIso) { 638 | final = finalIso 639 | } 640 | else if (finalImg) { 641 | final = finalImg 642 | } 643 | else if (finalEntry) { 644 | final = finalEntry 645 | } 646 | if (final) { 647 | final.title = title 648 | if (game.serial) { 649 | final.serial = game.serial[0] 650 | } 651 | if (final.crc) { 652 | out[final.crc] = final 653 | } 654 | else if (final.status == 'nodump') { 655 | // Nothing. 656 | console.log("No dump for " + final.title) 657 | } 658 | else { 659 | console.log("Couldn't find key for....") 660 | console.log(final) 661 | //process.exit() 662 | } 663 | } 664 | }) 665 | return out 666 | } 667 | 668 | function cueDataTracks(filepath) { 669 | var data 670 | try { 671 | data = fs.readFileSync(filepath, {encoding: 'utf8'}) 672 | } catch (err) { 673 | return [] 674 | } 675 | 676 | var fileStmt = /^\s*FILE\s+"([^"]+)"\s+(.*)$/ 677 | var trackStmt = /^\s*TRACK\s+(\d+)\s+(.*)$/ 678 | 679 | var tracks = [] 680 | var lastFile = null 681 | 682 | lines = data.split(/\r?\n/) 683 | for (var line in lines) { 684 | line = lines[line] 685 | var match 686 | match = line.match(fileStmt) 687 | if (match) { 688 | lastFile = match[1] 689 | continue 690 | } 691 | match = line.match(trackStmt) 692 | if (match && lastFile != null && match[2] != "AUDIO") { 693 | tracks.push(lastFile) 694 | } 695 | } 696 | 697 | return tracks 698 | } 699 | 700 | function gdiDataTracks(filepath) { 701 | var data 702 | try { 703 | data = fs.readFileSync(filepath, {encoding: 'utf8'}) 704 | } catch (err) { 705 | return [] 706 | } 707 | 708 | var stmt = /^\s*\d+\s+\d+\s+(\d+)\s+(\d+)\s+"([^"]+)"\s+\d+$/ 709 | 710 | var tracks = [] 711 | 712 | lines = data.split(/\r?\n/) 713 | for (var line in lines) { 714 | if (line == 0) { 715 | continue 716 | } 717 | line = lines[line] 718 | var match 719 | match = line.match(stmt) 720 | if (match && !(match[1] == 0 && match[2] == 2352)) { 721 | tracks.push(match[3]) 722 | } 723 | } 724 | 725 | return tracks 726 | } 727 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "libretro-dats", 3 | "version": "2023.9.9", 4 | "private": true, 5 | "description": "Assembled from Redump, Trurip, TOSEC, Darkwater and AdvanceSCENE, for libretro-database.", 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "node ." 9 | }, 10 | "author": "Rob Loach (http://robloach.net)", 11 | "license": "MIT", 12 | "homepage": "http://github.com/robloach/libretro-dats", 13 | "dependencies": { 14 | "async": "^3.2.4", 15 | "async-get-file": "^1.0.4", 16 | "dateformat": "^4", 17 | "download": "^8.0.0", 18 | "extract-zip": "^2.0.1", 19 | "mkdirp": "^3.0.1", 20 | "multi-glob": "^1.0.2", 21 | "puppeteer": "^23.4.1", 22 | "replace-string": "^3.0.0", 23 | "request": "^2.88.2", 24 | "sanitize-filename": "^1.6.3", 25 | "sort-keys": "^4.2", 26 | "unidecode": "^0.1.8", 27 | "xml2js": "^0.6.2" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /static/English Translation ROMs/README.md: -------------------------------------------------------------------------------- 1 | This is from the "English Translation ROMs Collection". 2 | -------------------------------------------------------------------------------- /static/Headered/Nintendo - Family Computer Disk System [Headered] (20180610-093800).dat: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | Nintendo - Family Computer Disk System [Headered] 6 | Nintendo - Family Computer Disk System [Headered] 7 | 20180610-093800 8 | 6/22/2018 9 | Naen 10 |
11 | 12 | Adian no Tsue (Japan) (Beta) 13 | 14 | 15 | 16 | Ai Senshi Nicol (Japan) 17 | 18 | 19 | 20 | Nazo no Kabe - Block Kuzushi (Japan) 21 | 22 | 23 | 24 | Apple Town Monogatari - Little Computer People (Japan) 25 | 26 | 27 | 28 | Backgammon (Japan) 29 | 30 | 31 | 32 | Big Challenge! Juudou Senshuken (Japan) 33 | 34 | 35 | 36 | Bio Miracle Bokutte Upa (Japan) 37 | 38 | 39 | 40 | Bishoujo Sexy Puzzle (Japan) (Unl) 41 | 42 | 43 | 44 | Bodycon Quest I - Abakareshi Musume Tachi (Japan) (Disk 1) (Unl) 45 | 46 | 47 | 48 | Dead Zone (Japan) 49 | 50 | 51 | 52 | Donkey Kong Jr. (Japan) (Disk Writer) 53 | 54 | 55 | 56 | Dr. Chaos - Jigoku no Tobira (Japan) 57 | 58 | 59 | 60 | Famicom Mukashibanashi - Shin Onigashima - Zenpen (Japan) (DV 2) 61 | 62 | 63 | 64 | Famicom Tantei Club - Kieta Koukeisha - Zenpen (Japan) 65 | 66 | 67 | 68 | Fruits Mahjong 2 - Disk 2 - Yonin to Dai H Taikai (Japan) (Unl) 69 | 70 | 71 | 72 | Fruits Mahjong 3 - Disk 2 - Tottemo H na Gogo (Japan) (Unl) 73 | 74 | 75 | 76 | Gall Force - Eternal Story (Japan) 77 | 78 | 79 | 80 | Golf - Japan Course (Japan) (DV 0) 81 | 82 | 83 | 84 | Golf - Japan Course (Japan) (DV 2) 85 | 86 | 87 | 88 | Green Beret (Japan) 89 | 90 | 91 | 92 | Ice Climber (Japan) (Disk Writer) 93 | 94 | 95 | 96 | Kaettekita Mario Brothers (Japan) (Disk Writer) 97 | 98 | 99 | 100 | Kalin no Tsurugi (Japan) 101 | 102 | 103 | 104 | Kinnikuman - Kinnikusei Oui Soudatsusen (Japan) 105 | 106 | 107 | 108 | Konamic Ice Hockey (Japan) 109 | 110 | 111 | 112 | Yuushi no Monshou - Deep Dungeon (Japan) (Rev 1) (Disk Writer) 113 | 114 | 115 | 116 | Monty on the Run - Monty no Doki Doki Dai Dassou (Japan) 117 | 118 | 119 | 120 | Omoikkiri Tanteidan HaadoGumi - Matenrou no Chousenjou (Japan) 121 | 122 | 123 | 124 | Pinball (Japan) (Disk Writer) 125 | 126 | 127 | 128 | Pulsar no Hikari - Space Wars Simulation (Japan) 129 | 130 | 131 | 132 | Quick Hunter - Parameter Disk Vol.1 (Japan) (Unl) 133 | 134 | 135 | 136 | SD Gundam World - Gachapon Senshi - Scramble Wars (Japan) (Disk Writer) 137 | 138 | 139 | 140 | Super Mario Brothers (Japan) 141 | 142 | 143 | 144 | Super Mario Brothers 2 (Japan) (DV 2) 145 | 146 | 147 | 148 | Tennis (Japan) 149 | 150 | 151 | 152 | Tenshi Tachi no Houkago (Japan) (Disk 2) (Unl) 153 | 154 | 155 | 156 | Ultraman 2 - Shutsugeki Katoku Tai (Japan) 157 | 158 | 159 | 160 | Akumajou Dracula (Japan) (Rev 1) 161 | 162 | 163 | 164 | Akumajou Dracula (Japan) 165 | 166 | 167 | 168 | Hikari Shinwa - Palthena no Kagami (Japan) 169 | 170 | 171 | 172 | Zelda no Densetsu - The Hyrule Fantasy (Japan) (Beta) 173 | 174 | 175 | 176 | Zelda no Densetsu - The Hyrule Fantasy (Japan) (Nintendo Classic Mini Family Computer) 177 | 178 | 179 | 180 | Aki to Tsukasa no Fushigi no Kabe (Japan) (Unl) 181 | 182 | 183 | 184 | Akumajou Dracula (Japan) (Rev 2) (Disk Writer) 185 | 186 | 187 | 188 | Baseball (Japan) 189 | 190 | 191 | 192 | Big Challenge! Gun Fighter (Japan) 193 | 194 | 195 | 196 | Bishoujo Alien Battle (Japan) (Unl) 197 | 198 | 199 | 200 | Bishoujo Mahjong Club (Japan) (Unl) 201 | 202 | 203 | 204 | Bishoujo Sexy Derby (Japan) (Unl) 205 | 206 | 207 | 208 | BurgerTime (Japan) (Disk Writer) 209 | 210 | 211 | 212 | Esper Dream (Japan) 213 | 214 | 215 | 216 | Cocona World (Japan) 217 | 218 | 219 | 220 | Comic Sakka Series Touma Senki #2 - Mermaid no Gyakushuu (Japan) (Unl) 221 | 222 | 223 | 224 | Date de Blackjack (Japan) (Unl) 225 | 226 | 227 | 228 | Dig Dug II (Japan) (Disk Writer) 229 | 230 | 231 | 232 | Dirty Pair - Project Eden (Japan) 233 | 234 | 235 | 236 | Disk Hacker - Version 1.0 (Japan) (Unl) 237 | 238 | 239 | 240 | Disk Hacker - Version 1.2 (Japan) (Unl) 241 | 242 | 243 | 244 | Druid - Kyoufu no Tobira (Japan) 245 | 246 | 247 | 248 | Konamic Tennis (Japan) 249 | 250 | 251 | 252 | Famicom Grand Prix II - 3D Hot Rally (Japan) (DV 8) (Disk Writer) 253 | 254 | 255 | 256 | Famicom Mukashibanashi - Shin Onigashima - Zenpen (Japan) (DV 1) 257 | 258 | 259 | 260 | Famicom Mukashibanashi - Yuuyuuki - Zenpen (Japan) 261 | 262 | 263 | 264 | Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo - Kouhen (Japan) 265 | 266 | 267 | 268 | Famimaga Disk Vol. 2 - Panic Space (Japan) (Disk Writer) 269 | 270 | 271 | 272 | Fire Bam (Japan) 273 | 274 | 275 | 276 | Fruits Mahjong 1 - Disk 1 - Mahjong Game Hontai (Japan) (Unl) 277 | 278 | 279 | 280 | Lutter (Japan) (Disk Writer) 281 | 282 | 283 | 284 | Fruits Mahjong 2 - Disk 1 - Tokimeki Gals (Japan) (Unl) 285 | 286 | 287 | 288 | Galaga (Japan) (Disk Writer) 289 | 290 | 291 | 292 | Goonies (Japan) (Disk Writer) 293 | 294 | 295 | 296 | Graphic Editor Hokusai - Ver 1.2 (Japan) (Unl) 297 | 298 | 299 | 300 | Gun.Smoke (Japan) 301 | 302 | 303 | 304 | Gyruss (Japan) 305 | 306 | 307 | 308 | Halley Wars (Japan) 309 | 310 | 311 | 312 | Hayama Reiko no Date de Blackjack (Japan) (Unl) 313 | 314 | 315 | 316 | Idol Hotline - Nakayama Miho no Tokimeki High School (Japan) (DV 4) 317 | 318 | 319 | 320 | Relics - Ankoku Yousai (Japan) 321 | 322 | 323 | 324 | Idol Hotline - Nakayama Miho no Tokimeki High School (Japan) (DV 10) 325 | 326 | 327 | 328 | Igo - Kyuu Roban Taikyoku (Japan) 329 | 330 | 331 | 332 | Kattobi! Douji (Japan) 333 | 334 | 335 | 336 | Kieta Princess (Japan) 337 | 338 | 339 | 340 | Link no Bouken - The Legend of Zelda 2 (Japan) 341 | 342 | 343 | 344 | Mahjong Goraku - Bishoujo Meijinsen (Japan) (Unl) 345 | 346 | 347 | 348 | Meikyuu Jiin Dababa (Japan) 349 | 350 | 351 | 352 | Michael English Daibouken (Japan) (Sample) 353 | 354 | 355 | 356 | Moonball Magic (Japan) (Disk Writer) 357 | 358 | 359 | 360 | Nazo no Murasamejou (Japan) 361 | 362 | 363 | 364 | Nazoler Land - Dai 2 Gou (Japan) 365 | 366 | 367 | 368 | Nazoler Land - Soukan Gou (Japan) 369 | 370 | 371 | 372 | Pro Wres (Japan) 373 | 374 | 375 | 376 | Sailor Fuku Bishoujo Zukan Vol. 3 (Japan) (Unl) 377 | 378 | 379 | 380 | Samurai Sword (Japan) 381 | 382 | 383 | 384 | Sexy Invaders (Japan) (Unl) 385 | 386 | 387 | 388 | Soccer (Japan) 389 | 390 | 391 | 392 | Solomon no Kagi (Japan) (Disk Writer) 393 | 394 | 395 | 396 | Super Boy Allan (Japan) 397 | 398 | 399 | 400 | Super Lode Runner (Japan) 401 | 402 | 403 | 404 | Tanigawa Kouji no Shougi Shinan II - Meijin e no Michi - Shinban Tsumeshougi - Tsugi no Itte (Japan) (Disk Writer) 405 | 406 | 407 | 408 | Titanic Mystery - Ao no Senritsu (Japan) 409 | 410 | 411 | 412 | Ultraman Club - Chikyuu Dakkan Sakusen (Japan) (Rev 1) 413 | 414 | 415 | 416 | Vs. Excitebike (Japan) 417 | 418 | 419 | 420 | Xevious (Japan) (Disk Writer) 421 | 422 | 423 | 424 | Yakyuuken Part II - Gal's Dungeon (Japan) (Unl) 425 | 426 | 427 | 428 | Youkai Yashiki (Japan) 429 | 430 | 431 | 432 | Yume Koujou Doki Doki Panic (Japan) (DV 2) 433 | 434 | 435 | 436 | Zanac (Japan) 437 | 438 | 439 | 440 | 19 - Neunzehn (Japan) 441 | 442 | 443 | 444 | Bubble Bobble (Japan) 445 | 446 | 447 | 448 | Adian no Tsue (Japan) 449 | 450 | 451 | 452 | Big Challenge! Go! Go! Bowling (Japan) 453 | 454 | 455 | 456 | Bishoujo Kachinuki Renju - Gomoku Narabe (Japan) (Unl) 457 | 458 | 459 | 460 | Bishoujo Shashinkan - Moving School (Japan) (Unl) 461 | 462 | 463 | 464 | Topple Zip (Japan) 465 | 466 | 467 | 468 | Chitei Tairiku Ordola (Japan) 469 | 470 | 471 | 472 | Comic Sakka Series Touma Senki #3 - Ryuujin Sensei Kikiippatsu (Japan) (Unl) 473 | 474 | 475 | 476 | Dead Zone (Japan) (Beta) 477 | 478 | 479 | 480 | Dirty Pair - Project Eden (Japan) (Rev 1) (Disk Writer) 481 | 482 | 483 | 484 | Donkey Kong (Japan) (Disk Writer) 485 | 486 | 487 | 488 | Egger Land - Souzou e no Tabidachi (Japan) (Disk Writer) 489 | 490 | 491 | 492 | Emi-chan no Moero Yakyuuken! (Japan) (Unl) 493 | 494 | 495 | 496 | Exciting Soccer - Konami Cup (Japan) 497 | 498 | 499 | 500 | Famicom Grand Prix - F1 Race (Japan) 501 | 502 | 503 | 504 | Famicom Grand Prix II - 3D Hot Rally (Japan) (DV 7) 505 | 506 | 507 | 508 | Famimaga Disk Vol. 3 - All 1 (Japan) (Disk Writer) 509 | 510 | 511 | 512 | Fuuun Shourin Ken (Japan) 513 | 514 | 515 | 516 | Galaxian (Japan) (Disk Writer) 517 | 518 | 519 | 520 | Game no Tatsujin - Money Wars (Japan) (Unl) 521 | 522 | 523 | 524 | German Tanteidan MarinGumi - Maruhi Jigomar Sousa File (Japan) 525 | 526 | 527 | 528 | Golf - US Course (Japan) (DV 0) 529 | 530 | 531 | 532 | Hao-kun no Fushigi na Tabi (Japan) 533 | 534 | 535 | 536 | Hikari Shinwa - Palthena no Kagami (Japan) (Rev 1) 537 | 538 | 539 | 540 | Hikaru Genji - Roller Panic (Japan) 541 | 542 | 543 | 544 | Ice Hockey (Japan) 545 | 546 | 547 | 548 | Kick and Run (Japan) 549 | 550 | 551 | 552 | Kind Gal's (Japan) (Disk 2) (Unl) 553 | 554 | 555 | 556 | Knight Lore - Majou no Ookami Otoko (Japan) 557 | 558 | 559 | 560 | Madou Senki - Deep Dungeon (Japan) (Rev 1) 561 | 562 | 563 | 564 | Metroid (Japan) (Rev 1) 565 | 566 | 567 | 568 | Michael English Daibouken (Japan) 569 | 570 | 571 | 572 | Moero TwinBee - Cinnamon Hakase wo Sukue! (Japan) (Rev 1) 573 | 574 | 575 | 576 | Namida no Soukoban Special (Japan) 577 | 578 | 579 | 580 | Pachinko Grand Prix (Japan) 581 | 582 | 583 | 584 | Otocky (Japan) 585 | 586 | 587 | 588 | Sailor Fuku Bishoujo Zukan Vol. 5 (Japan) (Unl) 589 | 590 | 591 | 592 | Sexy Yakyuuken Adventure II - Gal's Dungeon Part II (Japan) (Unl) 593 | 594 | 595 | 596 | Suishou no Dragon (Japan) 597 | 598 | 599 | 600 | Super Mario Brothers 2 (Japan) (DV 0) 601 | 602 | 603 | 604 | Tantei Jinguuji Saburou - Kiken na Futari - Kouhen (Japan) 605 | 606 | 607 | 608 | Yuushi no Monshou - Deep Dungeon (Japan) 609 | 610 | 611 | 612 | Ultraman Club - Chikyuu Dakkan Sakusen (Japan) 613 | 614 | 615 | 616 | Wardner no Mori (Japan) 617 | 618 | 619 | 620 | Winter Games (Japan) 621 | 622 | 623 | 624 | Yuu Maze (Japan) 625 | 626 | 627 | 628 | Zatsugaku Olympic Quiz - Watanabe Wataru Hen (Japan) (Unl) 629 | 630 | 631 | 632 | Cleopatra no Mahou (Japan) 633 | 634 | 635 | 636 | Monitor Puzzle Kinetic Connection, The - Kineco II (Japan) (Disk Writer) 637 | 638 | 639 | 640 | Breeder (Japan) 641 | 642 | 643 | 644 | Armana no Kiseki (Japan) 645 | 646 | 647 | 648 | Bakutoushi Patton-kun (Japan) 649 | 650 | 651 | 652 | Disk Hacker - Version 1.3 (Japan) (Unl) 653 | 654 | 655 | 656 | Disk Hacker II - Copy Plus 3 (Japan) (Unl) 657 | 658 | 659 | 660 | Egger Land (Japan) 661 | 662 | 663 | 664 | Famicom Mukashibanashi - Yuuyuuki - Kouhen (Japan) 665 | 666 | 667 | 668 | Famimaga Disk Vol. 1 - Hong Kong (Japan) 669 | 670 | 671 | 672 | Fruits Mahjong 4 - Disk 1 - Bishoujo Connection (Japan) (Unl) 673 | 674 | 675 | 676 | Gokuraku Yuugi - Game Tengoku (Japan) 677 | 678 | 679 | 680 | Golf (Japan) 681 | 682 | 683 | 684 | Metroid (Japan) (Rev 3) 685 | 686 | 687 | 688 | Section-Z (Japan) 689 | 690 | 691 | 692 | Knight Move (Japan) (Rev 1) (Disk Writer) 693 | 694 | 695 | 696 | Koneko Monogatari - The Adventures of Chatran (Japan) (Sample) 697 | 698 | 699 | 700 | Koneko Monogatari - The Adventures of Chatran (Japan) 701 | 702 | 703 | 704 | Lipstick #2 - Joshi Gakusei Hen (Japan) (Unl) 705 | 706 | 707 | 708 | Lipstick #4 - Hakui no Tenshi Hen (Japan) (Unl) 709 | 710 | 711 | 712 | Magma Project - Hacker (Japan) 713 | 714 | 715 | 716 | Nankin no Adventure (Japan) 717 | 718 | 719 | 720 | Pachicom (Japan) (Disk Writer) 721 | 722 | 723 | 724 | Putt Putt Golf (Japan) 725 | 726 | 727 | 728 | Sailor Fuku Bishoujo Zukan Vol. 1 (Japan) (Unl) 729 | 730 | 731 | 732 | Sailor Fuku Bishoujo Zukan Vol. 2 (Japan) (Unl) 733 | 734 | 735 | 736 | Sailor Fuku Bishoujo Zukan Vol. 6 (Japan) (Unl) 737 | 738 | 739 | 740 | Santa Claus no Takarabako (Japan) 741 | 742 | 743 | 744 | Shanghai II (Japan) (Proto) (Dragon Layout) 745 | 746 | 747 | 748 | Souseiki Fammy - ROM-QD for 256K+64K (Japan) (Unl) 749 | 750 | 751 | 752 | Tanigawa Kouji no Shougi Shinan II - Meijin e no Michi (Japan) 753 | 754 | 755 | 756 | Transformers - The Headmasters (Japan) 757 | 758 | 759 | 760 | Tantei Jinguuji Saburou - Shinjuku Chuuou Kouen Satsujin Jiken (Japan) 761 | 762 | 763 | 764 | Tenshi Tachi no Houkago (Japan) (Disk 1) (Unl) 765 | 766 | 767 | 768 | Wrecking Crew (Japan) (Disk Writer) 769 | 770 | 771 | 772 | Yume Koujou Doki Doki Panic (Japan) (DV 1) 773 | 774 | 775 | 776 | Casino de Pink (Japan) (Unl) 777 | 778 | 779 | 780 | SD Gundam World - Gachapon Senshi - Scramble Wars (Japan) (Rev 1) 781 | 782 | 783 | 784 | SD Gundam World - Gachapon Senshi - Scramble Wars (Japan) 785 | 786 | 787 | 788 | Zelda no Densetsu - The Hyrule Fantasy (Japan) 789 | 790 | 791 | 792 | Big Challenge! Dogfight Spirit (Japan) 793 | 794 | 795 | 796 | Bishoujo Alien Battle (Japan) (Alt 1) (Unl) 797 | 798 | 799 | 800 | Bishoujo Hanafuda Club Vol.1 - Oichokabu Hen (Japan) (Unl) 801 | 802 | 803 | 804 | Bishoujo Shashinkan - Studio Cut (Japan) (Unl) 805 | 806 | 807 | 808 | Bodycon Quest I - Abakareshi Musume Tachi (Japan) (Disk 2) (Unl) 809 | 810 | 811 | 812 | Fairytale (Japan) 813 | 814 | 815 | 816 | Clu Clu Land (Japan) (Disk Writer) 817 | 818 | 819 | 820 | Doremikko (Japan) 821 | 822 | 823 | 824 | Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo - Zenpen (Japan) 825 | 826 | 827 | 828 | Final Command - Akai Yousai (Japan) 829 | 830 | 831 | 832 | Fire Rock (Japan) 833 | 834 | 835 | 836 | Golf - Japan Course (Japan) (Prize Card) 837 | 838 | 839 | 840 | Golf - Special Course (Japan) (Prize Card) 841 | 842 | 843 | 844 | I Am a Teacher - Teami no Kiso (Japan) 845 | 846 | 847 | 848 | Silviana - Ai Ippai no Little Angel (Japan) 849 | 850 | 851 | 852 | Jikai Shounen Met Mag (Japan) 853 | 854 | 855 | 856 | Karate Champ (Japan) 857 | 858 | 859 | 860 | Kick Challenger - Air Foot - Yasai no Kuni no Ashi Senshi (Japan) 861 | 862 | 863 | 864 | Kikikai-kai - Dotou Hen (Japan) (Rev 1) (Disk Writer) 865 | 866 | 867 | 868 | Kikikai-kai - Dotou Hen (Japan) 869 | 870 | 871 | 872 | Kinnikuman - Kinnikusei Oui Soudatsusen (Japan) (Rev 1) (Disk Writer) 873 | 874 | 875 | 876 | Kobayashi Hitomi Shocking Tennis (Japan) (Unl) 877 | 878 | 879 | 880 | Link no Bouken - The Legend of Zelda 2 (Japan) (Rev 1) 881 | 882 | 883 | 884 | Lipstick #3 - OL Hen (Japan) (Unl) 885 | 886 | 887 | 888 | Maerchen Veil (Japan) 889 | 890 | 891 | 892 | Moero TwinBee - Cinnamon Hakase wo Sukue! (Japan) 893 | 894 | 895 | 896 | Monitor Puzzle Kinetic Connection, The - Kineco (Japan) 897 | 898 | 899 | 900 | Nazoler Land - Dai 3 Gou (Japan) 901 | 902 | 903 | 904 | Othello (Japan) (DV 2) 905 | 906 | 907 | 908 | Professional Mahjong Gokuu (Japan) 909 | 910 | 911 | 912 | Replicart (Japan) 913 | 914 | 915 | 916 | Roger Rabbit (Japan) 917 | 918 | 919 | 920 | Tama & Friends - 3 Choume Daibouken (Japan) 921 | 922 | 923 | 924 | Time Twist - Rekishi no Katasumi de... - Kouhen (Japan) 925 | 926 | 927 | 928 | [BIOS] Family Computer Disk System (Japan) 929 | 930 | 931 | 932 | TwinBee (Japan) (Disk Writer) 933 | 934 | 935 | 936 | Volleyball (Japan) 937 | 938 | 939 | 940 | Wakusei Aton Gaiden (Japan) (National Tax Agency Demo) 941 | 942 | 943 | 944 | Aliens - Alien 2 (Japan) (Proto) 945 | 946 | 947 | 948 | I Am a Teacher - Super Mario no Sweater (Japan) 949 | 950 | 951 | 952 | Zatsugaku Olympic Quiz Part II (Japan) (Unl) 953 | 954 | 955 | 956 | Zelda no Densetsu - The Hyrule Fantasy (Japan) (Rev 1) 957 | 958 | 959 | 960 | Dandy - Zeuon no Fukkatsu (Japan) 961 | 962 | 963 | 964 | Air Fortress (Japan) (Proto) 965 | 966 | 967 | 968 | Akuu Senki Raijin (Japan) (Disk Writer) 969 | 970 | 971 | 972 | All Night Nippon Super Mario Brothers (Japan) (Promotion Card) 973 | 974 | 975 | 976 | Bishoujo Control (Japan) (Unl) 977 | 978 | 979 | 980 | Bishoujo Sexy Slot (Japan) (Unl) 981 | 982 | 983 | 984 | Comic Sakka Series Touma Senki #1 - Mashoujo Gakuen Evil (Japan) (Unl) 985 | 986 | 987 | 988 | Dig Dug (Japan) (Disk Writer) 989 | 990 | 991 | 992 | Electrician (Japan) 993 | 994 | 995 | 996 | Famimaga Disk Vol. 4 - Clox (Japan) (Disk Writer) 997 | 998 | 999 | 1000 | FMC Disk Card Checker Ver 1.3 (Japan) (Rev 2) (Developer Card) 1001 | 1002 | 1003 | 1004 | Fruits Mahjong 3 - Disk 1 - Yonin no Tenshi Tachi (Japan) (Unl) 1005 | 1006 | 1007 | 1008 | Fruits Mahjong 4 - Disk 2 - Daitan H na Hirusagari (Japan) (Unl) 1009 | 1010 | 1011 | 1012 | Fuuun Shourin Ken - Ankoku no Maou (Japan) 1013 | 1014 | 1015 | 1016 | Ginga Denshou - Galaxy Odyssey (Japan) 1017 | 1018 | 1019 | 1020 | Golf (Japan) (Rev 1) 1021 | 1022 | 1023 | 1024 | Golf, The - Bishoujo Classic (Japan) (Unl) 1025 | 1026 | 1027 | 1028 | Ishidou (Japan) (Disk Writer) 1029 | 1030 | 1031 | 1032 | Jingorou (Japan) (Unl) 1033 | 1034 | 1035 | 1036 | Kind Gal's (Japan) (Disk 1) (Unl) 1037 | 1038 | 1039 | 1040 | Kobayashi Hitomi no Hold Up (Japan) (Unl) 1041 | 1042 | 1043 | 1044 | Lipstick #5 - Stewardess Hen (Japan) (Unl) 1045 | 1046 | 1047 | 1048 | Madou Senki - Deep Dungeon (Japan) 1049 | 1050 | 1051 | 1052 | Mahjong (Japan) 1053 | 1054 | 1055 | 1056 | Othello (Japan) (DV 5) (Disk Writer) 1057 | 1058 | 1059 | 1060 | Tantei Jinguuji Saburou - Kiken na Futari - Zenpen (Japan) 1061 | 1062 | 1063 | 1064 | Puzzle Boys (Japan) (Disk Writer) 1065 | 1066 | 1067 | 1068 | Radical Bomber!! Jirai-kun (Japan) 1069 | 1070 | 1071 | 1072 | Risa no Yousei Densetsu (Japan) 1073 | 1074 | 1075 | 1076 | Sailor Fuku Bishoujo Zukan Vol. 4 (Japan) (Unl) 1077 | 1078 | 1079 | 1080 | SD Gundam World - Gachapon Senshi - Scramble Wars - Map Collection (Japan) (Disk Writer) 1081 | 1082 | 1083 | 1084 | Seiken Psychocalibur - Majuu no Mori Densetsu (Japan) 1085 | 1086 | 1087 | 1088 | Shanghai (Japan) (Proto) 1089 | 1090 | 1091 | 1092 | Smash Ping Pong (Japan) 1093 | 1094 | 1095 | 1096 | Super Lode Runner II (Japan) (Disk Writer) 1097 | 1098 | 1099 | 1100 | Tarot Uranai (Japan) 1101 | 1102 | 1103 | 1104 | Tobidase Daisakusen (Japan) 1105 | 1106 | 1107 | 1108 | Tonkachi Editor (Japan) (Unl) 1109 | 1110 | 1111 | 1112 | Tooyama no Kinsan Space Chou - Mr. Gold (Japan) 1113 | 1114 | 1115 | 1116 | Idol Hotline - Nakayama Miho no Tokimeki High School (Japan) (DV 6) 1117 | 1118 | 1119 | 1120 | Tantei Jinguuji Saburou - Shinjuku Chuuou Kouen Satsujin Jiken (Japan) (Rev 1) (Disk Writer) 1121 | 1122 | 1123 | 1124 | Time Twist - Rekishi no Katasumi de... - Zenpen (Japan) 1125 | 1126 | 1127 | 1128 | Exciting Billiard (Japan) 1129 | 1130 | 1131 | 1132 | Golf - US Course (Japan) (DV 1) 1133 | 1134 | 1135 | 1136 | Comic Sakka Series Touma Senki #4 - Tenkuu Ryuumaou Fukkatsu (Japan) (Unl) 1137 | 1138 | 1139 | 1140 | Pac-Man (Japan) (Disk Writer) 1141 | 1142 | 1143 | 1144 | Kamen Rider Black - Taiketsu Shadow Moon (Japan) 1145 | 1146 | 1147 | 1148 | Bomber Man (Japan) (Disk Writer) 1149 | 1150 | 1151 | 1152 | Famimaga Disk Vol. 6 - Janken Disk Jou (Japan) (Disk Writer) 1153 | 1154 | 1155 | 1156 | Knight Move (Japan) 1157 | 1158 | 1159 | 1160 | Ultraman - Kaijuu Teikoku no Gyakushuu (Japan) (Disk Writer) 1161 | 1162 | 1163 | 1164 | [BIOS] Twin Famicom (Japan) 1165 | 1166 | 1167 | 1168 | Esper Dream (Japan) (Rev 1) 1169 | 1170 | 1171 | 1172 | Aspic - Majaou no Noroi (Japan) 1173 | 1174 | 1175 | 1176 | Golf - US Course (Japan) (DV 2) (Disk Writer) 1177 | 1178 | 1179 | 1180 | Famicom Mukashibanashi - Shin Onigashima - Kouhen (Japan) 1181 | 1182 | 1183 | 1184 | Comic Sakka Series Touma Senki #5 - Youjuu Rudo no Chousen (Japan) (Unl) 1185 | 1186 | 1187 | 1188 | Famicom Grand Prix II - 3D Hot Rally (Japan) (DV 5) 1189 | 1190 | 1191 | 1192 | Family Composer (Japan) 1193 | 1194 | 1195 | 1196 | Lipstick #1 - Lolita Hen (Japan) (Unl) 1197 | 1198 | 1199 | 1200 | Disk Keeper (Japan) (Unl) 1201 | 1202 | 1203 | 1204 | Matou no Houkai - The Hero of Babel (Japan) 1205 | 1206 | 1207 | 1208 | Fairy Pinball - Yousei Tachi no Pinball (Japan) (Unl) 1209 | 1210 | 1211 | 1212 | Shanghai II (Japan) (Proto) (Scorpion Layout) 1213 | 1214 | 1215 | 1216 | Quick Hunter (Japan) (Unl) 1217 | 1218 | 1219 | 1220 | Bishoujo Hanafuda Club Vol.2 - Koikoi Bakappana Hen (Japan) (Unl) 1221 | 1222 | 1223 | 1224 | Exciting Baseball (Japan) 1225 | 1226 | 1227 | 1228 | Pro Golfer Saru - Kage no Tournament (Japan) 1229 | 1230 | 1231 | 1232 | Fairy Pinball - Yousei Tachi no Pinball (Japan) (Alt 1) (Unl) 1233 | 1234 | 1235 | 1236 | Kosodate Gokko (Japan) (Unl) 1237 | 1238 | 1239 | 1240 | Famicom Tantei Club - Kieta Koukeisha - Kouhen (Japan) 1241 | 1242 | 1243 | 1244 | Famimaga Disk Vol. 5 - Puyo Puyo (Japan) (Disk Writer) 1245 | 1246 | 1247 | 1248 | Ultraman - Kaijuu Teikoku no Gyakushuu (Japan) [b] 1249 | 1250 | 1251 | 1252 | Exciting Basket (Japan) 1253 | 1254 | 1255 | 1256 | Metroid (Japan) (Rev 2) 1257 | 1258 | 1259 | 1260 | Dracula II - Noroi no Fuuin (Japan) 1261 | 1262 | 1263 | 1264 | Mahjong Kazoku (Japan) 1265 | 1266 | 1267 | 1268 | [BIOS] Family Computer Disk System (Japan) (Rev 1) 1269 | 1270 | 1271 | 1272 | Reflect World (Japan) 1273 | 1274 | 1275 | 1276 | Falsion (Japan) 1277 | 1278 | 1279 | 1280 | Fruits Mahjong 1 - Disk 2 - Dai H Taikai (Japan) (Unl) [b] 1281 | 1282 | 1283 | 1284 | Nazoler Land Special!! - Quiz Ou wo Sagase (Japan) 1285 | 1286 | 1287 | 1288 | Patlabor - The Mobile Police - Dai 2 Shoutai Shutsudou Seyo! (Japan) 1289 | 1290 | 1291 |
1292 | --------------------------------------------------------------------------------