diff --git a/CMakeLists.txt b/CMakeLists.txt index 58d5eea..ca24595 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,12 +6,18 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(NOT DEFINED ENV{ARMCC_PATH}) message(FATAL_ERROR "please set ARMCC_PATH") endif() +if(NOT DEFINED ENV{RVCT40INC}) + message(FATAL_ERROR "please set RVCT40INC. Probably to ARMCC_PATH/include/windows") +endif() +if(NOT DEFINED ENV{RVCT40LIB}) + message(FATAL_ERROR "please set RVCT40LIB. Probably to ARMCC_PATH/include/lib") +endif() -find_program(ARM_ASM NAMES armasm.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH) -find_program(ARM_AR NAMES armar.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH) -find_program(ARM_CC NAMES armcc.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH) -find_program(ARM_LINK NAMES armlink.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH) -find_program(ARM_FROMELF NAMES fromelf.exe PATHS $ENV{ARMCC_PATH}/bin REQUIRED NO_DEFAULT_PATH) +find_program(ARM_ASM NAMES armasm.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH) +find_program(ARM_AR NAMES armar.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH) +find_program(ARM_CC NAMES armcc.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH) +find_program(ARM_LINK NAMES armlink.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH) +find_program(ARM_FROMELF NAMES fromelf.exe PATHS "$ENV{ARMCC_PATH}/win_32-pentium" REQUIRED NO_DEFAULT_PATH) macro (set_compilers) set(CMAKE_CXX_COMPILER_ID ARMCC) @@ -93,7 +99,7 @@ foreach(CPP_FILE ${cxxsourcefiles}) get_filename_component(FILE_NAME ${CPP_FILE} NAME_WE) add_custom_command( OUTPUT ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s - COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/tools/preproc.py ${CPP_FILE} ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s "${DISASSEMBLY_DIR}/" + COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/tools/preproc.py ${CPP_FILE} ${NON_MATCH_ASM_FILES}/${FILE_NAME}.s "${DISASSEMBLY_DIR}/" DEPENDS ${CPP_FILE} ) set_source_files_properties(${NON_MATCH_ASM_FILES}/${FILE_NAME}.s PROPERTIES COMPILE_FLAGS "--cpu=MPCore") diff --git a/Disassembly/CMakeLists.txt b/Disassembly/CMakeLists.txt index 2e1b31d..b97f1c6 100644 --- a/Disassembly/CMakeLists.txt +++ b/Disassembly/CMakeLists.txt @@ -35,7 +35,7 @@ add_custom_target( add_custom_command( DEPENDS extract_baserom - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ${TOOLS_DIR}/exefs2elf.py + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ${TOOLS_DIR}/exefs2elf.py OUTPUT ${BASEROM_DIR}/baserom.elf COMMENT "Creating baserom.elf..." ) @@ -59,7 +59,7 @@ add_custom_target( add_custom_command( DEPENDS n3dsdisasm ${BASEROM_DIR}/baserom_before_fixes.s - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/baserom_fixes.py ${BASEROM_DIR}/baserom_before_fixes.s ${BASEROM_DIR}/baserom.s + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/baserom_fixes.py ${BASEROM_DIR}/baserom_before_fixes.s ${BASEROM_DIR}/baserom.s OUTPUT ${BASEROM_DIR}/baserom.s COMMENT "Applying specific fixes to baserom_before_fixes.s to create baserom.s..." ) @@ -70,9 +70,9 @@ add_custom_target( ) add_custom_command( - DEPENDS n3dsdisasm_post_fixes create_elf - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/gcc_to_arm_asm.py ${BASEROM_DIR}/baserom.s asm - COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && py ./tools/split_arm_data_chunks.py + DEPENDS n3dsdisasm_post_fixes + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/gcc_to_arm_asm.py ${BASEROM_DIR}/baserom.s asm + COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && python ./tools/split_arm_data_chunks.py COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && touch split_asm.txt OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/split_asm.txt COMMENT "Splitting baserom.s and data chunks..." diff --git a/Disassembly/tools/n3dsdisasm.exe b/Disassembly/tools/n3dsdisasm.exe index 1cf2952..eff0eab 100644 Binary files a/Disassembly/tools/n3dsdisasm.exe and b/Disassembly/tools/n3dsdisasm.exe differ diff --git a/Disassembly/tools/split_arm_data_chunks.py b/Disassembly/tools/split_arm_data_chunks.py index d0ec1c6..5a06d43 100644 --- a/Disassembly/tools/split_arm_data_chunks.py +++ b/Disassembly/tools/split_arm_data_chunks.py @@ -1,56 +1,28 @@ # convert exefs to elf import os -import sys -from subprocess import run -# Ugliness in order to keep the script self-contained -try: - import tqdm -except ImportError: - print("Installing tqdm...") - def command(): - return run([sys.executable, '-m', 'pip', 'install', 'tqdm']) - # Sigh - if (command().returncode != 0): - # Package managers are cool, I say, as I close my eyes and - # ram through software with reckless abandon. - if (run([sys.executable, '-m', 'ensurepip']).returncode == 0): - # Alright pip is set up, lets give it another shot. If it - # doesn't work, then it's left up to the user. - command().check_returncode() -finally: - import tqdm - -BASEROMDIR = 'baserom/' -WORKDIR = BASEROMDIR + 'workdir/' +CODE_BIN = 'baserom/exefs/code.bin' DATADIR = 'data/' DATA_CHUNK_FILE = 'data_chunks.txt' RODATA_CHUNK_FILE = 'rodata_chunks.txt' SHT__INIT_ARRAY_FILE = 'SHT__INIT_ARRAY.txt' + def prepare_dirs(): os.makedirs(DATADIR, exist_ok=True) -def writefile(path, s) -> None: - with open(path, "wb") as f: - f.write(s) -def total_file_sizes() -> int: - return os.path.getsize(DATA_CHUNK_FILE) + \ - os.path.getsize(RODATA_CHUNK_FILE) + \ - os.path.getsize(SHT__INIT_ARRAY_FILE) - -def split_data_chunks_to_asm(progress: tqdm.tqdm) -> None: - for (bin_file, chunks_file, offset) in [('rw.bin', DATA_CHUNK_FILE, 0x4F9000), ('ro.bin', RODATA_CHUNK_FILE, 0x4CA000), ('text.bin', SHT__INIT_ARRAY_FILE, 0x100000)]: - with open(WORKDIR + bin_file, 'rb') as b: +def split_data_chunks_to_asm() -> None: + with open(CODE_BIN, 'rb') as b: + for chunks_file in [DATA_CHUNK_FILE, RODATA_CHUNK_FILE, SHT__INIT_ARRAY_FILE]: with open(chunks_file) as data: for line in data: splitLine = line.split(',') chunkName = splitLine[0] - chunkStart = int(splitLine[1].strip(), 16) - offset - chunkEnd = int(splitLine[2].strip(), 16) - offset + chunkStart = int(splitLine[1].strip(), 16) - 0x100000 + chunkEnd = int(splitLine[2].strip(), 16) - 0x100000 chunkSize = chunkEnd - chunkStart b.seek(chunkStart) chunkBin = b.read(chunkSize) @@ -64,8 +36,6 @@ def split_data_chunks_to_asm(progress: tqdm.tqdm) -> None: chunkARM.write(f"\tDCD 0x{dataWordString}\n") chunkARM.write("\tEND\n") - progress.update(len(line)) -with tqdm.tqdm(total=total_file_sizes()) as progress: - prepare_dirs() - split_data_chunks_to_asm(progress) +prepare_dirs() +split_data_chunks_to_asm()