From 461ab7759588c36a0dffd1ba91b3853bb402fc42 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Thu, 4 Mar 2021 23:21:37 +0100 Subject: [PATCH] Add parameters for all the commands --- data/scripts/gUnk_0800A8D4.inc | 14 ++++++ tools/script_disassembler/incbin_parser.py | 9 +++- .../script_disassembler.py | 48 +++++++++++++------ 3 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 data/scripts/gUnk_0800A8D4.inc diff --git a/data/scripts/gUnk_0800A8D4.inc b/data/scripts/gUnk_0800A8D4.inc new file mode 100644 index 00000000..df47f574 --- /dev/null +++ b/data/scripts/gUnk_0800A8D4.inc @@ -0,0 +1,14 @@ +sub_0807E004 +sub_0807EF80 0x0007 +sub_0807EB44 0x0004 +sub_0807E930 0x0008 +sub_0807E014 +sub_0807E690 0x00000001 +sub_0807EF80 0x0000 +sub_0807E6AC 0x00000020 +sub_0807EF80 0x0004 +sub_0807E680 0x003c +sub_0807EB44 0x0002 +sub_0807E680 0x000f +.short 0x0861 +.short 0x0006 diff --git a/tools/script_disassembler/incbin_parser.py b/tools/script_disassembler/incbin_parser.py index f20543a9..e0850f13 100644 --- a/tools/script_disassembler/incbin_parser.py +++ b/tools/script_disassembler/incbin_parser.py @@ -3,6 +3,7 @@ TMC_FOLDER='../..' import subprocess +import sys from script_disassembler import disassemble_script def main(): @@ -32,8 +33,12 @@ def main(): # read data from rom data = baserom_data[start:start+end] - print(f'DISASM {label}') - disassemble_script(data) + stdout = sys.stdout + with open(f'{TMC_FOLDER}/data/scripts/{label}.inc','w') as out: + sys.stdout = out + print(f'SCRIPT_START {label}') + disassemble_script(data) + sys.stdout = stdout # print new include label print(f'.include "data/scripts/{label}.inc"') diff --git a/tools/script_disassembler/script_disassembler.py b/tools/script_disassembler/script_disassembler.py index df2b54dc..b73afd61 100644 --- a/tools/script_disassembler/script_disassembler.py +++ b/tools/script_disassembler/script_disassembler.py @@ -26,6 +26,11 @@ def barray_to_u32_hex(barray): integers = struct.unpack('I'*count, barray) return [u32_to_hex(x) for x in integers] +# tries to directly reference the function this is pointing to +def get_pointer(barray): + integers = struct.unpack('I', barray) + return 'sub_' + (struct.pack('>I', integers[0]-1).hex()).upper() + commands = [ {'fun': 'nullsub_507', 'params': ''}, {'fun': 'sub_0807E004', 'params': '', 'name': 'start executing scripts'}, @@ -38,14 +43,14 @@ commands = [ {'fun': 'sub_0807E0B8', 'params': 'w', 'name': 'abs jump if'}, {'fun': 'sub_0807E0CC', 'params': 'w', 'name': 'abs jump if not'}, {'fun': 'sub_0807E0E0', 'params': 'w'}, - {'fun': 'sub_0807E10C', 'params':'w', 'name': 'Execute function via pointer'},# 'exec': sub_0807E10C}, - {'fun': 'sub_0807E124', 'params': 'ww'}, + {'fun': 'sub_0807E10C', 'params':'p', 'name': 'Execute function via pointer'},# 'exec': sub_0807E10C}, + {'fun': 'sub_0807E124', 'params': 'pw'}, {'fun': 'sub_0807E148', 'params': 'w'}, {'fun': 'sub_0807E158', 'params': 'w'}, {'fun': 'sub_0807E188', 'params': 's'}, {'fun': 'sub_0807E1D8', 'params': 's'}, {'fun': 'sub_0807E4AC', 'params': 's'}, - {'fun': 'sub_0807E200', 'params': 'w'}, + {'fun': 'sub_0807E200', 'params': 's'}, {'fun': 'sub_0807E220', 'params': 'ss'}, {'fun': 'sub_0807E240', 'params': 's'}, {'fun': 'sub_0807E260', 'params': 's'}, @@ -83,7 +88,7 @@ commands = [ {'fun': 'sub_0807E700', 'params': ''}, {'fun': 'sub_0807E72C', 'params': ''}, {'fun': 'sub_0807E75C', 'params': ''}, - {'fun': 'sub_0807E778', 'params': ''}, + {'fun': 'sub_0807E778', 'params': 's'}, {'fun': 'sub_0807E788', 'params': 'w'}, {'fun': 'sub_0807E79C', 'params': ''}, {'fun': 'nullsub_508', 'params': 's'}, @@ -146,7 +151,7 @@ commands = [ {'fun': 'sub_0807EE04', 'params': 'ss'}, {'fun': 'sub_0807EE30', 'params': ''}, {'fun': 'sub_0807EEB4', 'params': ''}, - {'fun': 'sub_0807EEF4', 'params': ''}, + {'fun': 'sub_0807EEF4', 'params': 'ss'}, {'fun': 'sub_0807EF3C', 'params': 'ss'}, {'fun': 'sub_0807EF80', 'params': 's'}, {'fun': 'sub_0807EF90', 'params': 's'}, @@ -205,13 +210,29 @@ parameters = { 'param': 'a,b,c', 'expr': ' .short \\a\n .short \\b\n .short \\c', 'read': lambda ctx: ', '.join(barray_to_u16_hex(ctx.data[ctx.ptr+2:ctx.ptr+8])) + }, + 'p': { + 'length': 2, + 'param': 'w', + 'expr': ' .word \w', + 'read': lambda ctx: get_pointer(ctx.data[ctx.ptr+2:ctx.ptr+6]) + }, + 'pw': { + 'length': 4, + 'param': 'a,b', + 'expr': ' .word \\a\n .word \\b', + 'read': lambda ctx: get_pointer(ctx.data[ctx.ptr+2:ctx.ptr+6]) + ', ' + barray_to_u32_hex(ctx.data[ctx.ptr+6:ctx.ptr+10])[0] }, } def ExecuteScriptCommandSet(ctx: Context): cmd = struct.unpack('H', ctx.data[ctx.ptr:ctx.ptr+2])[0] - if cmd == 0 or cmd ==0xffff: + if cmd == 0: + return 0 + if cmd == 0xffff: + ctx.ptr += 2 + print('SCRIPT_END') return 0 unk_06 = cmd >> 0xA @@ -220,7 +241,6 @@ def ExecuteScriptCommandSet(ctx: Context): return 0 operationId = cmd & 0x3FF if operationId >= len(commands): - print('ERR: NO CMD') # TODO error return 0 command = commands[operationId] @@ -240,12 +260,13 @@ def ExecuteScriptCommandSet(ctx: Context): raise Exception('Parameter configuration ' + command['params'] + ' not defined') params = parameters[command['params']] if unk_06-1 != params['length']: - # TODOraise Exception(f'Call {command["fun"]} with ' + str(unk_06-1) +' length, while length of ' + str(params['length'])+' defined') + # raise Exception(f'Call {command["fun"]} with ' + str(unk_06-1) +' length, while length of ' + str(params['length'])+' defined') + return 0 + #with open('log.txt', 'a') as log: +# log.write(f'Call {command["fun"]} with ' + str(unk_06-1) +' length, while length of ' + str(params['length'])+' defined\n') # TEMPORARY WORKAROUND: - print(ctx.ptr, unk_06, cmd) - ctx.ptr += unk_06*2 - return 1 - + #ctx.ptr += unk_06*2 + #return 1 print(command['fun'] + ' ' + params['read'](ctx)) @@ -291,8 +312,7 @@ def generate_macros(): print('') for num, command in enumerate(commands): if not 'params' in command: - #raise Exception('Parameters not defined for ' + command['fun'] + ' Should be of length ' + str(param_length)) - continue # TODO + raise Exception('Parameters not defined for ' + command['fun'] + '!') if not command['params'] in parameters: raise Exception('Parameter configuration ' + command['params'] + ' not defined')