diff --git a/Makefile b/Makefile index c5eaeff79a..f2ba949a4b 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ COMPILER ?= ido # gc-eu-mq GameCube Europe/PAL Master Quest # gc-eu-mq-dbg GameCube Europe/PAL Master Quest Debug (default) # The following versions are work-in-progress and not yet matching: -# ntsc-1.2 N64 NTSC 1.2 (Japan) +# ntsc-1.2 N64 NTSC 1.2 (Japan/US depending on REGION) VERSION ?= gc-eu-mq-dbg # Number of threads to extract and compress with N_THREADS ?= $(shell nproc) @@ -45,8 +45,10 @@ CFLAGS ?= CPPFLAGS ?= CPP_DEFINES ?= +REGIONAL_CHECKSUM := 0 # Version-specific settings ifeq ($(VERSION),ntsc-1.2) + REGIONAL_CHECKSUM := 1 REGION ?= JP PLATFORM := N64 PAL := 0 @@ -470,13 +472,21 @@ all: rom compress rom: $(ROM) ifneq ($(COMPARE),0) @md5sum $(ROM) + ifneq ($(REGIONAL_CHECKSUM),0) + @md5sum -c $(BASEROM_DIR)/checksum-$(REGION).md5 + else @md5sum -c $(BASEROM_DIR)/checksum.md5 + endif endif compress: $(ROMC) ifneq ($(COMPARE),0) @md5sum $(ROMC) + ifneq ($(REGIONAL_CHECKSUM),0) + @md5sum -c $(BASEROM_DIR)/checksum-$(REGION)-compressed.md5 + else @md5sum -c $(BASEROM_DIR)/checksum-compressed.md5 + endif endif clean: diff --git a/baseroms/ntsc-1.2/checksum-compressed.md5 b/baseroms/ntsc-1.2/checksum-JP-compressed.md5 similarity index 100% rename from baseroms/ntsc-1.2/checksum-compressed.md5 rename to baseroms/ntsc-1.2/checksum-JP-compressed.md5 diff --git a/baseroms/ntsc-1.2/checksum.md5 b/baseroms/ntsc-1.2/checksum-JP.md5 similarity index 100% rename from baseroms/ntsc-1.2/checksum.md5 rename to baseroms/ntsc-1.2/checksum-JP.md5 diff --git a/baseroms/ntsc-1.2/checksum-US-compressed.md5 b/baseroms/ntsc-1.2/checksum-US-compressed.md5 new file mode 100644 index 0000000000..001d6babd3 --- /dev/null +++ b/baseroms/ntsc-1.2/checksum-US-compressed.md5 @@ -0,0 +1 @@ +57a9719ad547c516342e1a15d5c28c3d build/ntsc-1.2/oot-ntsc-1.2-compressed.z64 diff --git a/baseroms/ntsc-1.2/checksum-US.md5 b/baseroms/ntsc-1.2/checksum-US.md5 new file mode 100644 index 0000000000..75c1434d1a --- /dev/null +++ b/baseroms/ntsc-1.2/checksum-US.md5 @@ -0,0 +1 @@ +12fcafeba93992facaf65c2ba00f3089 build/ntsc-1.2/oot-ntsc-1.2.z64 diff --git a/baseroms/ntsc-1.2/config.yml b/baseroms/ntsc-1.2/config.yml index 5a0765a700..89a4c73e02 100644 --- a/baseroms/ntsc-1.2/config.yml +++ b/baseroms/ntsc-1.2/config.yml @@ -1,3 +1,6 @@ +checksums: + - checksum-JP + - checksum-US dmadata_start: 0x7960 text_lang_pal: false incbins: diff --git a/tools/decompress_baserom.py b/tools/decompress_baserom.py index 2feb2b935c..aeea9e3dae 100755 --- a/tools/decompress_baserom.py +++ b/tools/decompress_baserom.py @@ -10,6 +10,7 @@ import hashlib import io from pathlib import Path import struct +from typing import Iterable import crunch64 import ipl3checksum @@ -101,10 +102,10 @@ def get_str_hash(byte_array): return str(hashlib.md5(byte_array).hexdigest()) -def check_existing_rom(rom_path: Path, correct_str_hash: str): +def check_existing_rom(rom_path: Path, correct_str_hashes: Iterable[str]): # If the baserom exists and is correct, we don't need to change anything if rom_path.exists(): - if get_str_hash(rom_path.read_bytes()) == correct_str_hash: + if get_str_hash(rom_path.read_bytes()) in correct_str_hashes: return True return False @@ -176,12 +177,17 @@ def main(): config = version_config.load_version_config(version) dmadata_start = config.dmadata_start - compressed_str_hash = ( - (baserom_dir / "checksum-compressed.md5").read_text().split()[0] - ) - decompressed_str_hash = (baserom_dir / "checksum.md5").read_text().split()[0] + compressed_str_hashes = [] + decompressed_str_hashes = [] + for checksum_stem in config.checksums: + compressed_str_hashes.append( + (baserom_dir / f"{checksum_stem}-compressed.md5").read_text().split()[0] + ) + decompressed_str_hashes.append( + (baserom_dir / f"{checksum_stem}.md5").read_text().split()[0] + ) - if check_existing_rom(uncompressed_path, decompressed_str_hash): + if check_existing_rom(uncompressed_path, decompressed_str_hashes): print("Found valid baserom - exiting early") return @@ -220,12 +226,12 @@ def main(): # Check to see if the ROM is a "vanilla" ROM str_hash = get_str_hash(file_content) if version == "gc-eu-mq-dbg": - correct_str_hash = decompressed_str_hash + correct_str_hashes = decompressed_str_hashes else: - correct_str_hash = compressed_str_hash - if str_hash != correct_str_hash: + correct_str_hashes = compressed_str_hashes + if str_hash not in correct_str_hashes: print( - f"Error: Expected a hash of {correct_str_hash} but got {str_hash}. The baserom has probably been tampered, find a new one" + f"Error: Expected a hash of {' or '.join(correct_str_hashes)} but got {str_hash}. The baserom has probably been tampered, find a new one" ) if version == "gc-eu-mq-dbg": @@ -247,9 +253,9 @@ def main(): # Double check the hash str_hash = get_str_hash(file_content) - if str_hash != decompressed_str_hash: + if str_hash not in decompressed_str_hashes: print( - f"Error: Expected a hash of {decompressed_str_hash} after decompression but got {str_hash}!" + f"Error: Expected a hash of {' or '.join(decompressed_str_hashes)} after decompression but got {str_hash}!" ) exit(1) diff --git a/tools/version_config.py b/tools/version_config.py index f1666d1452..9377637763 100644 --- a/tools/version_config.py +++ b/tools/version_config.py @@ -20,6 +20,7 @@ PROJECT_ROOT = Path(__file__).parent.parent class VersionConfig: # Version name version: str + checksums: list[str] # ROM offset to start of DMA table dmadata_start: int # Whether the languages are PAL (EN/DE/FR) or not (JP/EN) @@ -89,6 +90,7 @@ def load_version_config(version: str) -> VersionConfig: return VersionConfig( version=version, + checksums=config.get("checksums", ["checksum"]), dmadata_start=config["dmadata_start"], text_lang_pal=config["text_lang_pal"], dmadata_segments=load_dmadata_segments(version),