From 41d5fd161010329edfb49278db0c7e0c9db5240d Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Thu, 11 Feb 2021 00:04:58 +0900 Subject: [PATCH] Updates --- src/code_3251D0.c | 2 +- tools/add_to_symbol_addrs.py | 92 ++++++++++++++++++++++++------------ tools/symbol_addrs.txt | 8 ++-- 3 files changed, 66 insertions(+), 36 deletions(-) diff --git a/src/code_3251D0.c b/src/code_3251D0.c index 8b3e471db0..6e3e155b4b 100644 --- a/src/code_3251D0.c +++ b/src/code_3251D0.c @@ -10,7 +10,7 @@ ApiStatus func_802BD100_3251D0(ScriptInstance* script, s32 isInitialCall) { return ApiStatus_DONE2; } -ApiStatus func_802BD1AC_3251D0(ScriptInstance* script, s32 isInitialCall) { +ApiStatus func_802BD1AC_32527C(ScriptInstance* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; s32 a = get_variable(script, *args++); s32 b = get_variable(script, *args++); diff --git a/tools/add_to_symbol_addrs.py b/tools/add_to_symbol_addrs.py index 04308c1792..00639961d6 100755 --- a/tools/add_to_symbol_addrs.py +++ b/tools/add_to_symbol_addrs.py @@ -17,6 +17,8 @@ map_symbols = {} symbol_addrs = [] elf_symbols = [] +verbose = False + def scan_map(): ram_offset = None cur_file = "" @@ -61,9 +63,25 @@ def read_symbol_addrs(): for line in unique_lines: main, ext = line.rstrip().split(";") - args = ext.split("//")[-1].strip().split(" ") + opt = ext.split("//")[-1].strip().split(" ") + + type = None + rom = -1 + + args = [] + for thing in list(opt): + if thing.strip() == "": + opt.remove(thing) + if "type:" in thing: + type = thing.split(":")[1] + opt.remove(thing) + elif "rom:" in thing: + rom = int(thing.split(":")[1], 16) + opt.remove(thing) + name, addr = main.split(" = ") - symbol_addrs.append((name, int(addr, 0), args)) + + symbol_addrs.append([name, int(addr, 0), type, rom, opt]) def read_elf(): try: @@ -90,61 +108,73 @@ def read_elf(): else: type = "data" - opts = [f"type:{type}"] + rom = None if name in map_symbols: - opts.append(f"rom:0x{map_symbols[name][0]:X}") + rom = map_symbols[name][0] elif re.match(".*_[0-9A-F]{8}_[0-9A-F]{6}", name): - rom = name.split("_")[-1] - opts.append(f"rom:0x{rom}") + rom = int(name.split('_')[-1], 16) - elf_symbols.append((name, addr, opts)) + elf_symbols.append((name, addr, type, rom)) + +def log(s): + if verbose: + print(s) def reconcile_symbols(): print(f"Processing {str(len(elf_symbols))} elf symbols...") - for i, sym in enumerate(elf_symbols): + for i, elf_sym in enumerate(elf_symbols): if i % 1000 == 0: print(i) name_match = None rom_match = None - for sym2 in symbol_addrs: - + for known_sym in symbol_addrs: # Name if not name_match: - if sym[0] == sym2[0]: - name_match = sym2 + if elf_sym[0] == known_sym[0]: + name_match = known_sym - if sym[1] != sym2[1]: - print(f"Address mismatch! {sym[0]} is 0x{sym[1]:X} in the elf and 0x{sym2[1]} in symbol_addrs") - - if not rom_match: - if sym[2] == sym2[2]: - rom_match = sym2 + if elf_sym[1] != known_sym[1]: + log(f"Ram mismatch! {elf_sym[0]} is 0x{elf_sym[1]:X} in the elf and 0x{known_sym[1]} in symbol_addrs") # Rom if not rom_match: # Todo account for either or both syms not containing a rom addr - if sym[2] == sym2[2]: - rom_match = sym2 - - if not name_match: - if sym[0] == sym2[1]: - name_match = sym2 + if elf_sym[3]: + if elf_sym[3] == known_sym[3]: + rom_match = known_sym if not name_match and not rom_match: - # Todo add new symbol to symbol_addrs - pass + log(f"Creating new symbol {elf_sym[0]}") + symbol_addrs.append([elf_sym[0], elf_sym[1], elf_sym[2], elf_sym[3] if elf_sym[3] else -1, []]) elif not name_match: - #todo rename symbol in symbol_addrs - pass - elif not rom_match: - # todo add rom addr in symbol_addrs - pass + log(f"Renaming identical rom address symbol {rom_match[0]} to {elf_sym[0]}") + rom_match[0] = elf_sym[0] + elif not rom_match and elf_sym[3]: + if name_match[3] >= 0: + log(f"Correcting rom address {name_match[3]} to {elf_sym[3]} for symbol {name_match[0]}") + else: + log(f"Adding rom address {elf_sym[3]} to symbol {name_match[0]}") + name_match[3] = elf_sym[3] + +def write_new_symbol_addrs(): + with open(symbol_addrs_path, "w", newline="\n") as f: + for symbol in sorted(symbol_addrs, key=lambda x: (x[3] == -1, x[3], x[1], x[0])): + line = f"{symbol[0]} = 0x{symbol[1]:X}; //" + if symbol[2]: + line += f" type:{symbol[2]}" + if symbol[3] >= 0: + line += f" rom:0x{symbol[3]:X}" + if len(symbol[4]) > 0: + for thing in symbol[4]: + line += f" {thing}" + f.write(line + "\n") scan_map() read_symbol_addrs() read_elf() reconcile_symbols() +write_new_symbol_addrs() diff --git a/tools/symbol_addrs.txt b/tools/symbol_addrs.txt index 47f9d70d21..b4b0e61ffb 100644 --- a/tools/symbol_addrs.txt +++ b/tools/symbol_addrs.txt @@ -942,20 +942,20 @@ delete_player_actor = 0x80240D68; // type:func rom:0x16F648 begin_battle = 0x80241218; // type:func rom:0x16FAF8 update_heroes_start_turn = 0x80242024; // type:func rom:0x170904 switch_to_player = 0x80242AC8; // type:func rom:0x1713A8 -pause_set_cursor_opacity = 0x80242BA0; // seg_rom:0x135EE0 type:func +pause_set_cursor_opacity = 0x80242BA0; // rom:0x135EE0 type:func update_end_player_turn = 0x80242BB0; // type:func rom:0x171490 pause_interp_cursor = 0x80242E6C; // type:func rom:0x1361AC switch_to_partner = 0x80242F00; // type:func rom:0x1717E0 pause_interp_text_scroll = 0x80243418; // type:func rom:0x136758 pause_interp_vertical_scroll = 0x8024346C; // type:func rom:0x1367AC -pause_update_cursor = 0x802434DC; // seg_rom:0x135EE0 type:func +pause_update_cursor = 0x802434DC; // rom:0x13681C type:func pause_textbox_draw_contents = 0x80243570; // type:func rom:0x1368B0 pause_tutorial_draw_contents = 0x802437F4; // type:func rom:0x136B34 switch_order = 0x80243918; // type:func rom:0x1721F8 pause_init = 0x80244060; // type:func rom:0x1373A0 pause_tutorial_input = 0x802442A0; // type:func rom:0x1375E0 pause_handle_input = 0x80244424; // type:func rom:0x137764 -pause_cleanup = 0x80244708; // seg_rom:0x135EE0 type:func +pause_cleanup = 0x80244708; // rom:0x135EE0 type:func pause_get_total_equipped_bp_cost = 0x802447F4; // type:func rom:0x137B34 pause_draw_rect = 0x80244858; // type:func rom:0x137B98 pause_sort_item_list = 0x80244A4C; // type:func rom:0x137D8C @@ -6714,7 +6714,7 @@ func_80241508_D19CE8 = 0x80241508; // type:func rom:0xD19CE8 func_802411D8_D511C8 = 0x802411D8; // type:func rom:0xD511C8 func_80240B98_898178 = 0x80240B98; // type:func rom:0x898178 func_802424CC_A3B9AC = 0x802424CC; // type:func rom:0xA3B9AC -func_802BD1AC_3251D0 = 0x802BD1AC; // type:func rom:0x3251D0 +func_802BD1AC_3251D0 = 0x802BD1AC; // type:func rom:0x32527C func_802A992C_429C4C = 0x802A992C; // type:func rom:0x429C4C func_80240628_800EA8 = 0x80240628; // type:func rom:0x800EA8 func_80240340_EB5470 = 0x80240340; // type:func rom:0xEB5470