50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
# sadly heavily based on code by chat-gpt
|
|
# loads the original binaries into flash and allows bigger roms to load like the pokemon games
|
|
|
|
import os
|
|
|
|
Import("env")
|
|
from SCons.Script import Builder
|
|
|
|
# read build flags (CPP defines)
|
|
flags = env.ParseFlags(env['BUILD_FLAGS'])
|
|
defs = {items[0]: items[1] for items in flags.get("CPPDEFINES", {}) if isinstance(items, list) and len(items) == 2}
|
|
|
|
# passed via -DROM_FILENAME=...
|
|
rom_filename = defs.get("ROM_FILENAME", "custom_rom.gb")
|
|
|
|
# Get the project root directory
|
|
project_root = env.Dir('#').abspath
|
|
|
|
# autogenerate original symbol names used by objcopy
|
|
auto_sym_base = rom_filename.replace(".", "_").replace(" ", "_")
|
|
|
|
# used to replace the symbol names
|
|
orig_start = f"_binary_{auto_sym_base}_start"
|
|
orig_end = f"_binary_{auto_sym_base}_end"
|
|
|
|
# your preferred symbol names
|
|
new_start = f"_binary_custom_rom_start"
|
|
new_end = f"_binary_custom_rom_end"
|
|
|
|
# Create a binary-to-object builder
|
|
bin2obj = Builder(
|
|
action = (
|
|
"arm-none-eabi-objcopy -I binary -O elf32-littlearm -B arm "
|
|
"--rename-section .data=.rodata,alloc,load,readonly,data,contents "
|
|
"--set-section-alignment .rodata=4 "
|
|
f"--redefine-sym {orig_start}={new_start} "
|
|
f"--redefine-sym {orig_end}={new_end} "
|
|
"$SOURCE $TARGET"
|
|
),
|
|
suffix = ".o",
|
|
src_suffix = ".gb"
|
|
)
|
|
|
|
env.Append(BUILDERS = {"BinToObj": bin2obj})
|
|
|
|
# Convert ROM into an object file and link it in
|
|
rom_path = os.path.join(project_root, rom_filename)
|
|
rom_obj = env.BinToObj(rom_path) # produces custom_rom.gb.o
|
|
env.Append(LIBS=[rom_obj])
|