├── README.md ├── patches └── mmlc │ ├── Mega Man (Original).ips │ ├── Mega Man 2 (Original).ips │ ├── Mega Man 3 (Original).ips │ ├── Mega Man 4 (Original).ips │ ├── Mega Man 5 (Original).ips │ └── Mega Man 6 (Original).ips └── src ├── dac-extractor.py ├── mmlc-extractor-rockman.py └── mmlc-extractor.py /README.md: -------------------------------------------------------------------------------- 1 | # MMLC/DAC Extractor 2 | Extracts NES ROMs from the Mega Man Legacy Collection (Windows) and Disney Afternoon Collection (Windows). 3 | 4 | Based on anpage's script: https://gist.github.com/anpage/b895a34efb0bf1e4a9a4f52228067fa8 5 | 6 | ## How to use 7 | * Make sure the latest version of Python 3 is installed at https://python.org. 8 | * Place one of the scripts in the same directory as the MMLC/DAC executable. 9 | * **IMPORTANT:** Make sure that the game you extracting the ROMs from is fully updated. 10 | * For good measure, verify the integrity of the game via Steam. 11 | * Run the script (in most cases, you should be able to double-click it to run it). 12 | 13 | ## FAQ 14 | ### What are the difference between the ROMs in the MMLC/DAC and the original ROMs? 15 | In the case of the Mega Man ROMs in the MMLC and the ROMs in the DAC, they aren't identical to their original releases. All references to Nintendo have been removed in each game. 16 | 17 | The Rockman ROMs are identical to the original games, however. 18 | 19 | ### Are the extracted ROMs compatible with ROM hacks? 20 | No, the ROMs included with the MMLC and DAC are modified (except for the Rockman ROMs), and thus incompatible with ROM hacks. However, I included IPS patches that make the ROMs identical to the original releases, which in turn make them compatible with ROM hacks. I would recommend making backup copies of the extracted ROMs before patching them, as there may be other changes to the ROMs that I am unaware of. You can apply the IPS patches using [Lunar IPS](https://fusoya.eludevisibility.org/lips/). 21 | 22 | **Beware that applying the patches directly without making backups will overwrite the original ROMs!** 23 | 24 | ### An update released for the MMLC/DAC and the script doesn't output valid ROMs anymore! 25 | This is probably due to the offsets for the ROMs shifting. Create an issue and I'll try to fix it. 26 | -------------------------------------------------------------------------------- /patches/mmlc/Mega Man (Original).ips: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htv04/mmlc-dac-extractor/6d3580fca1ac280ad0768e8cf15c08d8bd2f19ce/patches/mmlc/Mega Man (Original).ips -------------------------------------------------------------------------------- /patches/mmlc/Mega Man 2 (Original).ips: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htv04/mmlc-dac-extractor/6d3580fca1ac280ad0768e8cf15c08d8bd2f19ce/patches/mmlc/Mega Man 2 (Original).ips -------------------------------------------------------------------------------- /patches/mmlc/Mega Man 3 (Original).ips: -------------------------------------------------------------------------------- 1 | PATCHe;'  % ""$ %% 2 |  3 | &% &EOF -------------------------------------------------------------------------------- /patches/mmlc/Mega Man 4 (Original).ips: -------------------------------------------------------------------------------- 1 | PATCH   2 |  3 |  ~ " $EOF -------------------------------------------------------------------------------- /patches/mmlc/Mega Man 5 (Original).ips: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htv04/mmlc-dac-extractor/6d3580fca1ac280ad0768e8cf15c08d8bd2f19ce/patches/mmlc/Mega Man 5 (Original).ips -------------------------------------------------------------------------------- /patches/mmlc/Mega Man 6 (Original).ips: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htv04/mmlc-dac-extractor/6d3580fca1ac280ad0768e8cf15c08d8bd2f19ce/patches/mmlc/Mega Man 6 (Original).ips -------------------------------------------------------------------------------- /src/dac-extractor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Disney Afternoon Collection Extractor v1.3.0 4 | # By HTV04 5 | 6 | # IMPORTANT: This script is currently only compatible with v1.0.0.42 of the Windows version of the game 7 | 8 | # iNES Headers 9 | HEADERS = [ 10 | b'\x4E\x45\x53\x1A\x08\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00', 11 | b'\x4E\x45\x53\x1A\x08\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00', 12 | b'\x4E\x45\x53\x1A\x08\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00', 13 | b'\x4E\x45\x53\x1A\x08\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00', 14 | b'\x4E\x45\x53\x1A\x08\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00', 15 | b'\x4E\x45\x53\x1A\x08\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00' 16 | ] 17 | 18 | # Offsets for each game's ROM in the executable 19 | OFFSETS = [ 20 | {'PRG': [0x7F2F30, 0x40000], 'CHA': None}, 21 | {'PRG': [0x832F30, 0x40000], 'CHA': None}, 22 | {'PRG': [0x792F30, 0x20000], 'CHA': [0x772F30, 0x20000]}, 23 | {'PRG': [0x7B2F30, 0x20000], 'CHA': None}, 24 | {'PRG': [0x7D2F30, 0x20000], 'CHA': None}, 25 | {'PRG': [0x872F30, 0x40000], 'CHA': None} 26 | ] 27 | 28 | # Game names 29 | GAMES = [ 30 | 'Chip \'n Dale - Rescue Rangers', 31 | 'Chip \'n Dale - Rescue Rangers 2', 32 | 'Darkwing Duck', 33 | 'DuckTales', 34 | 'DuckTales 2', 35 | 'TaleSpin' 36 | ] 37 | 38 | if __name__ == '__main__': 39 | f = open("capcom_disney_afternoon.exe", "rb") 40 | try: 41 | exe = f.read() 42 | finally: 43 | f.close() 44 | 45 | for i, game in enumerate(HEADERS): 46 | for section in ['PRG', 'CHA']: 47 | if OFFSETS[i][section]: 48 | start = OFFSETS[i][section][0] 49 | size = OFFSETS[i][section][1] 50 | end = start + size 51 | game += exe[start:end] 52 | 53 | out = open(GAMES[i] + " (Disney Afternoon Collection).nes", "wb") 54 | 55 | try: 56 | out.write(game) 57 | finally: 58 | out.close() 59 | -------------------------------------------------------------------------------- /src/mmlc-extractor-rockman.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Mega Man Legacy Collection Extractor - Rockman v1.3.0 4 | # By HTV04 5 | 6 | # IMPORTANT: This script is only compatible with v1.1.1.29 of the Windows version of the game 7 | 8 | # iNES Headers 9 | HEADERS = [ 10 | b'\x4E\x45\x53\x1A\x08\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00', 11 | b'\x4E\x45\x53\x1A\x10\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00', 12 | b'\x4E\x45\x53\x1A\x10\x10\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00', 13 | b'\x4E\x45\x53\x1A\x20\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00', 14 | b'\x4E\x45\x53\x1A\x10\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00', 15 | b'\x4E\x45\x53\x1A\x20\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00' 16 | ] 17 | 18 | # Offsets for each game's ROM in the executable 19 | OFFSETS = [ 20 | [0x512230, 0x20000], 21 | [0x2F20F0, 0x40000], 22 | [0x332130, 0x60000], 23 | [0x392170, 0x80000], 24 | [0x4121B0, 0x80000], 25 | [0x4921F0, 0x80000] 26 | ] 27 | 28 | # Game names 29 | GAMES = [ 30 | "Rockman", 31 | "Rockman 2 - Dr Wily no Nazo", 32 | "Rockman 3 - Dr Wily no Saigo!", 33 | "Rockman 4 - Aratanaru Yabou!!", 34 | "Rockman 5 - Blues no Wana!", 35 | "Rockman 6 - Shijou Saidai no Tatakai!!" 36 | ] 37 | 38 | if __name__ == '__main__': 39 | f = open("Proteus.exe", "rb") 40 | try: 41 | exe = f.read() 42 | finally: 43 | f.close() 44 | 45 | for i, game in enumerate(HEADERS): 46 | start = OFFSETS[i][0][0] 47 | size = OFFSETS[i][1][1] 48 | end = start + size 49 | game += exe[start:end] 50 | 51 | out = open(GAMES[i] + ".nes", "wb") 52 | 53 | try: 54 | out.write(game) 55 | finally: 56 | out.close() 57 | -------------------------------------------------------------------------------- /src/mmlc-extractor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Mega Man Legacy Collection Extractor v1.3.0 4 | # By HTV04 5 | 6 | # IMPORTANT: This script is currently only compatible with v1.1.1.29 of the Windows version of the game 7 | 8 | # iNES Headers 9 | HEADERS = [ 10 | b'\x4E\x45\x53\x1A\x08\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00', 11 | b'\x4E\x45\x53\x1A\x10\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00', 12 | b'\x4E\x45\x53\x1A\x10\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00', 13 | b'\x4E\x45\x53\x1A\x20\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00', 14 | b'\x4E\x45\x53\x1A\x10\x20\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00', 15 | b'\x4E\x45\x53\x1A\x20\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00' 16 | ] 17 | 18 | # Offsets for each game's ROM in the executable 19 | OFFSETS = [ 20 | {'PRG': [0x2AEEB0, 0x20000], 'CHA': None}, 21 | {'PRG': [0x8ED70, 0x40000], 'CHA': None}, 22 | {'PRG': [0xCEDB0, 0x40000], 'CHA': [0x10EDB0, 0x20000]}, 23 | {'PRG': [0x12EDF0, 0x80000], 'CHA': None}, 24 | {'PRG': [0x1AEE30, 0x80000], 'CHA': None}, 25 | {'PRG': [0x22EE70, 0x80000], 'CHA': None} 26 | ] 27 | 28 | if __name__ == '__main__': 29 | f = open("Proteus.exe", "rb") 30 | try: 31 | exe = f.read() 32 | finally: 33 | f.close() 34 | 35 | for i, game in enumerate(HEADERS): 36 | for section in ['PRG', 'CHA']: 37 | if OFFSETS[i][section]: 38 | start = OFFSETS[i][section][0] 39 | size = OFFSETS[i][section][1] 40 | end = start + size 41 | game += exe[start:end] 42 | 43 | if i == 0: 44 | out = open("Mega Man (Mega Man Legacy Collection).nes", "wb") 45 | else: 46 | out = open("Mega Man " + str(i + 1) + "(Mega Man Legacy Collection).nes", "wb") 47 | 48 | try: 49 | out.write(game) 50 | finally: 51 | out.close() 52 | --------------------------------------------------------------------------------