From 34378fe3fbf2f81e5d9769ba8d09bc38dbc91257 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 18 Dec 2019 09:07:53 -0500 Subject: [PATCH] Final Smash on FireRed baserom.gba --- .gitignore | 2 - .travis.yml | 4 - INSTALL.md | 12 +- baserom.ips | Bin 40940 -> 0 bytes tools/br_ips/Makefile | 16 -- tools/br_ips/br_ips.c | 328 --------------------------------------- tools/br_ips/global.h | 27 ---- tools/br_ips/ips_patch.c | 68 -------- 8 files changed, 1 insertion(+), 456 deletions(-) delete mode 100644 baserom.ips delete mode 100644 tools/br_ips/Makefile delete mode 100644 tools/br_ips/br_ips.c delete mode 100644 tools/br_ips/global.h delete mode 100644 tools/br_ips/ips_patch.c diff --git a/.gitignore b/.gitignore index 67e416fd7..c0b0cb86c 100644 --- a/.gitignore +++ b/.gitignore @@ -46,8 +46,6 @@ src/data/wild_encounters.h tags tools/agbcc tools/binutils -tools/br_ips/br_ips -tools/br_ips/ips_patch types_*.taghl !.travis/calcrom/calcrom.pl !sound/programmable_wave_samples/*.pcm diff --git a/.travis.yml b/.travis.yml index af94cfe81..519ba1aca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,10 +25,6 @@ matrix: - g++-7 env: _="Build" script: - - head -c 16777216 /dev/zero > tmp.bin - - make ips_patch -C tools/br_ips - - tools/br_ips/ips_patch tmp.bin baserom.ips baserom.gba - - rm tmp.bin - make tools CXX=g++-7 - make -j2 compare after_success: diff --git a/INSTALL.md b/INSTALL.md index 4829680de..729014051 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -42,14 +42,4 @@ If only `.c` or `.s` files were changed, turn off the dependency scanning tempor make -j$(nproc) NODEP=1 -**Note (until further notice):** If this is your first time building Pokemon FireRed, an unmodified copy of Pokemon FireRed is required in the project root under the name `baserom.gba`. To generate this, you should run the following commands: - - make ips_patch -C tools/br_ips - head -c 16777216 /dev/zero > tmp.bin - tools/br_ips/ips_patch tmp.bin baserom.ips baserom.gba - make compare -j$(nproc) - cp pokefirered.gba baserom.gba - -Alternatively, you can obtain an unmodified copy of Pokemon FireRed and use that as baserom.gba. Make sure the SHA1 checksum matches with what's provided in [the README](README.md). - -**Note 2:** If the build command is not recognized on Linux, including the Linux environment used within Windows, run `nproc` and replace `$(nproc)` with the returned value (e.g.: `make -j4`). Because `nproc` is not available on macOS, the alternative is `sysctl -n hw.ncpu`. +**Note:** If the build command is not recognized on Linux, including the Linux environment used within Windows, run `nproc` and replace `$(nproc)` with the returned value (e.g.: `make -j4`). Because `nproc` is not available on macOS, the alternative is `sysctl -n hw.ncpu`. diff --git a/baserom.ips b/baserom.ips deleted file mode 100644 index 55a409caf00beb6d9a6f4d88c11199bfbe90854d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40940 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⩔ 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 diff --git a/tools/br_ips/Makefile b/tools/br_ips/Makefile deleted file mode 100644 index 8b6ad51bf..000000000 --- a/tools/br_ips/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -CC := gcc -CFLAGS := -O3 -std=c99 - -.PHONY: all - -all: br_ips ips_patch - @: - -clean: - rm -f br_ips ips_patch br_ips.exe ips_patch.exe - -br_ips: br_ips.c - $(CC) $(CFLAGS) -o $@ $^ - -ips_patch: ips_patch.c - $(CC) $(CFLAGS) -o $@ $^ diff --git a/tools/br_ips/br_ips.c b/tools/br_ips/br_ips.c deleted file mode 100644 index 58e28202f..000000000 --- a/tools/br_ips/br_ips.c +++ /dev/null @@ -1,328 +0,0 @@ -#include -#include -#include -#include -#include -#include "global.h" - -static const char SPLASH[] = "IPS patch creator for undisassembled data\n" - "Created by PikalaxALT on 23 June 2019 All Rights Reserved\n"; - -static const char HELP[] = "br_ips\n" - "This utility is meant to be run with no arguments in the project root of a PRET AGB disassembly.\n" - "baserom.gba and ld_script.txt are required files which must be present in the project root.\n" - "ld_script.txt is a GNU linker script. For more details, see\n" - "https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_chapter/ld_3.html#SEC6.\n" - "All ELF targets in the linker script with Makefile rules \"%.o: %.s\" must have their sources present\n" - "at the indicated paths relative to the project root.\n" - "\n" - "Options:\n" - " -h - show this message and exit\n"; - -#if !defined(__CYGWIN__) && !defined(__APPLE__) && (_POSIX_C_SOURCE < 200809L || !_GNU_SOURCE) -static int getline(char ** lineptr, size_t * n, FILE * stream) { - // Static implementation of GNU getline - int i = 0; - int c; - if (n == NULL || lineptr == NULL || stream == NULL) return -1; - size_t size = *n; - char * buf = *lineptr; - if (buf == NULL || size < 4) { - size = 128; - *lineptr = buf = realloc(buf, 128); - } - if (buf == NULL) return -1; - while (1) { - c = getc(stream); - if (c == EOF) break; - buf[i++] = c; - if (c == '\n') break; - if (i == size - 1) { - size <<= 1; - buf = realloc(buf, size); - if (buf == NULL) return -1; - *lineptr = buf; - *n = size; - } - } - if (i == 0) return -1; - buf[i] = 0; - return i; -} -#endif - -static void getIncbinsFromFile(hunk_t ** hunks, size_t * num, size_t * maxnum, const char * fname, char ** strbuf, size_t * buffersize) { - // Recursively find incbinned segments and encode them as hunks. - FILE * file = fopen(fname, "r"); - if (file == NULL) return; - hunk_t * data = *hunks; - size_t nhunks = *num; - size_t maxnhunks = *maxnum; - int line_n = 0; // for error prints - while (getline(strbuf, buffersize, file) > 0) { - line_n++; - // If another file is included by this one, recurse into it. - char * include = strstr(*strbuf, ".include"); - if (include != NULL) { - char incfname[128]; - include = strchr(include, '"'); - if (include == NULL) FATAL_ERROR("%s:%d: malformed include\n", fname, line_n); - include++; - char * endq_p = strchr(include, '"'); - if (endq_p == NULL) FATAL_ERROR("%s:%d: malformed include\n", fname, line_n); - *endq_p = 0; - strcpy(incfname, include); - getIncbinsFromFile(&data, &nhunks, &maxnhunks, incfname, strbuf, buffersize); - continue; - } - // Check for a .incbin "baserom.gba" directive - char * line = strstr(*strbuf, ".incbin"); - if (line == NULL) continue; - line = strstr(line + sizeof(".incbin"), "\"baserom.gba\","); - if (line == NULL) continue; - line += sizeof("\"baserom.gba\",") - 1; - uint32_t incbinOffset; - // Enforce the structure .incbin "baserom.gba", offset, size - // Data cannot be located at offset 0, as that is the entry - // point (ARM code). - do { - if (*line == 0) FATAL_ERROR("%s:%d: malformed incbin\n", fname, line_n); - incbinOffset = strtoul(line, &line, 0); - line++; - } while (incbinOffset == 0); - size_t incbinSize; - do { - if (*line == 0) FATAL_ERROR("%s:%d: malformed incbin\n", fname, line_n); - incbinSize = strtoul(line, &line, 0); - line++; - } while (incbinSize == 0); - // Offset must fit in three bytes - if (incbinOffset >= 0x01000000) FATAL_ERROR("%s:%d: offset exceeds encodable limit\n", fname, line_n); - // Avoid confusion with the end sentinel - if (incbinOffset == 0x454F46) { // "EOF" - incbinOffset--; - incbinSize++; - } - // Cannot read past a certain point due to format restrictions - if (incbinOffset + incbinSize > 0xFFFFFF + 0xFFFF) FATAL_ERROR("%s:%d: size exceeds encodable limit\n", fname, line_n); - // Break up the incbin into hunks of maximum size 0xFFFF - do { - size_t trueSize = incbinSize <= 0xFFFF ? incbinSize : 0xFFFF; - if (nhunks >= maxnhunks) { - maxnhunks <<= 1; - data = realloc(data, maxnhunks * sizeof(hunk_t)); - if (data == NULL) FATAL_ERROR("unable to reallocate hunks buffer\n"); - } - data[nhunks].offset = incbinOffset; - data[nhunks].size = trueSize; - incbinOffset += trueSize; - incbinSize -= trueSize; - if (incbinOffset == 0x454F46) { - incbinOffset--; - data[nhunks].size--; - incbinSize++; - } - nhunks++; - } while (incbinSize > 0); - } - // Error check - if (!feof(file)) FATAL_ERROR("getline\n"); - fclose(file); - *hunks = data; - *num = nhunks; - *maxnum = maxnhunks; -} - -static hunk_t * getAllIncbins(FILE * ld_script, size_t * num_p) { - // Parse the ld script. - // Strict adherence to syntax is expected. - char * line = NULL; - size_t linesiz = 0; - char fname_buf[128]; - size_t maxnum = 256; - size_t num = 0; - // Allocate the hunks array. - hunk_t * hunks = malloc(256 * sizeof(hunk_t)); - if (hunks == NULL) FATAL_ERROR("failed to allocate hunks buffer\n"); - while (getline(&line, &linesiz, ld_script) > 0) { - char * endptr; - // We only expect hunks in rodata, script_data, and gfx_data sections. - if ((endptr = strstr(line, ".o(.rodata);")) == NULL - && (endptr = strstr(line, ".o(script_data);")) == NULL - && (endptr = strstr(line, ".o(gfx_data);")) == NULL) continue; - char * startptr = line; - // Skip whitespace. - while (isspace(*startptr)) startptr++; - if (strstr(startptr, ".a:") != NULL) continue; // no hunks in libs - if (strstr(startptr, "src/") == startptr) continue; // no hunks in src/ - // Replace the extension with .s and truncate the string - endptr[1] = 's'; - endptr[2] = 0; - // We're reusing the already-allocated string buffer, so - // copy the filename to the stack for use in error prints. - strcpy(fname_buf, startptr); - getIncbinsFromFile(&hunks, &num, &maxnum, fname_buf, &line, &linesiz); - } - // Error check - if (!feof(ld_script)) FATAL_ERROR("getline\n"); - free(line); - *num_p = num; - return hunks; -} - -static int cmp_baserom(const void * a, const void * b) { - // Comparison function for sorting Hunk structs. - // For more details, please refer to the qsort man pages. - // See also the function "collapseIncbins" below. - const hunk_t * aa = (const hunk_t *)a; - const hunk_t * bb = (const hunk_t *)b; - return (aa->offset > bb->offset) - (aa->offset < bb->offset); -} - -static void collapseIncbins(hunk_t * hunks, size_t * num_p) { - // This function merges adjacent hunks where possible. - size_t num = *num_p; - // Sort the array by offset increasing. - qsort(hunks, num, sizeof(hunk_t), cmp_baserom); - // We stop at num - 1 because we need to be able to look one - // entry ahead in the hunks array. - for (int i = 0; i < num - 1; i++) { - // Loop until the next hunk is not adjacent to the current. - while (hunks[i].offset + hunks[i].size == hunks[i + 1].offset) { - // If this hunk cannot be merged with the next, proceed to the next. - if (hunks[i].size == 0xFFFF || (hunks[i].size == 0xFFFE && hunks[i + 1].offset == 0x454F45)) break; - // If this hunk is empty, remove it. - if (hunks[i].size == 0) { - int j; - // Find the next non-empty hunk - for (j = i + 1; j < num; j++) { - if (hunks[j].size != 0) break; - } - if (j == num) { - // All remaining hunks are empty - num = i; - break; - } - // Compaction - // Use a for loop instead of memcpy to avoid UB from - // overlapping buffers. - for (int k = 0; k < num - j; k++) hunks[i + k] = hunks[j + k]; - num -= j - i; - if (i >= num - 1) break; - } - else - { - // Combine this hunk with the next - hunks[i].size += hunks[i + 1].size; - if (hunks[i].size > 0xFFFF) { - // Split the hunk back up, it's too big to encode. - // Set the earlier hunk to the maximum permitted size, - // and the following hunk to the remainder. - hunks[i + 1].size = hunks[i].size - 0xFFFF; - hunks[i].size = 0xFFFF; - hunks[i + 1].offset = hunks[i].offset + 0xFFFF; - // If this operation would confuse the hunk with the - // EOF sentinel, fix that. - if (hunks[i + 1].offset == 0x454F46) { - hunks[i].size--; - hunks[i + 1].offset--; - hunks[i + 1].size++; - } - break; - } else { - // Compaction - // Use a for loop instead of memcpy to avoid UB from - // overlapping buffers. - for (int j = i + 1; j < num - 1; j++) hunks[j] = hunks[j + 1]; - num--; - if (i >= num - 1) break; - } - } - } - } - *num_p = num; -} - -static void writePatch(const char * filename, const hunk_t * hunks, size_t num, FILE * rom) { - // Create an IPS patch. - // The file is headed with a magic code which is "PATCH" in ASCII. - // Following that are the "hunks": 3-byte offset, 2-byte size, and - // the literal data. The file is ended with "EOF", again in ASCII. - // For that reason, an offset of 0x454F46 cannot be encoded directly. - // Offset and size are encoded big-endian. - FILE * file = fopen(filename, "wb"); - if (file == NULL) FATAL_ERROR("unable to open file \"%s\" for writing\n", filename); - // Maximum hunk size is 65535 bytes. For convenience, we allocate a - // round 65536 (0x10000). This has no effect on memory consumption, - // as malloc will round this up anyway. - char * readbuf = NULL; - if (rom != NULL) { - readbuf = malloc(0x10000); - if (readbuf == NULL) FATAL_ERROR("failed to allocate write buffer\n"); - } - fwrite("PATCH", 1, 5, file); // magic - if (readbuf != NULL) { - for (int i = 0; i < num; i++) { - // Encode the offset - uint32_t offset = hunks[i].offset; - putc(offset >> 16, file); - putc(offset >> 8, file); - putc(offset >> 0, file); - // Encode the size - size_t size = hunks[i].size; - putc(size >> 8, file); - putc(size >> 0, file); - // Yank the data straight from the ROM - if (fseek(rom, offset, SEEK_SET)) FATAL_ERROR("seek\n"); - if (fread(readbuf, 1, size, rom) != size) FATAL_ERROR("read\n"); - if (fwrite(readbuf, 1, size, file) != size) FATAL_ERROR("write\n"); - } - free(readbuf); - } - // Write the EOF magic - fwrite("EOF", 1, 3, file); - fclose(file); -} - -// This script takes no arguments. -int main(int argc, char ** argv) { - // Show a friendly message - puts(SPLASH); - // If requested, show help message - if (argc >= 2 && strcmp(argv[1], "-h") == 0) { - puts(HELP); - return 0; - } - // This script expects to be in a PRET AGB disassembly project root. - // Required files include baserom.gba, ld_script.txt, and all paths - // referenced in ld_script.txt relative to the project root. - FILE * rom = fopen("baserom.gba", "rb"); - if (rom == NULL) FATAL_ERROR("unable to open \"baserom.gba\" for reading\n"); - FILE * ld_script = fopen("ld_script.txt", "r"); - if (ld_script == NULL) FATAL_ERROR("unable to open \"ld_script.txt\" for reading\n"); - // Find all instances where segments of baserom.gba are incbinned literaly. - size_t num = 0; - hunk_t * hunks = getAllIncbins(ld_script, &num); - fclose(ld_script); - if (num == 0) { - // If this line is printed, the script was unable to find any - // `.incbin "baserom.gba"` lines. - // If this is incorrect, please contact the developer. - puts("No baserom.gba hunks found!\n" - "If there are baserom.gba hunks in this project,\n" - "please ping PikalaxALT on the pret discord,\n" - "channel #gen-3-help.\n"); - writePatch("baserom.ips", NULL, 0, NULL); - } else { - // Merge neighboring hunks to reduce the number of hunks. - collapseIncbins(hunks, &num); - // Encode the hunks in the IPS patch. - writePatch("baserom.ips", hunks, num, rom); - } - // Communicate status to the user. - puts("IPS file created at baserom.ips\n"); - // Clean up and return. - fclose(rom); - free(hunks); - return 0; -} diff --git a/tools/br_ips/global.h b/tools/br_ips/global.h deleted file mode 100644 index b82c516ba..000000000 --- a/tools/br_ips/global.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef GUARD_BR_IPS_GLOBAL_H -#define GUARD_BR_IPS_GLOBAL_H - -#ifdef _MSC_VER - -#define FATAL_ERROR(format, ...) \ -do { \ - fprintf(stderr, format, __VA_ARGS__); \ - exit(1); \ -} while (0) - -#else - -#define FATAL_ERROR(format, ...) \ -do { \ - fprintf(stderr, format, ##__VA_ARGS__); \ - exit(1); \ -} while (0) - -#endif // _MSC_VER - -typedef struct Hunk { - uint32_t offset; - size_t size; -} hunk_t; - -#endif //GUARD_BR_IPS_GLOBAL_H diff --git a/tools/br_ips/ips_patch.c b/tools/br_ips/ips_patch.c deleted file mode 100644 index c912474a8..000000000 --- a/tools/br_ips/ips_patch.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -#include "global.h" - -static const char SPLASH[] = "Small IPS patch utility\n" - "Created by PikalaxALT on 23 June 2019 All Rights Reserved\n"; - -static const char HELP[] = "ips_patch [-h] ROM PATCH OUT\n" - "\n" - " ROM - input ROM file\n" - " PATCH - IPS patch file to apply\n" - " OUT - path to write patched ROM\n" - "\n" - "Options:\n" - " -h - show this message and exit\n"; - -int main(int argc, char ** argv) { - // Show a friendly message - puts(SPLASH); - // If requested, show help message - if (argc >= 2 && strcmp(argv[1], "-h") == 0) { - puts(HELP); - return 0; - } - // Enforce CLI syntax - if (argc != 4) FATAL_ERROR("usage: %s [-h] ROM PATCH OUT\n", argv[0]); - FILE * rom = fopen(argv[1], "rb"); - if (rom == NULL) FATAL_ERROR("failed to open file \"%s\" for reading\n", argv[1]); - FILE * patch = fopen(argv[2], "rb"); - if (patch == NULL) FATAL_ERROR("failed to open file \"%s\" for reading\n", argv[2]); - FILE * out = fopen(argv[3], "wb"); - if (patch == NULL) FATAL_ERROR("failed to open file \"%s\" for writing\n", argv[3]); - // IPS magic header - char magic[5]; - if (fread(magic, 1, 5, patch) != 5) FATAL_ERROR("read magic\n"); - if (memcmp(magic, "PATCH", 5) != 0) FATAL_ERROR("malformed IPS patch\n"); - // Read the ROM into allocated memory. - fseek(rom, 0, SEEK_END); - size_t romsize = ftell(rom); - fseek(rom, 0, SEEK_SET); - char * buffer = malloc(romsize); - if (buffer == NULL) FATAL_ERROR("failed to allocate dest buffer\n"); - if (fread(buffer, 1, romsize, rom) != romsize) FATAL_ERROR("read ROM\n"); - fclose(rom); - while (1) { - uint32_t offset; - size_t size; - // Read each hunk into the buffer, overwriting previous data. - // If two or more hunks overlap, the newest one is retained. - // A good IPS patch creator will avoid this. - offset = (unsigned char)getc(patch) << 16; - offset |= (unsigned char)getc(patch) << 8; - offset |= (unsigned char)getc(patch); - if (offset == 0x454F46) break; // end sentinel "EOF" - size = (unsigned char)getc(patch) << 8; - size |= (unsigned char)getc(patch); - if (offset + size > romsize) FATAL_ERROR("segment extends past end of ROM\n"); - if (fread(buffer + offset, 1, size, patch) != size) FATAL_ERROR("read segment\n"); - } - fclose(patch); - // Write the patched ROM - fwrite(buffer, 1, romsize, out); - fclose(out); - free(buffer); - return 0; -}