oot/tools/reformat_data_files.py
Roman971 53ceea717d
Properly align asm & data (+ minor fixes) (#165)
* Add .align 4 directives to all data/ files (+ minor alignment fixes)

* Use .balign for everything and fix typo
2020-05-26 18:09:00 -04:00

85 lines
2.7 KiB
Python

#!/usr/bin/python3
import os
import sys
import re
from disassemble import get_z_name
script_dir = os.path.dirname(os.path.realpath(__file__))
root_dir = script_dir + "/../"
data_dir = root_dir + "data/overlays"
asm_dir = root_dir + "asm/non_matchings/overlays"
def rename(old_name, new_name):
for root, dirs, files in os.walk(asm_dir):
for file in files:
file_path = os.path.join(root, file)
with open(file_path) as f:
file_text = f.read()
new_file_text = file_text.replace(old_name, new_name)
if file_text != new_file_text:
with open(file_path, "w", newline="\n") as f:
f.write(new_file_text)
def rename_l(old_name, new_name):
for root, dirs, files in os.walk(asm_dir):
for file in files:
file_path = os.path.join(root, file)
with open(file_path) as f:
file_text = f.read()
new_file_text = file_text.replace(old_name + ":", "glabel " + new_name)
new_file_text = new_file_text.replace(old_name, new_name)
if file_text != new_file_text:
with open(file_path, "w", newline="\n") as f:
f.write(new_file_text)
def handle_jtbl(match):
match = match.group()
split = match.replace(":", "").split(" ")
lbl_name = split[0]
new_lbl_name = "jtbl_" + lbl_name[2:]
rename(lbl_name, new_lbl_name)
ret = "glabel " + new_lbl_name + "\n.word .L"
return ret
def handle_data_line(match):
match = match.group()
ret = "glabel " + match[:-1] + "\n"
return ret
def handle_word_l(match):
match = match.group()
split = match.split(" ")
lbl_name = split[1]
new_lbl_name = split[1][1:]
rename_l(lbl_name, new_lbl_name)
ret = ".word " + new_lbl_name
return ret
def main():
preamble = ".include \"macro.inc\"\n\n # assembler directives\n .set noat # allow manual use of $at\n .set noreorder # don't insert nops after branches\n .set gp=64 # allow use of 64-bit general purpose registers\n\n"
for root, dirs, files in os.walk(data_dir):
for file in files:
file_path = os.path.join(root, file)
with open(file_path) as f:
file_text = f.read()
file_text = preamble + file_text
file_text = re.sub("D_.*: .word .L", handle_jtbl, file_text)
file_text = re.sub("D_.*:", handle_data_line, file_text)
file_text = re.sub(".word .L........", handle_word_l, file_text)
file_text = re.sub("\n\n ", "\n ", file_text)
with open(file_path, "w", newline="\n") as f:
f.write(file_text)
main()