You've already forked Diddy-Kong-Racing
mirror of
https://github.com/izzy2lost/Diddy-Kong-Racing.git
synced 2026-03-10 11:36:09 -07:00
111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
import subprocess
|
|
import sys
|
|
import re
|
|
import subprocess
|
|
import argparse
|
|
|
|
def fixBadLabel():
|
|
parser = argparse.ArgumentParser(description="")
|
|
parser.add_argument("baseLabel", help="Base label")
|
|
parser.add_argument("badLabel", help="Bad label")
|
|
args = parser.parse_args()
|
|
|
|
baseAddress = int(args.baseLabel[-8:], 16)
|
|
badAddress = int(args.badLabel[-8:], 16)
|
|
|
|
if baseAddress >= badAddress:
|
|
raise Exception('baseLabel should be smaller! base = ' + hex(baseAddress) + ', bad = ' + hex(badAddress))
|
|
|
|
newLabel = args.baseLabel + '+' + str(badAddress-baseAddress)
|
|
|
|
subprocess.run(['./rename_sym.sh', args.badLabel, newLabel])
|
|
|
|
def load_syms():
|
|
with open('undefined_syms.txt', 'r') as inFile:
|
|
return inFile.read().split('\n')
|
|
|
|
def save_syms(syms):
|
|
with open('undefined_syms.txt', 'w') as outFile:
|
|
outFile.write('\n'.join(syms))
|
|
|
|
def check_is_double(symbol, address):
|
|
command = subprocess.run(['fgrep', '-ri', symbol], capture_output=True)
|
|
outLines = command.stdout.decode("utf-8").split('\n')
|
|
for outLine in outLines:
|
|
if 'lwc1' in outLine:
|
|
newSym = 'D_' + hex(address - 4)[2:].upper() + ' + 4'
|
|
subprocess.run(['./rename_sym.sh', symbol, newSym])
|
|
return True
|
|
return False
|
|
|
|
def fixDoubleLoads():
|
|
syms = load_syms()
|
|
target = len(syms)
|
|
i = 0
|
|
while i < target:
|
|
sym = syms[i]
|
|
if sym.startswith('D_'):
|
|
symSplit = sym.split(' = ')
|
|
symbol = symSplit[0]
|
|
address = int(symSplit[1][2:-1], 16)
|
|
if address >= 0x800E4BFC and address < 0x800E9BA0 and ((address & 4) != 0):
|
|
if check_is_double(symbol, address):
|
|
syms.pop(i)
|
|
target -= 1
|
|
continue
|
|
i += 1
|
|
save_syms(syms)
|
|
|
|
def getMatches(string, regex):
|
|
out = []
|
|
matches = re.finditer(regex, string, re.MULTILINE)
|
|
for matchNum, match in enumerate(matches, start=1):
|
|
start = match.start()
|
|
end = match.end()
|
|
out.append((string[start:end], match.groups(), (start, end)))
|
|
return out
|
|
|
|
FILE_REGEX = r"(?:lib/)?(?:(?:src/)|(?:asm/non_matchings/))([^/.]*)"
|
|
def getFiles(symbol):
|
|
command = subprocess.run(['fgrep', '-ri', symbol], capture_output=True)
|
|
outLines = command.stdout.decode("utf-8").split('\n')
|
|
fileNames = []
|
|
for outLine in outLines:
|
|
if 'src' in outLine or 'asm' in outLine:
|
|
match = getMatches(outLine, FILE_REGEX)[0][1][0]
|
|
if match not in fileNames:
|
|
fileNames.append(match)
|
|
return fileNames
|
|
|
|
def getBss():
|
|
currentFile = ''
|
|
out = []
|
|
syms = load_syms()
|
|
for sym in syms:
|
|
if ' = ' in sym:
|
|
symSplit = sym.split(' = ')
|
|
symbol = symSplit[0]
|
|
address = int(symSplit[1][2:-1], 16)
|
|
if address >= 0x80115CE8 and address <= 0x8012D3F0:
|
|
try:
|
|
files = getFiles(symbol)
|
|
if currentFile not in files:
|
|
if len(files) == 1:
|
|
if currentFile != '':
|
|
out.append('\n')
|
|
currentFile = files[0]
|
|
out.append(currentFile)
|
|
else:
|
|
print(symbol, files, 'Cannot tell which file to use!')
|
|
except IndexError:
|
|
print('Error with symbol: ' + symbol)
|
|
out.append(sym)
|
|
with open('bss.txt', 'w') as outFile:
|
|
outFile.write('\n'.join(out))
|
|
|
|
|
|
fixBadLabel()
|
|
#fixDoubleLoads()
|
|
#getBss()
|
|
|