1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-27 15:16:13 +00:00
oot/tools/bootstrap_overlay_decomp.py

115 lines
3.7 KiB
Python
Raw Normal View History

2020-03-17 04:31:30 +00:00
#!/usr/bin/python3
import re
import os
from disassemble import get_ovl_dir, get_z_name
script_dir = os.path.dirname(os.path.realpath(__file__))
root_dir = script_dir + "/../"
src_dir = root_dir + "src/overlays/"
asm_dir = root_dir + "asm/non_matchings/overlays/"
def get_overlays_to_bootstrap():
non_decomped_ovls = []
# traverse root directory, and list directories as dirs and files as files
for root, dirs, files in os.walk(asm_dir):
for ovl_name in dirs:
if ovl_name.startswith("ovl_"):
non_decomped_ovls.append(ovl_name)
for root, dirs, files in os.walk(src_dir):
for ovl_name in dirs:
if ovl_name in non_decomped_ovls:
non_decomped_ovls.remove(ovl_name)
return non_decomped_ovls
def create_source_dir(overlay):
overlay_dir = get_ovl_dir(overlay)
full_dir = src_dir + overlay_dir
os.mkdir(full_dir)
c_name = get_z_name(overlay) + ".c"
s_name = get_z_name(overlay) + ".s"
with open(full_dir + c_name, "w", newline="\n") as c_file:
pragma_line = "#pragma GLOBAL_ASM(\"asm/non_matchings/overlays/" + get_ovl_dir(overlay) + s_name + "\")\n"
c_file.write("#include <ultra64.h>\n#include <global.h>\n\n")
c_file.write(pragma_line)
with open(full_dir + "overlay.cfg", "w", newline="\n") as cfg_file:
cfg_file.write(overlay + "\n" + c_name)
def strip_header_from_s(overlay):
s_file_path = asm_dir + get_ovl_dir(overlay) + get_z_name(overlay) + ".s"
beginning_line = -1
with open(s_file_path, "r") as s_file:
s_lines = s_file.readlines()
for i in range(len(s_lines)):
if s_lines[i].startswith("glabel") or s_lines[i].startswith("func_"):
beginning_line = i
break
if beginning_line > -1:
if beginning_line > 10:
for i in range(0, beginning_line):
if s_lines[i].startswith("/*"):
func_name = s_lines[i].split(" ")[2]
func_line = "glabel func_" + func_name + "\n"
s_lines.insert(i, func_line)
beginning_line = i
for i in range(len(s_lines)):
if s_lines[i].startswith("func"):
s_lines[i] = "glabel " + s_lines[i]
s_lines[i] = s_lines[i].replace(":", "")
with open(s_file_path, "w", newline="\n") as s_file:
s_file.writelines(s_lines[beginning_line:])
def manage_overlays_mk(overlay):
with open(root_dir + "overlays.mk", "a", newline="\n") as overlays_file:
overlays_file.write(" src/overlays/" + get_ovl_dir(overlay) + " \\\n")
with open(root_dir + "overlays_asm.mk", "r") as overlays_asm_file:
lines = overlays_asm_file.readlines()
to_remove = " asm/non_matchings/overlays/" + get_ovl_dir(overlay)[:-1] + " \\\n"
lines.remove(to_remove)
with open(root_dir + "overlays_asm.mk", "w", newline="\n") as overlays_asm_file:
overlays_asm_file.writelines(lines)
def manage_spec(overlay):
with open(root_dir + "spec", "r") as spec_file:
spec_text = spec_file.read()
spec_text = spec_text.replace("asm/non_matchings/overlays/" + get_ovl_dir(overlay), "src/overlays/"
+ get_ovl_dir(overlay))
with open(root_dir + "spec", "w", newline="\n") as spec_file:
spec_file.write(spec_text)
def main():
num = 100
i = 0
overlays = get_overlays_to_bootstrap()
for overlay in overlays:
print("Setting up " + overlay)
create_source_dir(overlay)
strip_header_from_s(overlay)
#manage_overlays_mk(overlay)
#manage_spec(overlay)
i += 1
if i >= num:
break
main()