From 01a5fa9a4525e9cb53e6f276dae747c17b381e2c Mon Sep 17 00:00:00 2001 From: cadmic Date: Mon, 4 Mar 2024 08:39:16 -0800 Subject: [PATCH] Remove 0xFF padding from uncompressed ROMs (#1910) * Remove 0xFF padding from uncompressed ROMs * Add comment about overdump contents * Update checksum in README * Reword comment --- README.md | 2 +- baseroms/gc-eu-mq-dbg/checksum.md5 | 2 +- baseroms/gc-eu-mq/checksum.md5 | 2 +- tools/decompress_baserom.py | 25 ++++++++----------------- tools/elf2rom.c | 16 +++------------- 5 files changed, 14 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 0e3e1bd13d..27972882f9 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The only build currently supported is Master Quest (Debug), but other versions a It builds the following ROM: -* oot-gc-eu-mq-dbg.z64 `md5: f0b7f35375f9cc8ca1b2d59d78e35405` +* oot-gc-eu-mq-dbg.z64 `md5: 75e344f41c26ec2ec5ad92caa9e25629` **Note: This repository does not include any of the assets necessary to build the ROM. A prior copy of the game is required to extract the needed assets.** diff --git a/baseroms/gc-eu-mq-dbg/checksum.md5 b/baseroms/gc-eu-mq-dbg/checksum.md5 index 55af8fae8a..69e361d6a1 100644 --- a/baseroms/gc-eu-mq-dbg/checksum.md5 +++ b/baseroms/gc-eu-mq-dbg/checksum.md5 @@ -1 +1 @@ -f0b7f35375f9cc8ca1b2d59d78e35405 build/gc-eu-mq-dbg/oot-gc-eu-mq-dbg.z64 +75e344f41c26ec2ec5ad92caa9e25629 build/gc-eu-mq-dbg/oot-gc-eu-mq-dbg.z64 diff --git a/baseroms/gc-eu-mq/checksum.md5 b/baseroms/gc-eu-mq/checksum.md5 index 6c33e9d3ef..7d78aaf060 100644 --- a/baseroms/gc-eu-mq/checksum.md5 +++ b/baseroms/gc-eu-mq/checksum.md5 @@ -1 +1 @@ -1a438f4235f8038856971c14a798122a build/gc-eu-mq/oot-gc-eu-mq.z64 +4920520254b9aab86de57b42ab477dbb build/gc-eu-mq/oot-gc-eu-mq.z64 diff --git a/tools/decompress_baserom.py b/tools/decompress_baserom.py index 799c66a1e0..13b57265f6 100755 --- a/tools/decompress_baserom.py +++ b/tools/decompress_baserom.py @@ -88,9 +88,10 @@ def decompress_rom( dma_entry.to_bin(entry_data) decompressed.write(entry_data) # pad to size - padding_end = round_up(dma_entries[-1].vrom_end, 14) - decompressed.seek(padding_end - 1) - decompressed.write(bytearray([0])) + padding_start = dma_entries[-1].vrom_end + padding_end = round_up(padding_start, 12) + decompressed.seek(padding_start) + decompressed.write(b"\x00" * (padding_end - padding_start)) # re-calculate crc return bytearray(update_crc(decompressed).getbuffer()) @@ -127,9 +128,10 @@ def byte_swap(file_content: bytearray) -> bytearray: def per_version_fixes(file_content: bytearray, version: str) -> bytearray: if version == "gc-eu-mq-dbg": - # Strip the overdump + # Strip the overdump, which consists of an area of 0xFF bytes (which may + # be erased flash memory) and ROM data from an unrelated game print("Stripping overdump...") - file_content = file_content[0:0x3600000] + file_content = file_content[0:0x035CF000] # Patch the header print("Patching header...") @@ -137,15 +139,6 @@ def per_version_fixes(file_content: bytearray, version: str) -> bytearray: return file_content -def pad_rom(file_content: bytearray, dma_entries: list[dmadata.DmaEntry]) -> bytearray: - padding_start = round_up(dma_entries[-1].vrom_end, 12) - padding_end = round_up(dma_entries[-1].vrom_end, 14) - print(f"Padding from {padding_start:X} to {padding_end:X}...") - for i in range(padding_start, padding_end): - file_content[i] = 0xFF - return file_content - - # Determine if we have a ROM file ROM_FILE_EXTENSIONS = ["z64", "n64", "v64"] @@ -227,8 +220,6 @@ def main(): file_content, dmadata_start, dma_entries, is_zlib_compressed ) - file_content = pad_rom(file_content, dma_entries) - # Check to see if the ROM is a "vanilla" ROM str_hash = get_str_hash(file_content) if str_hash != correct_str_hash: @@ -237,7 +228,7 @@ def main(): ) if version == "gc-eu-mq-dbg": - if str_hash == "32fe2770c0f9b1a9cd2a4d449348c1cb": + if str_hash == "9fede30e3239558cf3993f12b7ed7458": print( "The provided baserom is a rom which has been edited with ZeldaEdit and is not suitable for use with decomp. Find a new one." ) diff --git a/tools/elf2rom.c b/tools/elf2rom.c index 907e4e32b4..21c5337ba5 100644 --- a/tools/elf2rom.c +++ b/tools/elf2rom.c @@ -33,12 +33,6 @@ static bool parse_number(const char *str, int *num) return endptr > str; } -static unsigned int round_up(unsigned int num, unsigned int multiple) -{ - num += multiple - 1; - return num / multiple * multiple; -} - static char *sprintf_alloc(const char *fmt, ...) { va_list args; @@ -163,11 +157,10 @@ static void parse_input_file(const char *filename) free(syms); } -// Writes the N64 ROM, padding the file size to a multiple of 1 MiB +// Writes the N64 ROM static void write_rom_file(const char *filename, int cicType) { - size_t fileSize = round_up(g_romSize, 0x100000); - uint8_t *buffer = calloc(fileSize, 1); + uint8_t *buffer = calloc(g_romSize, 1); int i; uint32_t chksum[2]; @@ -179,16 +172,13 @@ static void write_rom_file(const char *filename, int cicType) memcpy(buffer + g_romSegments[i].romStart, g_romSegments[i].data, size); } - // pad the remaining space with 0xFF - memset(buffer + g_romSize, 0xFF, fileSize - g_romSize); - // write checksum if (!n64chksum_calculate(buffer, cicType, chksum)) util_fatal_error("invalid cic type %i", cicType); util_write_uint32_be(buffer + 0x10, chksum[0]); util_write_uint32_be(buffer + 0x14, chksum[1]); - util_write_whole_file(filename, buffer, fileSize); + util_write_whole_file(filename, buffer, g_romSize); free(buffer); }