summaryrefslogtreecommitdiff
path: root/tools/sym_comments.py
blob: fbc1f1cf378db295fdca6b563830a6089d574941 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Usage: python3 sym_comments.py file.asm [pokegold.sym] > file_commented.asm

Comments each label in file.asm with its bank:address from the sym file.
"""

import sys
import re

if len(sys.argv) != 2 and len(sys.argv) != 3:
	print('Usage: %s file.asm [pokegold.sym] > file_commented.asm' % sys.argv[0], file=sys.stderr)

wram_name = sys.argv[1]
sym_name = sys.argv[2] if len(sys.argv) == 3 else 'pokegold.sym'

sym_format = r'[A-Za-z_][A-Za-z0-9_#@]*'
sym_def_rx = re.compile(r'(^%s)(:.*)|(^\.%s)(.*)' % (sym_format, sym_format))

sym_addrs = {}
with open(sym_name, 'r', encoding='utf-8') as f:
	for line in f:
		line = line.split(';', 1)[0].rstrip()
		parts = line.split(' ', 1)
		if len(parts) != 2:
			continue
		addr, sym = parts
		sym_addrs[sym] = addr

with open(wram_name, 'r', encoding='utf-8') as f:
	cur_label = None
	for line in f:
		line = line.rstrip()
		m = re.match(sym_def_rx, line)
		if m:
			sym, rest = m.group(1), m.group(2)
			if sym is None and rest is None:
				sym, rest = m.group(3), m.group(4)
			key = sym
			if not sym.startswith('.'):
				cur_label = sym
			elif cur_label:
				key = cur_label + sym
			if key in sym_addrs:
				addr = sym_addrs[key]
				line = sym + rest + ' ; ' + addr
		print(line)