From c8cd0bda54fd0468e89bd332e03e053c7314dc88 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Sun, 4 Feb 2024 14:29:13 +0100 Subject: [PATCH] initial F3DEX3 setup --- .gitignore | 4 ++- F3DEX3/F3DEX3.code.bps | Bin 0 -> 4514 bytes F3DEX3/F3DEX3.data.bps | Bin 0 -> 231 bytes Makefile | 16 ++++++++--- tools/data_extractor.py | 61 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 F3DEX3/F3DEX3.code.bps create mode 100644 F3DEX3/F3DEX3.data.bps create mode 100644 tools/data_extractor.py diff --git a/.gitignore b/.gitignore index abd559670..f510d8676 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,9 @@ build/*/cache/ *.wad out.txt *.ram -common-key.bin +*.bin +F3DEX3/*.code +F3DEX3/*.data # Tool artifacts tools/mipspro7.2_compiler/ diff --git a/F3DEX3/F3DEX3.code.bps b/F3DEX3/F3DEX3.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..32809196a81d7cd3b6151d2591aef9833b5c15d4 GIT binary patch literal 4514 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 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3.data.bps b/F3DEX3/F3DEX3.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..7f237e3aeb2a2aeda37e180c52418fe841f93427 GIT binary patch literal 231 zcmZZpJRI5ylEhl?uU$rA3LUc?xO@ewleC zsd*{+ItuRbPC<@-&K~jM3T3H9#hLke@s|TyT3Y}Anatj_mWhGIfuWwE{y)<<;Z1DK zb}fu;jSaIETIbK~{QrN!Wb4*RD$SGrH~yd3u#tg*ft8nqhdY3QfjeN5Qj22a0;U9p zTMP^gKNvPJZV;RztOLRV7X%mt_6X<*G6=-T&k%efm?Ahs;D$hrK!v~+fh%GYq&fs` hgmt8Oq*WN?OH~n3H`vG1xQjY)t literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile index cdb7e55fd..4bd8099f7 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ endif $(shell touch src/boot/build.c) ifeq ($(VERSION),hackeroot-mq) - SEGMENT_VERSION := hackeroot-mq + BASEROM_VERSION := hackeroot-mq CFLAGS += -DENABLE_HACKEROOT=1 CPPFLAGS += -DENABLE_HACKEROOT=1 OPTFLAGS := -Os @@ -115,7 +115,7 @@ else OPTFLAGS := -O2 -g3 endif - SEGMENT_VERSION := gc-eu-mq-dbg + BASEROM_VERSION := gc-eu-mq-dbg CFLAGS += -DENABLE_HACKEROOT=0 CPPFLAGS += -DENABLE_HACKEROOT=0 endif @@ -227,7 +227,7 @@ ASSET_FILES_OUT := $(foreach f,$(ASSET_FILES_XML:.xml=.c),$f) \ UNDECOMPILED_DATA_DIRS := $(shell find data -type d) # TODO: for now, ROM segments are still taken from the Debug ROM even when building other versions -BASEROM_SEGMENTS_DIR := baseroms/$(SEGMENT_VERSION)/segments +BASEROM_SEGMENTS_DIR := baseroms/$(BASEROM_VERSION)/segments BASEROM_BIN_FILES := $(wildcard $(BASEROM_SEGMENTS_DIR)/*) # source files @@ -313,6 +313,7 @@ ifeq ($(VERSION),hackeroot-mq) cp baseroms/hackeroot-mq/baserom-decompressed.z64 baseroms/gc-eu-mq-dbg/ endif endif + $(MAKE) f3dex3 run: $(ROM) ifeq ($(N64_EMULATOR),) @@ -323,7 +324,14 @@ endif patch: $(FLIPS) --create --bps $(BASEROM_PATCH) $(ROM) $(BPS) -.PHONY: all rom compress clean assetclean distclean venv setup run wad patch +f3dex3: + $(PYTHON) tools/data_extractor.py --start 0xBCD0F0 --size 0x1630 --input baseroms/$(BASEROM_VERSION)/baserom-decompressed.z64 --output F3DEX3/f3dzex2.code + $(PYTHON) tools/data_extractor.py --start 0xBCE720 --size 0x420 --input baseroms/$(BASEROM_VERSION)/baserom-decompressed.z64 --output F3DEX3/f3dzex2.data + $(FLIPS) --apply F3DEX3/F3DEX3.code.bps F3DEX3/f3dzex2.code F3DEX3/F3DEX3.code + $(FLIPS) --apply F3DEX3/F3DEX3.data.bps F3DEX3/f3dzex2.data F3DEX3/F3DEX3.data + rm -r F3DEX3/f3dzex2.code F3DEX3/f3dzex2.data + +.PHONY: all rom compress clean assetclean distclean venv setup run wad patch f3dex3 .DEFAULT_GOAL := rom #### Various Recipes #### diff --git a/tools/data_extractor.py b/tools/data_extractor.py new file mode 100644 index 000000000..997ad52a6 --- /dev/null +++ b/tools/data_extractor.py @@ -0,0 +1,61 @@ +#!/usr/bin/python3 + +import argparse + + +def extract(start: int, size: int, input: str, output: str): + """Extracts ``size`` bytes from ``input``, at offset ``start``, and writes it to ``output`` + + Parameters: + - ``start``: int, defines where to start reading the file + - ``size``: int, how many bytes to read from the file + - ``input``: str, path to the file to read + - ``output``: str, path to the file to write + """ + + with open(input, "rb") as file: + file.seek(start) + data = file.read(size) + + with open(output, "wb") as file: + file.write(data) + + +def main(): + parser = argparse.ArgumentParser(description="Extracts data from a file for HackerOoT.") + + parser.add_argument( + "--start", + dest="start", + help="Offset to the data (uses hex)", + required=True, + ) + + parser.add_argument( + "--size", + dest="size", + help="How much to read (uses hex)", + required=True, + ) + + parser.add_argument( + "--input", + dest="input", + help="Input file", + required=True, + ) + + parser.add_argument( + "--output", + dest="output", + help="Output file", + required=True, + ) + + args = parser.parse_args() + extract(int(args.start, 16), int(args.size, 16), args.input, args.output) + print("Data extracted successfully!") + + +if __name__ == "__main__": + main()