Files
tmc/tools/script_disassembler/incbin_parser.py
T
2021-03-06 14:53:33 +01:00

76 lines
2.3 KiB
Python

# This python script reads the script.s file which contains all the .incbin macros
# Then it fetches the corresponding data of the baserom, o
TMC_FOLDER='../..'
import subprocess
import sys
from script_disassembler import disassemble_script, generate_macros
ROM_OFFSET=0x08000000
SCRIPTS_START=0x08008B5C
SCRIPTS_END=0x08016984
# cat data/scripts.s | grep @ | cut -d " " -f 3 | sed -e 's/^/0x/' | sed -e 's/\\n/, /g' > labels.txt
def read_baserom():
# read baserom data
with open(f'{TMC_FOLDER}/baserom.gba', 'rb') as baserom:
return bytearray(baserom.read())
def get_label(addr):
return hex(addr).upper().replace('0X', 'gUnk_0')
def main():
baserom_data = read_baserom()
script_start = SCRIPTS_START-ROM_OFFSET
scripts = ''' .include "asm/macros.inc"
.include "constants/constants.inc"
.include "asm/macros/scripts.inc"
.syntax unified
.text
'''
while script_start < SCRIPTS_END-ROM_OFFSET:
label = get_label(script_start+ROM_OFFSET)
print(f"Disassembling \033[1;34m{label}\033[0m ({script_start} / { SCRIPTS_END-ROM_OFFSET} bytes converted)...")
# find end of the script signified by 0xffff0000
script_end = baserom_data.index(b'\xff\xff\x00\x00', script_start) + 4
if script_end > SCRIPTS_END-ROM_OFFSET:
script_end = SCRIPTS_END-ROM_OFFSET
script_start+ROM_OFFSET
# read data from rom
data = baserom_data[script_start:script_end]
scripts += f' .include "data/scripts/{label}.inc"\n'
stdout = sys.stdout
with open(f'{TMC_FOLDER}/data/scripts/{label}.inc','w') as out:
sys.stdout = out
print(f'SCRIPT_START {label}')
res = disassemble_script(data)
if res != 0:
# Script ended in the middle, need to create a new file
script_end = script_start + res
sys.stdout = stdout
script_start = script_end
print('Writing scripts.s file...')
with open(f'{TMC_FOLDER}/data/scripts.s', 'w') as out:
out.write(scripts)
print('Generating asm macros...')
stdout = sys.stdout
with open(f'{TMC_FOLDER}/asm/macros/scripts.inc', 'w') as out:
sys.stdout = out
generate_macros()
sys.stdout = stdout
print('\033[1;92mDone\033[0m\n')
if __name__ == '__main__':
main()