From be19bb6e679cd76d32f9b0382c08052ba1e68944 Mon Sep 17 00:00:00 2001 From: Rikard Bengtsson Date: Sun, 1 Oct 2023 01:19:05 +0200 Subject: [PATCH] Autodetect settings by ID Settings are saved in the database text files as usual, but you can match by both MD5 (first 4096), MD5 (full) as well as ID + region + revision. --- N64-database.txt | 591 ++++++++++++++++++++++++++++++++++++++++++++ support/n64/n64.cpp | 341 ++++++++++++++----------- 2 files changed, 788 insertions(+), 144 deletions(-) create mode 100644 N64-database.txt diff --git a/N64-database.txt b/N64-database.txt new file mode 100644 index 0000000..bdf4e4a --- /dev/null +++ b/N64-database.txt @@ -0,0 +1,591 @@ +# MD5 checksums +9f8baba5c495a9f7b6dcbc3408a73b47 ntsc|cic5167|rpak # Kyojin no Doshin: Kaihou Sensen Chibikko Chikko Daishuugou +c3dab980b1ed28f98b8a5de0d2e654d5 ntsc|cic5167|rpak|tpak # Kyojin no Doshin 1 +f9aa89a81a34262df3695f092b9eca23 ntsc|cic5167|rpak|tpak # Kyojin no Doshin 1 (Kiosk Demo) +4df8e04babc9fbf9d67b72cc3e952c8a ntsc|cic5167|rpak|tpak # Doshin The Giant 1 Save Fix v1.1 ozidual +ceeecd40d732920a54d984c801cd0a7d ntsc|cic5167|rpak|tpak # Japan Pro Golf Tour 64 Zoinkity +4e2883582336704946a932d92b4d38ba ntsc|cic5167|rpak|tpak # Mario Artist: Communication Kit +d93786dc42c8aee0e87c7edf5b13825d ntsc|cic5167|rpak|tpak # Mario Artist Paint Studio v2.1 LuigiBlood +1ec5a61fec93dafc8c778a892f673ec7 ntsc|cic5167|tpak # Mario Artist: Paint Studio +fc0567621d5780172471a9b51f06492e ntsc|cic5167|rpak|tpak # Mario Artist Polygon Studio v3 LuigiBlood +92e5dad9ded5b0b5597b441e3deed824 ntsc|cic5167|rpak|tpak # Mario Artist: Polygon Studio +cd4acef57f60c6df16b74019beebbbf4 ntsc|cic5167|rpak|tpak # Mario Artist Talent Studio v2.1 LuigiBlood +a91aa83cf0ad4d87a17bcf8c52b26e1e ntsc|cic5167|tpak # Mario Artist: Talent Studio +bf3a62a2b10cdb51d11f4d6ae2821a45 ntsc|cic5167|rpak|tpak # Sim City 64 v0.6.38 ozidual +ce5eeb8d265caf02158b8cb2cd395678 ntsc|cic5167|rpak|tpak # Sim City 64 v1.1 Fixed RTC ozidual +553b998b6b41704e2501c58ea44cfb10 ntsc|cic5167|rpak|tpak # Sim City 64 +ee207a2a00807d5d707744f9746ef09c ntsc|cic5101|eeprom512 # Donchan Puzzle Hanabi de Doon! (Aleck64) +d1103bc65cbb0b39eb7b44d15ddf3f93 ntsc|cic5101|eeprom512 # Kuru Kuru Fever (Aleck64) +bbd08208cece16cb79ce35e17223239c ntsc|cic5101|eeprom512 # Star Soldier - Vanishing Earth Arcade (Aleck64) +45d621969ab0c22756bd6f6e34622119 ntsc|cic5101|eeprom512 # Tower&Shaft (Aleck64) +f526f5fcb87a49425ea481dbe4cddea9 ntsc|cic5101|eeprom512 # Vivid Dolls (Aleck64) +b17df851db300b5e022dcdd1f44bc6b4 ntsc|cic6102|rpak # 007 - Goldfinger +ece76545ef6166fc358b723976940496 ntsc|cic6102|rpak # Jet Force Gemini (Kiosk Demo) (Save) +98f8f88ec7473d0c9eb943562c510471 ntsc|cic6102|cpak|rpak # Turok 2 - Seeds of Evil (Kiosk Demo) (Gore On Hack) +48f24bfc6dad044488d13832def2a129 ntsc|cic6102 # 77a by Count0 +4d7cf6a2d2cd1c68809adc117455658a ntsc|cic6102|eeprom2k # 77a Special Edition by Count0 +e3cc7b27dbd77b44370550543be0b19a ntsc|cic6102 # Dexanoid R1 by Protest Design +87e561dbf026663a3fccd0c0d9957d93 ntsc|cic6102 # Puzzle Master 64 by Michael Searl +120134d4066a6828ab628f42cf373b59 ntsc|cic6102|rpak|tpak # Nintendo 64DD IPL (Japan) (v1.0) (Beta) +c9eb0cc708d102f0fa39a4c2526221ff ntsc|cic6102|rpak|tpak # Nintendo 64DD IPL (Japan) (v1.1) (Beta) +f08b3f4a3d0d817d07b12b1a328838d8 ntsc|cic6102|rpak|tpak # 64DD IPL +45aee9ae64d338bc6a106498a5f90f60 ntsc|cic6102|cpak # Aidyn Chronicles - The First Mage (Beta) +06b9992af56c7c71731b6b4285b7302a ntsc|cic6102|cpak # Aidyn Chronicles - The First Mage (Beta) +a10468fa587e42ae87ab4ba57599b835 ntsc|cic6102|flash128k|rpak # StarCraft 64 (Beta) +f13caf119c0ce9e18d0b89889172e3f0 ntsc|cic6102|cpak|rpak # Top Gear Hyper Bike (Beta) +c312f11c7820b77b4283cea212c12f45 pal|cic7101|cpak|rpak # Top Gear Rally 2 (Beta) +b4515d4cb78ad023293e4af5e299da78 pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Beta) +03d67ad8740d56aaed87f99b5d31160f pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Europe) (Beta) +3b58a13798b90e6f575a6beb26b30ccf pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Beta) +a2078ab139fbd1e909e719a7a1c28a19 pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Beta) +7fcd7b02d8fff45d57a949cec0ec3caf ntsc|cic6103|eeprom2k|cpak|rpak # Excitebike 64 (Kiosk Demo) +a43fb11b4dff63f07942cbe304b0e899 ntsc|cic6105|rpak # Jet Force Gemini (Kiosk Demo) +cdf5c8b9c7f0d25d70288078c16d2524 ntsc|cic6105|rpak # Legend of Zelda, The - Majora's Mask - Preview Demo +e8f4d76f55afce0697b51173a9382a37 pal|cic7101|cpak|rpak # Turok 2 - Seeds of Evil (Kiosk Demo) +6b65043e5a394f7c97db83773759ef55 ntsc|cic6102|cpak|rpak # Turok 2 - Seeds of Evil (Kiosk Demo) +75cd95d338f72d7946768c32bc87958d pal|cic7101|cpak|rpak # Carmageddon 64 (Eng-Spa-Fre-Ger) +8f7f717e489f1a087b4a63107957c096 ntsc|cic6102|eeprom512|cpak # Mario Kart 64 (Super W00ting Hack) +a104cbee34d1a6ab7e127b6b27eadf6f pal|cic7101 # Wet Dreams Readme by Immortal +76f40c0b400800f2084d48cb0eb80272 ntsc|cic6102|flash128k|cpak # Derby Stallion 64 (Beta) +f88630ca78e2466fcf78202554a389fd pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Beta) +f243e960436e0211bdf47aa0bc564ad3 pal|cic7101|cpak|rpak # Turok 3 - Shadow of Oblivion (Beta) +41f99942de80d05e3e990fef05dfd8f0 ntsc|cic6102|eeprom512|cpak # 64 de Hakken!! Tamagotchi Minna de Tamagotchi World +93ca3185b7734087ff7edb9e9d8bad26 ntsc|cic6102|eeprom512|cpak|rpak # Airboarder 64 +010f78a515aaa060485246e3711353b7 ntsc|cic6102|eeprom512|cpak|rpak # Airboarder 64 +3d87695dc127b7446d655778a40666a2 ntsc|cic6102|eeprom512|rpak # Wild Choppers +0d5249ebf21cd05a8734a590514425f3 ntsc|cic6102|cpak # Eikou no Saint Andrews +67939e51cdf144a894526e01eb1f23d2 ntsc|cic6102|cpak|rpak # Extreme-G +e41621a8783c05493251469e7a30b033 pal|cic7101|cpak # International Superstar Soccer 64 +d02f4df5c9ba0f5a10a2434af11f5cf1 ntsc|cic6102|rpak|tpak # Japan Pro Golf Tour 64 (64drive 1.12d Compatible V1.0) +80262256f5aa05d48f89c516be16420a ntsc|cic5167|rpak|tpak # Japan Pro Golf Tour 64 +cfe93dea250048880f415fc5bc7188e2 ntsc|cic6105|rpak # Jet Force Gemini (Kiosk Demo) +a7f0268ba5dd49db0117e9c2214d5eb7 ntsc|cic6102|rpak|tpak # Kyojin no Doshin (Demo) (64drive 1.12d Compatible V1.0) +37a73750f84bf5cae0fbec2eba033a26 ntsc|cic6102|rpak|tpak # Kyojin no Doshin (64drive 1.12d Compatible V1.0) +318ecad8366785fbccccae62f1c8bfa2 ntsc|cic6102|rpak|tpak # Kyojin no Doshin - Kaihou Sensen Chibikko Chikko Daishuugou (64drive 1.12d Compatible V1.0) +3e488fe2e3c6f44bb78bd2e359b7f0cc ntsc|cic5101|rpak # Magical Tetris Challenge Featuring Mickey +86482f9e82a1d5600b6481a78dda5141 ntsc|cic6102|rpak|tpak # Mario Artist - Communication Kit (64drive 1.12d Compatible V1.0) +225d974f74402152809b33676c3dc313 ntsc|cic6102|rpak|tpak # Mario Artist - Paint Studio (64drive 1.12d Compatible V1.1) +da36dcff0586350c66d3235b21101fe8 ntsc|cic6102|rpak|tpak # Mario Artist - Paint Studio (64drive 1.12d Compatible V1.1) +e88f66826a444c7dff57f428d27a186f ntsc|cic6102|rpak|tpak # Mario Artist - Polygon Studio (64drive 1.12d Compatible V1.0) +512b2f31df67fe1d7352c3b8d84033f6 ntsc|cic6102|rpak|tpak # Mario Artist - Polygon Studio (64drive 1.12d Compatible V1.1) +b4a720dfc6f6d5b9db7089f71ea7393b ntsc|cic6102|rpak|tpak # Mario Artist - Talent Studio (64drive 1.12d Compatible V1.0) +ba5b40df3dc3742583f4986e287e72ba ntsc|cic6102|rpak|tpak # Mario Artist - Talent Studio (64drive 1.12d Compatible V1.1) +c749f901714fd19d7cf02a9f724ae1b1 pal|cic7101|eeprom512|cpak # Mario Kart 64 (Super W00ting Hack) +082ffe637e1c04d14fe3393156294fbc ntsc|cic8303|rpak|tpak # 64DD IPLROM BIOS (for UltraHLE) +207fdbd1d5b3990a8fe741e1e9e67d84 ntsc|cic6102|rpak|tpak # N64DD IPLROM +b4891d8c08890281c680929f71768fca ntsc|cic8303|rpak|tpak # 64DD IPL +5c6f7f27f5c6e833c03d3d587f3f4c12 ntsc|cic6102|cpak|rpak|tpak # Nushi Tsuri 64 +f1a1452cbfa7bce98c9e72c6e1f70fc8 pal|cic6102|cpak|rpak # Off Road Challenge +3f726c4cc227d70116719d2843bd6bf5 ntsc|cic6102|eeprom512 # Pilotwings 64 +ffcb018cb73cf40bc52db39d113c0ff3 ntsc|cic6102 # 3DS Model Conversion by Snake +0949de363010f42f01ce766f60c0bf0a ntsc|cic6102 # 3DS Model Conversion by Snake +1e93a6d55b8d1b30c67f1fec9c09f25b ntsc|cic6102 # Absolute Crap #2 by Lem +f64eb0451d772a0a806ef038abe35c52 ntsc|cic6102 # Absolute Crap #2 by Lem +9b0175c06a57804c94a500a552698d22 ntsc|cic6102 # Absolute Crap Intro #1 by Kid Stardust +ff1ff9ad4cceed4a22ce21cf338abdbf ntsc|cic6102 # Absolute Crap Intro #1 by Kid Stardust +655b8fc59605f5d03c5ae7ca651452f0 ntsc|cic6102 # Alienstyle Intro by Renderman +e1ab235d2fc0dafba8f6334a2757ad46 ntsc|cic6102 # Alienstyle Intro by Renderman +e09272dcb2a26b97d20f198dd8729abc ntsc|cic6102 # Dexanoid R1 by Protest Design +cf77c88fe389897b348d5d1959ee13bd ntsc|cic6102 # Dynamix Intro by Widget and Immortal +4d2e751624901b5c2863f153d8e7c6c7 ntsc|cic6102 # Dynamix Intro by Widget and Immortal +aa22f738c387df27fa6d328db51fa793 ntsc|cic6102 # Dynamix Readme by Widget and Immortal +267d133677537dd13bca33afff1c6033 ntsc|cic6102 # Fire Demo by Lac +2ece451a1250fcfa54eca3e042ca2338 ntsc|cic6102|rpak|tpak # NDDT Monitor +7d132d5d7aa80f35fed15f800f84d686 ntsc|cic6102 # Ultrafox 64 by Megahawks +094901ab50e4acf72adc410f306fe17a ntsc|cic6102|cpak # VNES64 + Galaga +07e74c378c14673c09347b63f94b5750 ntsc|cic6102|cpak # VNES64 + Mario +e27ca7816964d50faeeb46c191732daf ntsc|cic6102|cpak # VNES64 V0.12 by Jean-Luc Picard +538ea872487c59547dbe2c2294190597 ntsc|cic6102 # 77a by Count0 +020a49809ff095855ddaff86fd3fe35c ntsc|cic6102|eeprom2k # 77a Special Edition by Count0 +64570e90b06e7456e66853590224b747 ntsc|cic6102 # Attax64 by Pookae +915b754f526d740fa3a8297bb630f5d1 ntsc|cic6102 # Attax64 by Pookae +77b0595c48c95ad6cebfed68a3635d89 ntsc|cic6102|cpak # Berney Must Die! by Nop_ +c03f0d8f37eea7d72f85d9a8d7b49cdf ntsc|cic6102|cpak # Berney Must Die! by Nop_ +06c9a6d5fabb150073aec6cd389beda6 ntsc|cic6102 # Bike Race '98 V1.0 by NAN +0d0039a42fa356bfea06159649e0125f ntsc|cic6102 # Bike Race '98 V1.0 by NAN +f1aae1ac9b406726398bef360de8f80a ntsc|cic6102 # Bike Race '98 V1.2 by NAN +62c1c8738ac652dce0c8df79f5dd53a6 ntsc|cic6102 # Bike Race '98 V1.2 by NAN +708660c2124ce8153938c05cfc556b5a ntsc|cic6102 # Dexanoid R1 by Protest Design +851ea9517e35244af04ecc2c767c6d2f ntsc|cic6102 # Dexanoid R1 by Protest Design +f5284557f228c69f0ddc948bb5f736a5 ntsc|cic6102 # Dexanoid R1 by Protest Design +afe8911262b7c208105355067869c55e ntsc|cic6102 # Pong by Oman +1d7f5fce38bb5d1fa67acb0483b52394 ntsc|cic6102 # Pong by Oman +c61e9aa1ffb68908153fc23563be2d09 ntsc|cic6102 # Pong by Oman +6f804ab901fdc64abe6c5ec90f278367 ntsc|cic6102|cpak # Simon for N64 V0.1a by Jean-Luc Picard +b8e34dc718fa8308cfd3570a88f9e57e ntsc|cic6102 # Analogue Test Utility by WT_Riker +0b2fdaa1b9500685b323c3ed64a4df1d ntsc|cic6102|sram32k # Diddy Kong Racing SRAM by Group5 +b23003df72a5dbc7230e1e56f9ce28f3 ntsc|cic6102 # LaC's MOD Player - The Temple Gates +e297dead1568583f3a607636c0b23868 ntsc|cic6102|cpak|rpak # Quake 64 +7b88dfbc4ff8e0f711382d73e84f3166 ntsc|cic6102|cpak # Saikyou Habu Shougi +d514bd51689a17cad9a8e96ba39edf14 ntsc|cic6102|cpak|rpak # San Francisco Rush - Extreme Racing +b062cd3f2e074c812b9425de4ce830c4 ntsc|cic6102|rpak|tpak # Sim City 64 (64drive 1.12d Compatible V1.0) +e2248995ec99eed25111270afa6d63c9 pal|cic7101|cpak|rpak # South Park +1fb58d87cfd87ec98fe67c916f0591f1 pal|cic7101|cpak|rpak # South Park +12086e237340e0034924407da8f69484 ntsc|cic6102|flash128k|rpak # StarCraft 64 (Beta) +7b551edf84d631ed68d6474d890e23e0 ntsc|cic6102|flash128k|rpak # StarCraft 64 (Beta) +9296ea2c78a6b10bb01fd14e14fc729e ntsc|cic6102|flash128k|rpak # StarCraft 64 (Beta) (Country Code) +33c4d0041e03a2d14216a80c5cec31d8 ntsc|cic6102|eeprom512 # Super Mario 64 +d42dff4f1c08668c61a67821f78c18c4 ntsc|cic6102|cpak # Turok - Dinosaur Hunter +976796791398f6043aee22c30f184443 ntsc|cic6102|cpak|rpak # Turok 2 - Seeds of Evil (Kiosk Demo) +c6b3c6121313f311a22153f7b1f54a39 ntsc|cic6102|sram32k|cpak|rpak # Virtual Pro Wrestling 64 +bcb74c38310ea30c240b6bea2dc97a5f ntsc|cic6102|eeprom2k|cpak # Mario Kart 64 Amped Up (v2.96a) +c7a8ec9386ab97f621dcb530e92b16b0 ntsc|cic6102|cpak|rpak|tpak # ControllerTest +69e9cf25cd6b9a7cc3cffa88ec1f75c1 ntsc|cic6102|rpak # Test Cart Runtime V2 by Nintendo +81240037b77b6a0d1e7ca0e707483092 ntsc|cic6102|eeprom2k|rpak # Donkey Kong 64 (Kiosk Demo) +6218e4c8b0ad79a2fcb8fa9f0d23a13a ntsc|cic6102|eeprom2k|rpak # Donkey Kong 64 (Kiosk Demo) +e2de0cca56d2ffa4a489933d76955205 ntsc|cic6102|flash128k|cpak|rtc # Doubutsu Banchou (English Translated, Rev 1) +05b271a640d3188ed7166c2c6a357934 ntsc|cic6102|flash128k|cpak|rtc # Doubutsu Banchou (Japan) (Proto) +9bbabdedcd717c4eded24f4e52177b96 ntsc|cic6102|eeprom512 # Viewpoint 2064 (Japan) (Proto) +7ecf0f0bd2236a38e0abd0b65089d94f ntsc|cic6102|eeprom512 # Viewpoint 2064 - No-AA (Hack) v1 ElectronAsh +a0806dea83c6ae2d211bc815d43e33de ntsc|cic6102|eeprom512 # Viewpoint 2064 - No-Dither+No-AA (Hack) v1 ElectronAsh +7b06e4fbf15112a88c5f9c182fa1264b ntsc|cic6102|eeprom512 # Viewpoint 2064 T+Eng v1.1 Zoinkity +317085e9fcd8df3f70f11468e5611418 ntsc|cic6102|eeprom2k # Cave Story (Release Demo 1) +b0fc9208a2bf873396a9e670e154cbff ntsc|cic6102 # Wizard of the Board +6debed294271420221177b972f240b04 pal|cic7101 # Wizard of the Board +24da9e65cf49dc2692337db4f69cb7ee ntsc|cic6102 # Wizard of the Board - Sicko Mode +03f81f7a4f0ae2cc4e3c7422d9f79fef ntsc|cic6102 # 2 Blokes & An Armchair - N64 Remix Remix by Tesko (PD) +ec34efc533127d43a03722e7f5769ee5 ntsc|cic6102 # Anim01 Demo by Acclaim & marshallh (PD) +24066da301c3e6f86966debfb892551f ntsc|cic6102 # Coco Demo (PD) +604765dabc45a77779f8a8c0b260ebf0 ntsc|cic6102 # Don't Be Square (PD) +df40527062e24ddf3679d506793f554a ntsc|cic6102 # Megahawks Inc Musicdisk 1 (PD) +34480812285442a4c6a3230364ccf02b ntsc|cic6102 # Melon Demo (PD) +2ece451a1250fcfa54eca3e042ca2338 ntsc|cic6102 # NDDT Monitor v1 +e1b63ebb35b2c3293380344e7e4f56ec ntsc|cic6102 # Raycast Demo (PD) +3588510c308ff6a0eda620500459af45 ntsc|cic6102 # RMGeom01 Demo by Acclaim & marshallh (PD) +69517e6224814a88b4d0ca94d1318759 ntsc|cic6102 # SMOS01 Demo by Acclaim & marshallh (PD) +eacb573315887f2b377e02fb67971b99 ntsc|cic6102 # VRMl2vtx Demo (PD) +cf8d8deecf27ccb0a13af043011d179b ntsc|cic6102 # 64drive USB Input Demo (PD) +bdf92537a25aa9869c5b37ca1f574a08 ntsc|cic6102 # RDP Probe by MooglyGuy (PD) +df2e40e7b204caaf1880537d3e57e462 ntsc|cic6102 # Glover (Prototype) + +# Cart-IDs' +ID:BPY___ eeprom512 # Pyoro 64 +ID:CD6___ eeprom2k|rpak|tpak # Densha de Go! 64 +ID:CDZ___ sram96k|rpak # Dezaemon 3D +ID:CFZ___ sram32k|rpak # F-Zero X (J) +ID:CLB___ eeprom512|rpak # Mario Party (NTSC) +ID:CMD___ # Nintendo 64 Modem +ID:CP2___ flash128k|tpak # Pocket Monsters Stadium 2 (J) +ID:CPS___ sram32k|tpak # Pocket Monsters Stadium (J) +ID:CPY___ rpak|Puyo Puyo Sun 64 +ID:CZL___ sram32k|rpak # Legend of Zelda: Ocarina of Time [Zelda no Densetsu - Toki no Ocarina (J)] +ID:N22___ cpak|rpak # Ready 2 Rumble Boxing - Round 2 +ID:N2M___ cpak|rpak # Madden Football 2002 +ID:N2P___ cpak|rpak # Rampage 2 - Universal Tour +ID:N2V___ cpak|rpak # Chameleon Twist 2 +ID:N32___ cpak|rpak # Army Men - Sarge's Heroes 2 +ID:N3D___ eeprom2k|rpak # Doraemon 3: Nobita no Machi SOS! +ID:N3HJ__ sram32k|rpak # Ganbare! Nippon! Olympics 2000 +ID:N3H___ cpak|rpak # International Track & Field 2000|Summer Games +ID:N3P___ cpak|rpak # Triple Play 2000 +ID:N3T___ cpak|rpak # Tony Hawk's Pro Skater 3 +ID:N4W___ eeprom512|cpak|rpak # 40 Winks +ID:N64___ cpak|rpak # Kira to Kaiketsu! 64 Tanteidan +ID:N7I___ cpak # FIFA Soccer 64 [FIFA 64 (E)] +ID:N8I___ cpak # FIFA - Road to World Cup 98 [World Cup e no Michi (J)] +ID:N8M___ cpak|rpak # Madden Football 64 +ID:N8W___ cpak # World Cup '98 +ID:N9B___ cpak|rpak # NBA Live '99 +ID:N9C___ cpak|rpak # Nascar '99 +ID:N9F___ cpak # FIFA 99 +ID:N9H___ cpak|rpak # NHL '99 +ID:N9M___ cpak|rpak # Madden Football '99 +ID:NA2___ sram32k|cpak|rpak # Virtual Pro Wrestling 2 +ID:NAB___ eeprom512|cpak|rpak # Air Boarder 64 +ID:NAC___ cpak|rpak # Army Men - Air Combat +ID:NAD___ eeprom512 # Worms Armageddon (U) +ID:NAF___ flash128k|cpak|rtc # Doubutsu no Mori +ID:NAG___ eeprom512|cpak # AeroGauge +ID:NAH___ cpak|rpak # Asteroids Hyper 64 +ID:NAI___ cpak # Midway's Greatest Arcade Hits Volume 1 +ID:NAL___ sram32k|rpak # Super Smash Bros. [Nintendo All-Star! Dairantou Smash Brothers (J)] +ID:NAM___ cpak|rpak # Army Men - Sarge's Heroes +ID:NAR___ cpak|rpak # Armorines - Project S.W.A.R.M. +ID:NAS___ cpak|rpak # All-Star Baseball 2001 +ID:NAY___ sram32k|cpak # Aidyn Chronicles - The First Mage +ID:NB2___ cpak|rpak # NBA In the Zone '99 [NBA Pro '99 (E)] +ID:NB3___ cpak|rpak # Bust-A-Move '99 [Bust-A-Move 3 DX (E)] +ID:NB4___ cpak|rpak # Bass Masters 2000 +ID:NB5___ sram32k|rpak # Biohazard 2 (J) +ID:NB6___ eeprom512|cpak|tpak # Super B-Daman: Battle Phoenix 64 +ID:NB7___ eeprom2k|rpak # Banjo-Tooie [Banjo to Kazooie no Daiboken 2 (J)] +ID:NB8___ cpak|rpak # Beetle Adventure Racing (J) +ID:NB9___ cpak # NBA Jam '99 +ID:NBA___ cpak|rpak # NBA In the Zone '98 [NBA Pro '98 (E)] +ID:NBC___ eeprom512|cpak # Blast Corps +ID:NBD___ eeprom512|rpak # Bomberman Hero [Mirian Ojo o Sukue! (J)] +ID:NBE___ cpak|rpak # All-Star Baseball 2000 +ID:NBF___ cpak|rpak # Bio F.R.E.A.K.S. +ID:NBH___ eeprom512|rpak # Body Harvest +ID:NBI___ cpak|rpak # NFL Blitz 2000 +ID:NBJ___ cpak # Bakushou Jinsei 64 - Mezase! Resort Ou +ID:NBK___ eeprom512|rpak # Banjo-Kazooie [Banjo to Kazooie no Daiboken (J)] +ID:NBL___ cpak|rpak # Buck Bumble +ID:NBM___ eeprom512|cpak # Bomberman 64 [Baku Bomberman (J)] +ID:NBN___ eeprom512|cpak|rpak # Bakuretsu Muteki Bangaioh +ID:NBO___ cpak # Bottom of the 9th +ID:NBP___ cpak|rpak # Blues Brothers 2000 +ID:NBQ___ cpak|rpak # Battletanx - Global Assault +ID:NBR___ cpak|rpak # Milo's Astro Lanes +ID:NBS___ cpak|rpak # All-Star Baseball '99 +ID:NBU___ cpak # Bust-A-Move 2 - Arcade Edition +ID:NBV___ eeprom512|cpak|rpak # Bomberman 64: The Second Attack! [Baku Bomberman 2 (J)] +ID:NBW___ cpak|rpak # Super Bowling +ID:NBX___ cpak|rpak # Battletanx +ID:NBY___ cpak|rpak # Bug's Life, A +ID:NBZ___ cpak|rpak # NFL Blitz +ID:NC2___ # Clay Fighter - Sculptor's Cut +ID:NCB___ rpak # Charlie Blast's Territory +ID:NCC___ flash128k|rpak # Command & Conquer +ID:NCD___ cpak|rpak # Carmageddon 64 +ID:NCE___ cpak|rpak # Nuclear Strike 64 +ID:NCF___ # Clay Fighter 63 1-3 +ID:NCG___ eeprom512|cpak|rpak|tpak # Choro Q 64 II - Hacha Mecha Grand Prix Race (J) +ID:NCH___ eeprom512|rpak # Chopper Attack +ID:NCK___ flash128k|rpak # NBA Courtside 2 featuring Kobe Bryant +ID:NCL___ cpak|rpak # California Speed +ID:NCO___ cpak|rpak # Jeremy McGrath Supercross 2000 +ID:NCR___ eeprom512|cpak # Penny Racers [Choro Q 64 (J)] +ID:NCS___ cpak|rpak # S.C.A.R.S. +ID:NCT___ eeprom512|rpak # Chameleon Twist +ID:NCU___ eeprom512|cpak # Cruis'n USA +ID:NCW___ eeprom2k|rpak # Cruis'n World +ID:NCX___ eeprom512 # Custom Robo +ID:NCY___ # South Park - Chef's Luv Shack +ID:NCZ___ eeprom2k|rpak # Custom Robo V2 +ID:ND2___ eeprom2k|rpak # Doraemon 2: Nobita to Hikari no Shinden +ID:ND3J__ eeprom2k|rpak # Akumajou Dracula Mokushiroku (J) +ID:ND3___ cpak # Castlevania +ID:ND4J__ eeprom2k|rpak # Akumajou Dracula Mokushiroku Gaiden: Legend of Cornell (J) +ID:ND4___ cpak # Castlevania - Legacy of Darkness +ID:ND6___ eeprom2k|rpak # Densha de Go! 64 +ID:NDA___ flash128k|cpak # Derby Stallion 64 +ID:NDC___ cpak|rpak # SD Hiryuu no Ken Densetsu (J) +ID:NDE___ cpak|rpak # Destruction Derby 64 +ID:NDF___ rpak # Dance Dance Revolution - Disney Dancing Museum +ID:NDH___ cpak # Duel Heroes +ID:NDKJ__ eeprom512 # Dark Rift [Space Dynamites (J)] +ID:NDM___ cpak # Doom 64 +ID:NDN___ cpak|rpak # Duke Nukem 64 +ID:NDO___ eeprom2k|rpak # Donkey Kong 64 +ID:NDP___ flash128k|rpak # Dinosaur Planet +ID:NDQ___ eeprom512|cpak # Disney's Donald Duck - Goin' Quackers [Quack Attack (E)] +ID:NDR___ eeprom512 # Doraemon: Nobita to 3tsu no Seireiseki +ID:NDS___ cpak # J.League Dynamite Soccer 64 +ID:NDT___ cpak|rpak # South Park +ID:NDU___ eeprom512|rpak # Duck Dodgers starring Daffy Duck +ID:NDW___ cpak|rpak # Daikatana, John Romero's +ID:NDY___ eeprom512|cpak|rpak # Diddy Kong Racing +ID:NDZ___ cpak|rpak # Duke Nukem - Zero Hour +ID:NEA___ eeprom512 # PGA European Tour +ID:NEG___ cpak|rpak # Extreme-G +ID:NEL___ # Sesame Street - Elmo's Letter Adventure +ID:NEN___ # Sesame Street - Elmo's Number Journey +ID:NEP___ eeprom2k|rpak # Star Wars Episode I: Racer +ID:NER___ eeprom512|rpak # Aero Fighters Assault [Sonic Wings Assault (J)] +ID:NET___ cpak # Quest 64 [Eltale Monsters (J) Holy Magic Century (E)] +ID:NEV___ eeprom2k|rpak # Neon Genesis Evangelion +ID:NF2___ eeprom512|rpak # F-1 World Grand Prix II +ID:NF9___ cpak # Fox Sports College Hoops '99 +ID:NFB___ cpak|rpak # NFL Blitz 2001 +ID:NFD___ cpak|rpak # Flying Dragon +ID:NFF___ cpak|rpak # Fighting Force 64 +ID:NFG___ eeprom512|cpak|rpak # Fighter Destiny 2 +ID:NFH___ eeprom512|rpak # In-Fisherman Bass Hunter 64 +ID:NFL___ cpak|rpak # Madden Football 2001 +ID:NFO___ cpak|rpak # Forsaken 64 +ID:NFQ___ cpak|rpak # Razor Freestyle Scooter +ID:NFR___ cpak|rpak # F-1 Racing Championship +ID:NFS___ cpak # Famista 64 +ID:NFU___ eeprom2k|rpak # Conker's Bad Fur Day +ID:NFW___ eeprom512|rpak # F-1 World Grand Prix +ID:NFX___ eeprom512|rpak # Star Fox 64 [Lylat Wars (E)] +ID:NFY___ eeprom512|cpak|rpak # Kakutou Denshou: F-Cup Maniax +ID:NFZ___ sram32k|rpak # F-Zero X (U + E) +ID:NG2___ cpak|rpak # Extreme-G XG2 +ID:NG5___ cpak|rpak # Ganbare Goemon - Neo Momoyama Bakufu no Odori [Mystical Ninja Starring Goemon] +ID:NG6___ sram32k|rpak # Ganmare Goemon: Dero Dero Douchuu Obake Tenkomori +ID:NGA___ cpak|rpak # Deadly Arts [G.A.S.P!! Fighter's NEXTream (E-J)] +ID:NGB___ cpak|rpak # Top Gear Hyper Bike +ID:NGC___ eeprom2k|cpak|rpak # GT 64: Championship Edition +ID:NGD___ cpak|rpak # Gauntlet Legends (J) +ID:NGE___ eeprom512|rpak # GoldenEye 007 +ID:NGL___ eeprom512|cpak|rpak # Getter Love!! +ID:NGM___ cpak|rpak # Goemon's Great Adventure [Mystical Ninja 2 Starring Goemon] +ID:NGN___ cpak # Golden Nugget 64 +ID:NGP___ sram32k|cpak # Goemon: Mononoke Sugoroku +ID:NGR___ eeprom512|cpak|rpak # Top Gear Rally +ID:NGS___ cpak # Jikkyou G1 Stable +ID:NGT___ eeprom2k|cpak|rpak # City Tour GrandPrix - Zen Nihon GT Senshuken +ID:NGU___ eeprom512|rpak # Tsumi to Batsu: Hoshi no Keishousha (Sin and Punishment) +ID:NGV___ eeprom512 # Glover +ID:NGX___ cpak|rpak # Gauntlet Legends +ID:NH5___ cpak # Nagano Winter Olympics '98 [Hyper Olympics in Nagano (J)] +ID:NH9___ cpak|rpak # NHL Breakaway '99 +ID:NHA___ eeprom512|cpak # Bomberman 64: Arcade Edition (J) +ID:NHB___ # Nintama Rantarou 64 Game Gallery +ID:NHC___ cpak|rpak # Hercules - The Legendary Journeys +ID:NHF___ eeprom512 # 64 Hanafuda: Tenshi no Yakusoku +ID:NHG___ cpak # F-1 Pole Position 64 +ID:NHK___ cpak|rpak # Hiryuu no Ken Twin +ID:NHL___ cpak|rpak # NHL Breakaway '98 +ID:NHM___ cpak|rpak # Mia Hamm Soccer 64 +ID:NHN___ cpak # Olympic Hockey Nagano '98 +ID:NHO___ cpak|rpak # NHL Blades of Steel '99 [NHL Pro '99 (E)] +ID:NHP___ eeprom512 # Heiwa Pachinko World 64 +ID:NHS___ cpak # Hamster Monogatari 64 +ID:NHT___ cpak|rpak # Hydro Thunder +ID:NHV___ cpak|rpak # Hybrid Heaven (U + E) +ID:NHW___ cpak|rpak # Hot Wheels Turbo Racing +ID:NHX___ cpak # Hexen +ID:NHY___ sram32k|cpak|rpak # Hybrid Heaven (J) +ID:NIB___ sram32k|rpak # Itoi Shigesato no Bass Tsuri No. 1 Kettei Ban! +ID:NIC___ eeprom512|rpak # Indy Racing 2000 +ID:NIJ___ eeprom512|rpak # Indiana Jones and the Infernal Machine +ID:NIM___ eeprom2k|break; # Ide Yosuke no Mahjong Juku +ID:NIR___ eeprom512|rpak # Utchan Nanchan no Hono no Challenger: Denryuu Ira Ira Bou +ID:NIS___ cpak|rpak # International Superstar Soccer 2000 +ID:NIV___ cpak|rpak # Space Invaders +ID:NJ2___ cpak # Wonder Project J2 - Koruro no Mori no Jozet (J) +ID:NJ3___ cpak # Jikkyou World Soccer 3 +ID:NJ5___ sram32k|cpak # Jikkyou Powerful Pro Yakyuu 5 +ID:NJA___ cpak|rpak # NBA Jam 2000 +ID:NJE___ cpak # J.League Eleven Beat 1997 +ID:NJF___ flash128k|rpak # Jet Force Gemini [Star Twins (J)] +ID:NJG___ sram32k|rpak # Jinsei Game 64 +ID:NJL___ cpak # J.League Live 64 +ID:NJM___ eeprom512 # Earthworm Jim 3D +ID:NJO___ # Jeopardy! +ID:NJP___ cpak # International Superstar Soccer 64 [Jikkyo J-League Perfect Striker (J)] +ID:NJQ___ rpak # Batman Beyond - Return of the Joker [Batman of the Future - Return of the Joker (E)] +ID:NK2___ eeprom512|rpak # Snowboard Kids 2 [Chou Snobow Kids (J)] +ID:NK4J00 sram32k|rpak # Kirby 64: The Crystal Shards [Hoshi no Kirby 64 (J)] +ID:NK4J01 sram32k|rpak # Kirby 64: The Crystal Shards [Hoshi no Kirby 64 (J)] +ID:NK4___ eeprom2k|rpak # Kirby 64 +ID:NKA___ eeprom512|cpak|rpak # Fighters Destiny [Fighting Cup (J)] +ID:NKE___ rpak # Knife Edge - Nose Gunner +ID:NKG___ sram32k|cpak|rpak # Major League Baseball featuring Ken Griffey Jr. +ID:NKI___ eeprom512|cpak # Killer Instinct Gold +ID:NKJ___ flash128k|rpak # Ken Griffey Jr.'s Slugfest +ID:NKK___ cpak|rpak # Knockout Kings 2000 +ID:NKM___ cpak # Pro Mahjong Kiwame 64 (J) +ID:NKR___ cpak # Rakuga Kids (E) +ID:NKT___ eeprom512|cpak # Mario Kart 64 +ID:NL2___ cpak|rpak # Top Gear Rally 2 +ID:NLB___ eeprom512|rpak # Mario Party (PAL) +ID:NLC___ cpak|rpak # Automobili Lamborghini [Super Speed Race 64 (J)] +ID:NLG___ cpak|rpak # LEGO Racers +ID:NLL___ eeprom512|rpak # Last Legion UX +ID:NLR___ eeprom512|rpak # Lode Runner 3-D +ID:NM3___ rpak # Monster Truck Madness 64 +ID:NM4___ cpak|rpak # Mortal Kombat 4 +ID:NM6___ flash128k|rpak # Mega Man 64 +ID:NM8___ eeprom2k|rpak|tpak # Mario Tennis +ID:NM9___ cpak|rpak # Harukanaru Augusta Masters 98 +ID:NMA___ cpak # Jangou Simulation Mahjong Do 64 +ID:NMB___ cpak|rpak # Mike Piazza's Strike Zone +ID:NMD___ cpak|rpak # Madden Football 2000 +ID:NME___ # Mace - The Dark Age +ID:NMF___ sram32k|rpak|tpak # Mario Golf 64 +ID:NMG___ eeprom512|cpak|rpak # Monaco Grand Prix [Racing Simulation 2 (G)] +ID:NMH___ # Mahjong Hourouki Classic +ID:NMI___ eeprom512|rpak # Mission: Impossible +ID:NMJ___ cpak # Mahjong 64 +ID:NMK___ # Mortal Kombat Trilogy +ID:NML___ eeprom512|rpak|tpak # Mickey's Speedway USA [Mickey no Racing Challenge USA (J)] +ID:NMM___ cpak # Mahjong Master +ID:NMO___ eeprom512 # Monopoly +ID:NMP___ # Mario no Photopie +ID:NMQ___ flash128k|rpak # Paper Mario +ID:NMR___ eeprom512|cpak|rpak # Multi-Racing Championship +ID:NMS___ eeprom512|cpak # Morita Shougi 64 +ID:NMT___ rpak # Magical Tetris Challenge +ID:NMU___ eeprom512|cpak|rpak # Big Mountain 2000 +ID:NMV___ eeprom2k|rpak # Mario Party 3 +ID:NMW___ eeprom512|rpak # Mario Party 2 +ID:NMX___ eeprom2k|cpak|rpak # Excitebike 64 +ID:NMY___ cpak|rpak # Mortal Kombat Mythologies - Sub-Zero +ID:NMZ___ eeprom512|cpak # Zool - Majou Tsukai Densetsu (J) +ID:NN2___ cpak|rpak # Nascar 2000 +ID:NN6___ eeprom512 # Dr. Mario 64 +ID:NNA___ eeprom512|rpak # Star Wars Episode I: Battle for Naboo +ID:NNB___ eeprom2k|cpak|rpak # Kobe Bryant in NBA Courtside +ID:NNC___ cpak|rpak # Nightmare Creatures +ID:NNL___ cpak|rpak # NBA Live 2000 +ID:NNM___ cpak # Namco Museum 64 +ID:NNR___ cpak # Pro Mahjong Tsuwamono 64 - Jansou Battle ni Chousen (J) +ID:NNS___ cpak|rpak # Beetle Adventure Racing +ID:NO2___ cpak|rpak # 64 Oozumou 2 +ID:NO7___ cpak|rpak # The World Is Not Enough +ID:NOB___ sram32k|cpak # Ogre Battle 64: Person of Lordly Caliber +ID:NOF___ cpak|rpak # Offroad Challenge +ID:NOH___ rpak|tpak # Transformers Beast Wars - Transmetals +ID:NOM___ cpak # Onegai Monsters +ID:NOS___ eeprom512|cpak|rpak # 64 Oozumou +ID:NOW___ cpak # Brunswick Circuit Pro Bowling +ID:NP2___ eeprom512|cpak|rpak # Chou Kuukan Night Pro Yakyuu King 2 (J) +ID:NP3___ flash128k|tpak # Pokemon Stadium 2 [Pocket Monsters Stadium - Kin Gin (J)] +ID:NP4___ sram32k|cpak # Jikkyou Powerful Pro Yakyuu 4 +ID:NP6___ sram32k|cpak|tpak # Jikkyou Powerful Pro Yakyuu 6 +ID:NP9___ cpak|rpak # Ms. Pac-Man - Maze Madness +ID:NPA___ sram32k|cpak|tpak # Jikkyou Powerful Pro Yakyuu 2000 +ID:NPB___ cpak|rpak # Puzzle Bobble 64 (J) +ID:NPC___ cpak # Pachinko 365 Nichi (J) +ID:NPD___ eeprom2k|cpak|rpak|tpak # Perfect Dark +ID:NPE___ sram32k|cpak # Jikkyou Powerful Pro Yakyuu Basic Ban 2001 +ID:NPF___ flash128k|break; # Pokemon Snap [Pocket Monsters Snap (J)] +ID:NPG___ eeprom512|rpak # Hey You, Pikachu! [Pikachu Genki Dechu (J)] +ID:NPH___ flash128k # Pokemon Snap Station +ID:NPK___ cpak # Chou Kuukan Night Pro Yakyuu King (J) +ID:NPL___ cpak # Power League 64 (J) +ID:NPM___ sram32k|cpak # Premier Manager 64 +ID:NPN___ flash128k|break; # Pokemon Puzzle League +ID:NPO___ flash128k|tpak # Pokemon Stadium +ID:NPP___ eeprom2k|cpak # Parlor! Pro 64: Pachinko Jikki Simulation Game +ID:NPQ___ # Powerpuff Girls, The - Chemical X-Traction +ID:NPR___ cpak|rpak # South Park Rally +ID:NPS___ sram32k|cpak|rpak # Jikkyou J.League 1999: Perfect Striker 2 +ID:NPT___ eeprom512|rpak|tpak # Puyo Puyon Party +ID:NPU___ cpak # Power Rangers - Lightspeed Rescue +ID:NPW___ eeprom512 # Pilotwings 64 +ID:NPX___ cpak|rpak # Polaris SnoCross +ID:NPY___ eeprom512|rpak # Puyo Puyo Sun 64 +ID:NPZ___ cpak|rpak # Susume! Taisen Puzzle Dama Toukon! Marumata Chou (J) +ID:NQ2___ cpak|rpak # Quake 2 +ID:NQ8___ cpak|rpak # NFL Quarterback Club '98 +ID:NQ9___ cpak|rpak # NFL Quarterback Club '99 +ID:NQB___ cpak|rpak # NFL Quarterback Club 2000 +ID:NQC___ cpak|rpak # NFL Quarterback Club 2001 +ID:NQK___ cpak|rpak # Quake 64 +ID:NR2___ cpak|rpak # Rush 2 - Extreme Racing USA +ID:NR3___ cpak|rpak # Stunt Racer 64 +ID:NR6___ cpak|rpak # Tom Clancy's Rainbow Six +ID:NR7___ eeprom2k|tpak # Robot Poncots 64: 7tsu no Umi no Caramel +ID:NRA___ eeprom512|cpak|rpak # Rally '99 (J) +ID:NRC___ eeprom512|rpak # Top Gear Overdrive +ID:NRD___ cpak|rpak # Ready 2 Rumble Boxing +ID:NRE___ sram32k|rpak # Resident Evil 2 +ID:NRG___ rpak # Rugrats - Scavenger Hunt [Treasure Hunt (E)] +ID:NRH___ flash128k|rpak # Rockman Dash - Hagane no Boukenshin (J) +ID:NRI___ sram32k|cpak # New Tetris, The +ID:NRK___ cpak # Rugrats in Paris - The Movie +ID:NRO___ cpak|rpak # Road Rash 64 +ID:NRP___ cpak|rpak # Rampage - World Tour +ID:NRR___ cpak|rpak # Roadster's Trophy +ID:NRS___ eeprom512|rpak # Star Wars: Rogue Squadron [Shutsugeki! Rogue Chuutai (J)] +ID:NRT___ cpak # Rat Attack +ID:NRU___ cpak|rpak # San Francisco Rush 2049 +ID:NRV___ cpak|rpak # Re-Volt +ID:NRW___ cpak|rpak # Turok: Rage Wars +ID:NRX___ cpak # Robotron 64 +ID:NRZ___ eeprom2k|rpak # Ridge Racer 64 +ID:NS2___ cpak # Simcity 2000 +ID:NS3___ eeprom512|cpak # AI Shougi 3 +ID:NS4___ sram32k|cpak|tpak # Super Robot Taisen 64 +ID:NS6___ eeprom512|rpak # Star Soldier: Vanishing Earth +ID:NSA___ eeprom512|rpak # Sonic Wings Assault (J) +ID:NSB___ cpak|rpak # Twisted Edge - Extreme Snowboarding [King Hill 64 - Extreme Snowboarding (J)] +ID:NSC___ eeprom512 # Starshot: Space Circus Fever +ID:NSD___ cpak|rpak # Shadow Man +ID:NSF___ cpak|rpak # San Francisco Rush - Extreme Racing +ID:NSG___ cpak # Shadowgate 64 - Trials Of The Four Towers +ID:NSH___ cpak # Saikyou Habu Shougi (J) +ID:NSI___ sram32k|cpak # Fushigi no Dungeon: Fuurai no Shiren 2 +ID:NSJ___ # J.League Tactics Soccer +ID:NSK___ cpak|rpak # Snowboard Kids [Snobow Kids (J)] +ID:NSL___ cpak|rpak # Spider-Man +ID:NSMJ03 eeprom512|rpak # Super Mario 64 Shindou Edition +ID:NSM___ eeprom512 # Super Mario 64 +ID:NSN___ eeprom512|cpak|rpak # Snow Speeder (J) +ID:NSO___ cpak # NBA Showtime - NBA on NBC +ID:NSP___ cpak|rpak # Superman +ID:NSQ___ flash128k|rpak # StarCraft 64 +ID:NSS___ eeprom512|rpak # Super Robot Spirits +ID:NST___ cpak # Eikou no Saint Andrews +ID:NSU___ eeprom512|rpak # Rocket: Robot on Wheels +ID:NSV___ eeprom512|rpak # Space Station Silicon Valley +ID:NSW___ eeprom512 # Star Wars: Shadows of the Empire [Teikoku no Kage (J)] +ID:NSX___ cpak|rpak # Supercross 2000 +ID:NSY___ cpak # Scooby-Doo! - Classic Creep Capers +ID:NSZ___ cpak|rpak # NFL Blitz - Special Edition +ID:NT2___ cpak|rpak # Turok 2 - Seeds of Evil [Violence Killer - Turok New Generation (J)] +ID:NT3___ sram32k|cpak # Shin Nihon Pro Wrestling - Toukon Road 2 - The Next Generation (J) +ID:NT4___ cpak|rpak # CyberTiger +ID:NT6___ eeprom512 # Tetris 64 +ID:NT9___ flash128k|break; # Tigger's Honey Hunt +ID:NTA___ cpak|rpak # Disney's Tarzan +ID:NTB___ eeprom512|rpak|tpak # Transformers: Beast Wars Metals 64 (J) +ID:NTC___ eeprom512|rpak # 64 Trump Collection +ID:NTD___ cpak|rpak # O.D.T. +ID:NTE___ sram32k|rpak # 1080 Snowboarding +ID:NTF___ cpak|rpak # Tony Hawk's Pro Skater +ID:NTH___ cpak|rpak # Toy Story 2 - Buzz Lightyear to the Rescue! +ID:NTI___ cpak|rpak # WWF: Attitude +ID:NTJ___ eeprom512|rpak # Tom & Jerry in Fists of Fury +ID:NTK___ cpak|rpak # Turok 3 - Shadow of Oblivion +ID:NTM___ eeprom512 # Mischief Makers [Yuke Yuke!! Trouble Makers (J)] +ID:NTN___ eeprom512 # All Star Tennis '99 +ID:NTO___ cpak # Shin Nihon Pro Wrestling - Toukon Road - Brave Spirits (J) +ID:NTP___ eeprom512 # Tetrisphere +ID:NTQ___ cpak|rpak # Tony Hawk's Pro Skater 2 +ID:NTR___ eeprom512|cpak|rpak # Top Gear Rally (J + E) +ID:NTS___ cpak # Centre Court Tennis [Let's Smash (J)] +ID:NTT___ cpak # Tonic Trouble +ID:NTU___ cpak # Turok: Dinosaur Hunter [Turok: Jikuu Senshi (J)] +ID:NTW___ eeprom512|cpak # 64 de Hakken!! Tamagotchi +ID:NTX___ eeprom512|rpak # Taz Express +ID:NUB___ eeprom2k|cpak|tpak # PD Ultraman Battle Collection 64 +ID:NUM___ sram32k|rpak|tpak # Nushi Zuri 64: Shiokaze ni Notte +ID:NUT___ sram32k|cpak|rpak|tpak # Nushi Zuri 64 +ID:NV2___ cpak|rpak # Chameleon Twist 2 +ID:NV3___ cpak|rpak # Micro Machines 64 Turbo +ID:NV8___ cpak|rpak # Vigilante 8 +ID:NVB___ sram32k|rpak # Bass Rush - ECOGEAR PowerWorm Championship (J) +ID:NVC___ cpak # Virtual Chess 64 +ID:NVG___ cpak|rpak # Vigilante 8 - Second Offense +ID:NVL___ eeprom512|rpak # V-Rally Edition '99 +ID:NVP___ sram32k|cpak|rpak # Virtual Pro Wrestling 64 +ID:NVR___ cpak # Virtual Pool 64 +ID:NVY___ eeprom512|rpak # V-Rally Edition '99 (J) +ID:NW2___ sram32k|rpak # WCW-nWo Revenge +ID:NW3___ cpak|rpak # WCW: Nitro +ID:NW4___ flash128k|cpak|rpak # WWF No Mercy +ID:NW8___ cpak # Wayne Gretzky's 3D Hockey '98 +ID:NWA___ # War Gods +ID:NWB___ cpak|rpak # Iggy's Reckin' Balls [Iggy-kun no Bura Bura Poyon (J)] +ID:NWC___ eeprom512|rpak # Wild Choppers +ID:NWD___ cpak|rpak # Winback - Covert Operations +ID:NWF___ rpak # Wheel of Fortune +ID:NWG___ cpak|rpak # Wayne Gretzky's 3D Hockey +ID:NWI___ cpak|rpak # ECW Hardcore Revolution +ID:NWK___ cpak|rpak # Michael Owens WLS 2000 [World League Soccer 2000 (E) / Telefoot Soccer 2000 (F)] +ID:NWL___ sram32k|rpak # Waialae Country Club: True Golf Classics +ID:NWM___ cpak|rpak # WCW: Mayhem +ID:NWN___ cpak|rpak # WCW vs. nWo - World Tour +ID:NWO___ cpak|rpak # World Driver Championship +ID:NWP___ cpak|rpak # Wipeout 64 +ID:NWQ___ eeprom512|cpak|rpak # Rally Challenge 2000 +ID:NWR_02 eeprom512|cpak|rpak # Wave Race 64 Shindou Edition +ID:NWR___ eeprom512|cpak # Wave Race 64 +ID:NWS___ cpak # International Superstar Soccer '98 [Jikkyo World Soccer - World Cup France '98 (J)] +ID:NWTJ__ eeprom512 # Wetrix (J) +ID:NWT___ cpak # Wetrix +ID:NWU___ eeprom512 # Worms Armageddon (E) +ID:NWV___ cpak|rpak # WCW: Backstage Assault +ID:NWW___ cpak|rpak # WWF: War Zone +ID:NWX___ sram32k|cpak|rpak # WWF WrestleMania 2000 +ID:NWZ___ cpak|rpak # NBA In the Zone 2000 +ID:NX2___ cpak # Gex 64 - Enter the Gecko +ID:NX3___ cpak|rpak # Gex 3 - Deep Cover Gecko +ID:NXF___ cpak|rpak # Xena Warrior Princess - The Talisman of Fate +ID:NXG___ cpak # NBA Hangtime +ID:NXO___ eeprom512|rpak # Cruis'n Exotica +ID:NX7___ eeprom2k|cpak|rpak|tpak # GoldenEye - X +ID:NY2___ cpak # Rayman 2 - The Great Escape +ID:NYK___ eeprom512|rpak # Yakouchuu II: Satsujin Kouro +ID:NYP___ cpak|rpak # Paperboy +ID:NYS___ eeprom2k|rpak # Yoshi's Story +ID:NYW___ sram32k|cpak # Harvest Moon 64 +ID:NZL___ sram32k|rpak # Legend of Zelda: Ocarina of Time (E) +ID:NZO___ cpak|rpak # Battlezone - Rise of the Black Dogs +ID:NZS___ flash128k|rpak # Legend of Zelda: Majora's Mask [Zelda no Densetsu - Mujura no Kamen (J)] \ No newline at end of file diff --git a/support/n64/n64.cpp b/support/n64/n64.cpp index fb59738..fb3b1e6 100644 --- a/support/n64/n64.cpp +++ b/support/n64/n64.cpp @@ -123,15 +123,100 @@ static void normalizeString(char* s) while (*s) { *s = tolower(*s); ++s; } } -static bool detect_rom_settings_in_db(const char* lookup_hash, const char* db_file_name) -{ +// return true if cic and system region is detected +static bool parse_and_apply_db_tags(char* tags) { + MemoryType save_type = MemoryType::NONE; + SystemType system_type = SystemType::NTSC; + CIC cic = CIC::CIC_NUS_6102; + bool cpak = false; + bool rpak = false; + bool tpak = false; + bool rtc = false; + bool system_type_detected = false; + bool cic_detected = false; + + const char separator[] = "|"; + + for (char* tag = strtok(tags, separator); tag; tag = strtok(nullptr, separator)) { + printf("Tag: %s\n", tag); + + normalizeString(tag); + switch (fnv_hash(tag)) { + case fnv_hash("eeprom512"): save_type = MemoryType::EEPROM_512; break; + case fnv_hash("eeprom2k"): save_type = MemoryType::EEPROM_2k; break; + case fnv_hash("sram32k"): save_type = MemoryType::SRAM_32k; break; + case fnv_hash("sram96k"): save_type = MemoryType::SRAM_96k; break; + case fnv_hash("flash128k"): save_type = MemoryType::FLASH_128k; break; + case fnv_hash("ntsc"): system_type = SystemType::NTSC; system_type_detected = true; break; + case fnv_hash("pal"): system_type = SystemType::PAL; system_type_detected = true; break; + case fnv_hash("cpak"): cpak = true; break; + case fnv_hash("rpak"): rpak = true; break; + case fnv_hash("tpak"): tpak = true; break; + case fnv_hash("rtc"): rtc = true; break; + case fnv_hash("cic6101"): cic = CIC::CIC_NUS_6101; cic_detected = true; break; + case fnv_hash("cic6102"): cic = CIC::CIC_NUS_6102; cic_detected = true; break; + case fnv_hash("cic6103"): cic = CIC::CIC_NUS_6103; cic_detected = true; break; + case fnv_hash("cic6105"): cic = CIC::CIC_NUS_6105; cic_detected = true; break; + case fnv_hash("cic6106"): cic = CIC::CIC_NUS_6106; cic_detected = true; break; + case fnv_hash("cic7101"): cic = CIC::CIC_NUS_7101; cic_detected = true; break; + case fnv_hash("cic7102"): cic = CIC::CIC_NUS_7102; cic_detected = true; break; + case fnv_hash("cic7103"): cic = CIC::CIC_NUS_7103; cic_detected = true; break; + case fnv_hash("cic7105"): cic = CIC::CIC_NUS_7105; cic_detected = true; break; + case fnv_hash("cic7106"): cic = CIC::CIC_NUS_7106; cic_detected = true; break; + case fnv_hash("cic8303"): cic = CIC::CIC_NUS_8303; cic_detected = true; break; + case fnv_hash("cic8401"): cic = CIC::CIC_NUS_8401; cic_detected = true; break; + case fnv_hash("cic5167"): cic = CIC::CIC_NUS_5167; cic_detected = true; break; + case fnv_hash("cicDDUS"): cic = CIC::CIC_NUS_DDUS; cic_detected = true; break; + default: printf("Unknown tag: %s\n", tag); + } + } + printf("System: %d, Save Type: %d, CIC: %d, CPak: %d, RPak: %d, TPak %d, RTC: %d\n", (int)system_type, (int)save_type, (int)cic, cpak, rpak, tpak, rtc); + + const auto auto_detect = (AutoDetect)user_io_status_get("[64]"); + + if (auto_detect == AutoDetect::ON) { + printf("Auto-detect is on, updating OSD settings\n"); + + if (system_type_detected) user_io_status_set("[80:79]", (uint32_t)system_type); + if (cic_detected) user_io_status_set("[68:65]", (uint32_t)cic); + user_io_status_set("[71]", (uint32_t)cpak); + user_io_status_set("[72]", (uint32_t)rpak); + user_io_status_set("[73]", (uint32_t)tpak); + user_io_status_set("[74]", (uint32_t)rtc); + user_io_status_set("[77:75]", (uint32_t)save_type); + } + else { + printf("Auto-detect is off, not updating OSD settings\n"); + } + + return (auto_detect != AutoDetect::ON) || (system_type_detected && cic_detected); +} + +bool id_matches(const char* line, const char* cart_id) { + // a valid id line should start with "ID:" + if (strlen(line) < 9 || strncmp(line, "ID:", 3) != 0) + return false; + + // skip the line if it doesn't match our cart_id, '_' = don't care + // cart ids should always be 6 characters long + for (size_t i = 0; i < 6; i++) { + if (line[i + 3] != '_' && line[i + 3] != cart_id[i]) + return false; // character didn't match + + if (line[i + 3] == ' ') // end of ID + return true; + } + + return true; +} + +static uint8_t detect_rom_settings_in_db(const char* lookup_hash, const char* db_file_name) { fileTextReader reader = {}; char file_path[1024]; sprintf(file_path, "%s/%s", HomeDir(), db_file_name); - if (!FileOpenTextReader(&reader, file_path)) - { + if (!FileOpenTextReader(&reader, file_path)) { printf("Failed to open N64 data file %s\n", file_path); return false; } @@ -139,90 +224,57 @@ static bool detect_rom_settings_in_db(const char* lookup_hash, const char* db_fi char tags[128]; const char* line; - while ((line = FileReadLine(&reader))) - { + while ((line = FileReadLine(&reader))) { + if (strlen(line) < 32 || !((line[0] >= '0' && line[0] <= '9') || (line[0] >= 'a' && line[0] <= 'f'))) + continue; + // skip the line if it doesn't start with our hash if (strncmp(lookup_hash, line, 32) != 0) continue; - if (sscanf(line, "%*s %s", tags) != 1) - { + printf("Found ROM entry: %s\n", line); + + if (sscanf(line, "%*s %s", tags) != 1) { printf("No tags found.\n"); - continue; + return 2; } + return parse_and_apply_db_tags(tags) ? 3 : 2; + } + + return 0; +} + +static uint8_t detect_rom_settings_in_db_with_cartid(const char* cart_id, const char* db_file_name) { + fileTextReader reader = {}; + + char file_path[1024]; + sprintf(file_path, "%s/%s", HomeDir(), db_file_name); + + if (!FileOpenTextReader(&reader, file_path)) { + printf("Failed to open N64 data file %s\n", file_path); + return false; + } + + char tags[128]; + + const char* line; + while ((line = FileReadLine(&reader))) { + // skip the line if it doesn't start with our id + if (!id_matches(line, cart_id)) + continue; + printf("Found ROM entry: %s\n", line); - MemoryType save_type = MemoryType::NONE; - SystemType system_type = SystemType::NTSC; - CIC cic = CIC::CIC_NUS_6102; - bool cpak = false; - bool rpak = false; - bool tpak = false; - bool rtc = false; - - const char separator[] = "|"; - - for (char* tag = strtok(tags, separator); tag; tag = strtok(nullptr, separator)) - { - printf("Tag: %s\n", tag); - - normalizeString(tag); - switch (fnv_hash(tag)) - { - case fnv_hash("eeprom512"): save_type = MemoryType::EEPROM_512; break; - case fnv_hash("eeprom2k"): save_type = MemoryType::EEPROM_2k; break; - case fnv_hash("sram32k"): save_type = MemoryType::SRAM_32k; break; - case fnv_hash("sram96k"): save_type = MemoryType::SRAM_96k; break; - case fnv_hash("flash128k"): save_type = MemoryType::FLASH_128k; break; - case fnv_hash("ntsc"): system_type = SystemType::NTSC; break; - case fnv_hash("pal"): system_type = SystemType::PAL; break; - case fnv_hash("cpak"): cpak = true; break; - case fnv_hash("rpak"): rpak = true; break; - case fnv_hash("tpak"): tpak = true; break; - case fnv_hash("rtc"): rtc = true; break; - case fnv_hash("cic6101"): cic = CIC::CIC_NUS_6101; break; - case fnv_hash("cic6102"): cic = CIC::CIC_NUS_6102; break; - case fnv_hash("cic6103"): cic = CIC::CIC_NUS_6103; break; - case fnv_hash("cic6105"): cic = CIC::CIC_NUS_6105; break; - case fnv_hash("cic6106"): cic = CIC::CIC_NUS_6106; break; - case fnv_hash("cic7101"): cic = CIC::CIC_NUS_7101; break; - case fnv_hash("cic7102"): cic = CIC::CIC_NUS_7102; break; - case fnv_hash("cic7103"): cic = CIC::CIC_NUS_7103; break; - case fnv_hash("cic7105"): cic = CIC::CIC_NUS_7105; break; - case fnv_hash("cic7106"): cic = CIC::CIC_NUS_7106; break; - case fnv_hash("cic8303"): cic = CIC::CIC_NUS_8303; break; - case fnv_hash("cic8401"): cic = CIC::CIC_NUS_8401; break; - case fnv_hash("cic5167"): cic = CIC::CIC_NUS_5167; break; - case fnv_hash("cicDDUS"): cic = CIC::CIC_NUS_DDUS; break; - default: printf("Unknown tag: %s\n", tag); - } - } - printf("System: %d, Save Type: %d, CIC: %d, CPak: %d, RPak: %d, TPak %d, RTC: %d\n", (int)system_type, (int)save_type, (int)cic, cpak, rpak, tpak, rtc); - - const auto auto_detect = (AutoDetect)user_io_status_get("[64]"); - - if (auto_detect == AutoDetect::ON) - { - printf("Auto-detect is on, updating OSD settings\n"); - - user_io_status_set("[80:79]", (uint32_t)system_type); - user_io_status_set("[68:65]", (uint32_t)cic); - user_io_status_set("[71]", (uint32_t)cpak); - user_io_status_set("[72]", (uint32_t)rpak); - user_io_status_set("[73]", (uint32_t)tpak); - user_io_status_set("[74]", (uint32_t)rtc); - user_io_status_set("[77:75]", (uint32_t)save_type); - } - else - { - printf("Auto-detect is off, not updating OSD settings\n"); + if (sscanf(line, "%*s %s", tags) != 1) { + printf("No tags found.\n"); + return 2; } - return true; + return parse_and_apply_db_tags(tags) ? 3 : 2; } - return false; + return 0; } static const char* DB_FILE_NAMES[] = @@ -231,50 +283,53 @@ static const char* DB_FILE_NAMES[] = "N64-database_user.txt", }; -static bool detect_rom_settings_in_dbs(const char* lookup_hash) -{ - for (const char* db_file_name: DB_FILE_NAMES) - { - if (detect_rom_settings_in_db(lookup_hash, db_file_name)) - return true; +static uint8_t detect_rom_settings_in_dbs(const char* lookup) { + for (const char* db_file_name : DB_FILE_NAMES) { + const auto detected = detect_rom_settings_in_db(lookup, db_file_name); + if (detected != 0) return detected; } - return false; + + return 0; } -static bool detect_rom_settings_from_first_chunk(char region_code, uint64_t crc) -{ - SystemType system_type; +static uint8_t detect_rom_settings_in_dbs_with_cartid(const char* id) { + for (const char* db_file_name : DB_FILE_NAMES) { + const auto detected = detect_rom_settings_in_db_with_cartid(id, db_file_name); + if (detected != 0) return detected; + } + + return 0; +} + +static bool detect_rom_settings_from_first_chunk(char region_code, uint64_t crc) { + SystemType system_type = SystemType::NTSC; CIC cic; + bool is_known_cic = true; - const auto auto_detect = (AutoDetect)user_io_status_get("[64]"); - - if (auto_detect != AutoDetect::ON) - { + if ((AutoDetect)user_io_status_get("[64]") != AutoDetect::ON) { printf("Auto-detect is off, not updating OSD settings\n"); return true; } - switch (region_code) - { - case 'D': //Germany - case 'F': //France - case 'H': //Netherlands (Dutch) - case 'I': //Italy - case 'L': //Gateway 64 - case 'P': //Europe - case 'S': //Spain - case 'U': //Australia - case 'W': //Scandinavia - case 'X': //Europe - case 'Y': //Europe + switch (region_code) { + case 'D': // Germany + case 'F': // France + case 'H': // Netherlands (Dutch) + case 'I': // Italy + case 'L': // Gateway 64 + case 'P': // Europe + case 'S': // Spain + case 'U': // Australia + case 'W': // Scandinavia + case 'X': // Europe + case 'Y': // Europe system_type = SystemType::PAL; break; - default: - system_type = SystemType::NTSC; break; } // the following checks assume we're on a little-endian platform - switch (crc) - { + switch (crc) { + default: + is_known_cic = false; case UINT64_C(0x000000a316adc55a): case UINT64_C(0x000000039c981107): // hcs64's CIC-6102 IPL3 replacement case UINT64_C(0x000000a30dacd530): // Unknown. Used in SM64 hacks @@ -301,7 +356,6 @@ static bool detect_rom_settings_from_first_chunk(char region_code, uint64_t crc) case UINT64_C(0x000000a9df4b39e1): cic = CIC::CIC_NUS_8303; break; case UINT64_C(0x000000aa764e39e1): cic = CIC::CIC_NUS_8401; break; case UINT64_C(0x000000abb0b739e1): cic = CIC::CIC_NUS_DDUS; break; - default: return false; } printf("System: %d, CIC: %d\n", (int)system_type, (int)cic); @@ -310,22 +364,19 @@ static bool detect_rom_settings_from_first_chunk(char region_code, uint64_t crc) user_io_status_set("[80:79]", (uint32_t)system_type); user_io_status_set("[68:65]", (uint32_t)cic); - return true; + return is_known_cic; } -static void md5_to_hex(uint8_t* in, char* out) -{ +static void md5_to_hex(uint8_t* in, char* out) { char *p = out; - for (int i = 0; i < 16; i++) - { + for (int i = 0; i < 16; i++) { sprintf(p, "%02x", in[i]); p += 2; } *p = '\0'; } -int n64_rom_tx(const char* name, unsigned char index) -{ +int n64_rom_tx(const char* name, unsigned char index) { static uint8_t buf[4096]; fileTYPE f = {}; @@ -349,8 +400,7 @@ int n64_rom_tx(const char* name, unsigned char index) process_ss(name); bool is_first_chunk = true; - bool rom_found_in_db = false; - bool cic_detected = false; + uint8_t rom_info_detected = 0; RomFormat rom_format = RomFormat::UNKNOWN; MD5Context ctx; @@ -358,7 +408,7 @@ int n64_rom_tx(const char* name, unsigned char index) uint8_t md5[16]; char md5_hex[40]; uint64_t ipl3_crc = 0; - char region_code = '\0'; + char cart_id[8]; while (bytes2send) { @@ -367,10 +417,8 @@ int n64_rom_tx(const char* name, unsigned char index) FileReadAdv(&f, buf, chunk); // perform sanity checks and detect ROM format - if (is_first_chunk) - { - if (chunk < 4096) - { + if (is_first_chunk) { + if (chunk < 4096) { printf("Failed to load ROM: must be at least 4096 bytes\n"); return 0; } @@ -382,8 +430,7 @@ int n64_rom_tx(const char* name, unsigned char index) MD5Update(&ctx, buf, chunk); - if (is_first_chunk) - { + if (is_first_chunk) { // try to detect ROM settings based on header MD5 hash // For calculating the MD5 hash of the header, we need to make a @@ -395,12 +442,15 @@ int n64_rom_tx(const char* name, unsigned char index) md5_to_hex(md5, md5_hex); printf("Header MD5: %s\n", md5_hex); - rom_found_in_db = detect_rom_settings_in_dbs(md5_hex); - if (!rom_found_in_db) - { + rom_info_detected = detect_rom_settings_in_dbs(md5_hex); + // system region and/or cic is missing + if (rom_info_detected == 0) { printf("No ROM information found for header hash: %s\n", md5_hex); for (size_t i = 0x40 / sizeof(uint32_t); i < 0x1000 / sizeof(uint32_t); i++) ipl3_crc += ((uint32_t*)buf)[i]; - region_code = buf[0x3e]; + strncpy(cart_id, (char*)(buf + 0x3b), 4); + sprintf((char*)(cart_id + 4), "%02X", buf[0x3f]); + cart_id[6] = '\0'; + printf("Cartridge ID: %s\n", cart_id); } } @@ -415,19 +465,23 @@ int n64_rom_tx(const char* name, unsigned char index) md5_to_hex(md5, md5_hex); printf("File MD5: %s\n", md5_hex); - // Try to detect ROM settings from file MD5 if they are not available yet - if (!rom_found_in_db) - { - rom_found_in_db = detect_rom_settings_in_dbs(md5_hex); - if (!rom_found_in_db) printf("No ROM information found for file hash: %s\n", md5_hex); - } + // 0 = nothing detected + // 1 = cic detected + // 2 = found in db, but no system type and/or cic + // 3 = both - // Try detect (partial) ROM settings by analyzing the ROM itself. (region, cic and save type) - // Fallback for missing db entries. - if (!rom_found_in_db) - { - cic_detected = detect_rom_settings_from_first_chunk(region_code, ipl3_crc); - if (!cic_detected) printf("Unknown CIC type: %016" PRIX64 "\n", ipl3_crc); + // Try to detect ROM settings from full file MD5 if they are not available yet + if (rom_info_detected == 0) + rom_info_detected = detect_rom_settings_in_dbs(md5_hex); + + if (rom_info_detected == 0) { + rom_info_detected = detect_rom_settings_in_dbs_with_cartid(cart_id); + // Try detect (partial) ROM settings by analyzing the ROM itself. (region, cic and save type) + if ((rom_info_detected == 0 || rom_info_detected == 2) && detect_rom_settings_from_first_chunk(cart_id[3], ipl3_crc)) + rom_info_detected += 1; + } + else if (rom_info_detected == 2 && detect_rom_settings_from_first_chunk(cart_id[3], ipl3_crc)) { + rom_info_detected = 3; } printf("Done.\n"); @@ -442,11 +496,10 @@ int n64_rom_tx(const char* name, unsigned char index) user_io_set_download(0); ProgressMessage(0, 0, 0, 0); - if (!rom_found_in_db) - { - if (!cic_detected) Info("auto-detect failed"); - else Info("use database if save is needed"); - } + if (rom_info_detected == 0 || rom_info_detected == 2) + Info("Auto-detect failed:\nUnknown CIC type."); + else if (rom_info_detected == 1) + Info("Auto-detect failed:\nROM missing from database,\nyou might not be able to save.", 5000); return 1; }