shithub: pokecrystal

Download patch

ref: 55ca2da25acc0598539eede5359f25f08223de2d
parent: 6c26e2617c8cabdb8e05ca0f7180123a169b13a2
author: Rangi <[email protected]>
date: Sun Sep 18 19:41:45 EDT 2022

Fix tools/unnamed.py and add tools/consts.py

--- /dev/null
+++ b/tools/consts.py
@@ -1,0 +1,56 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+"""
+Usage: python consts.py constants/some_constants.asm
+
+View numeric values of `const`ants.
+"""
+
+import sys
+import re
+
+const_value = 0
+const_inc = 1
+
+def asm_int(s):
+	base = {'$': 16, '&': 8, '%': 2}.get(s[0], 10)
+	return int(s if base == 10 else s[1:], base)
+
+def print_const(s, v):
+	print(f'{s} == {v} == ${v:x}')
+
+def parse_for_constants(line):
+	global const_value, const_inc
+	if not (m := re.match(r'^\s+([A-Za-z_][A-Za-z0-9_@#]*)(?:\s+([^;\\n]+))?', line)):
+		return
+	macro, rest = m.groups()
+	args = [arg.strip() for arg in rest.split(',')] if rest else []
+	if args and not args[-1]:
+		args = args[:-1]
+	if macro == 'const_def':
+		const_value = asm_int(args[0]) if len(args) >= 1 else 0
+		const_inc = asm_int(args[1]) if len(args) >= 2 else 1
+	elif macro == 'const':
+		print_const(args[0], const_value)
+		const_value += const_inc
+	elif macro == 'shift_const':
+		print_const(args[0], 1 << const_value)
+		print_const(args[0] + '_F', const_value)
+		const_value += const_inc
+	elif macro == 'const_skip':
+		const_value += const_inc * (asm_int(args[0]) if len(args) >= 1 else 1)
+	elif macro == 'const_next':
+		const_value = asm_int(args[0])
+
+def main():
+	if len(sys.argv) < 2:
+		print(f'Usage: {sys.argv[0]} constants/some_constants.asm', file=sys.stderr)
+		sys.exit(1)
+	for filename in sys.argv[1:]:
+		with open(filename, 'r', encoding='utf-8') as file:
+			for line in file:
+				parse_for_constants(line)
+
+if __name__ == '__main__':
+	main()
--- a/tools/unnamed.py
+++ b/tools/unnamed.py
@@ -48,8 +48,8 @@
 if args.rootdir:
 	for line in subprocess.Popen(['make', '-C', args.rootdir, '-s', '-p', 'DEBUG=1'],
 			stdout=subprocess.PIPE).stdout.read().decode().split('\n'):
-		if line.startswith('pokecrystal_obj := '):
-			objects = line[19:].strip().split()
+		if line.startswith('pokecrystal_obj'):
+			objects = line.removeprefix('pokecrystal_obj').lstrip().removeprefix(':=').strip().split()
 			break
 	else:
 		print('Error: Object files not found!', file=sys.stderr)