diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30f2c056..e1d526c9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,6 +44,7 @@ jobs: - name: Build N64FlashcartMenu ROM run: | mkdir build + mkdir output # TODO: split this to use params for each flashcart type. make -j all @@ -52,9 +53,10 @@ jobs: with: name: N64FlashcartMenu path: | - ./build/N64FlashcartMenu.z64 + ./output/N64FlashcartMenu.z64 + ./build/N64FlashcartMenu.elf - finalize-sc64-menu: + minify-sc64-menu: runs-on: ubuntu-latest needs: build @@ -74,12 +76,11 @@ jobs: uses: actions/download-artifact@v3 with: name: N64FlashcartMenu - path: ./build + path: ./ - name: Finalize rom run: | - cd ./build - python ../tools/sc64/finalize.py N64FlashcartMenu.z64 + python ./tools/sc64/minify.py ./build/N64FlashcartMenu.elf ./output/N64FlashcartMenu.z64 ./output/sc64menu.n64 continue-on-error: false - name: Upload artifact @@ -87,13 +88,13 @@ jobs: with: name: SC64-Menu path: | - ./build/sc64menu.n64 + ./output/sc64menu.n64 if-no-files-found: ignore # release-sc64-menu: # runs-on: ubuntu-latest - # needs: finalize-sc64-menu + # needs: minify-sc64-menu # steps: # - name: Generate release diff --git a/.gitignore b/.gitignore index 451eb336..11b26609 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /.vscode /build +/output tools/sc64/sc64.exe diff --git a/Makefile b/Makefile index df0cb8f5..55a1205f 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,10 @@ -# .DEFAULT_GOAL := mytarget +.DEFAULT_GOAL := all EXE_NAME = N64FlashcartMenu SOURCE_DIR = src BUILD_DIR = build +OUTPUT_DIR = output include $(N64_INST)/include/n64.mk @@ -32,12 +33,14 @@ $(BUILD_DIR)/$(EXE_NAME).elf: $(OBJS) $(EXE_NAME).z64: N64_ROM_TITLE=$(EXE_NAME) all: $(EXE_NAME).z64 - $(shell mv $(EXE_NAME).z64 $(BUILD_DIR)) - $(shell cd $(BUILD_DIR)/ && python3 ../tools/sc64/finalize.py ./$(EXE_NAME).z64) + $(shell mkdir $(OUTPUT_DIR)) + $(shell mv $(EXE_NAME).z64 $(OUTPUT_DIR)) + $(shell python3 ./tools/sc64/minify.py $(BUILD_DIR)/$(EXE_NAME).elf $(OUTPUT_DIR)/N64FlashcartMenu.z64 $(OUTPUT_DIR)/sc64menu.n64) .PHONY: all clean: $(shell rm -rf ./$(BUILD_DIR)) + $(shell rm -rf ./$(OUTPUT_DIR)) .PHONY: clean # run: diff --git a/tools/sc64/finalize.py b/tools/sc64/finalize.py deleted file mode 100644 index cdc02dd5..00000000 --- a/tools/sc64/finalize.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 - -import sys - - - -if __name__ == '__main__': - if (len(sys.argv) != 2): - print(f'Usage: python {sys.argv[0]} input') - sys.exit(1) - - ALIGN = 512 - STRIP_BYTE = b'\x00' - - input_file = sys.argv[1] - sc64_output = 'sc64menu.n64' - - try: - bin_data = b'' - - with open(input_file, 'rb') as f: - bin_data = f.read() - - bin_data = bin_data.strip(STRIP_BYTE) - modulo = len(bin_data) % ALIGN - if (modulo > 0): - bin_data += STRIP_BYTE * (ALIGN - modulo) - - with open(sc64_output, 'wb') as f: - f.write(bin_data) - - except FileNotFoundError as e: - print(f'Couldn\'t open file: {e}') - sys.exit(2) - - except Exception as e: - print(e) - sys.exit(3) diff --git a/tools/sc64/minify.py b/tools/sc64/minify.py new file mode 100644 index 00000000..4bb1bed4 --- /dev/null +++ b/tools/sc64/minify.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import sys +from subprocess import Popen, PIPE + + +def get_rom_end(elf): + p1 = Popen(f'readelf -s {elf}'.split(), stdout=PIPE) + p2 = Popen('grep -m 1 __rom_end'.split(), stdin=p1.stdout, stdout=PIPE) + stdout, _ = p2.communicate() + rom_end = int(stdout.decode('UTF-8').split()[1], 16) + rom_end &= 0x1FFFFFFF + rom_end -= 0x400 + rom_end += 0x1000 + return rom_end + + +if __name__ == '__main__': + if (len(sys.argv) != 4): + print(f'Usage: python {sys.argv[0]} elf input output') + sys.exit(1) + + elf_file = sys.argv[1] + input_file = sys.argv[2] + output_file = sys.argv[3] + + ALIGN = 512 + + rom_end = get_rom_end(elf_file) + modulo = rom_end % ALIGN + if (modulo > 0): + rom_end += (ALIGN - modulo) + + minified_data = b'' + with open(input_file, 'rb') as f: + minified_data = f.read(rom_end) + + with open(output_file, 'wb') as f: + f.write(minified_data)