mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
Fix tools/unnamed.py and add tools/consts.py
This commit is contained in:
parent
6c26e2617c
commit
55ca2da25a
56
tools/consts.py
Executable file
56
tools/consts.py
Executable file
@ -0,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()
|
@ -48,8 +48,8 @@ objects = None
|
|||||||
if args.rootdir:
|
if args.rootdir:
|
||||||
for line in subprocess.Popen(['make', '-C', args.rootdir, '-s', '-p', 'DEBUG=1'],
|
for line in subprocess.Popen(['make', '-C', args.rootdir, '-s', '-p', 'DEBUG=1'],
|
||||||
stdout=subprocess.PIPE).stdout.read().decode().split('\n'):
|
stdout=subprocess.PIPE).stdout.read().decode().split('\n'):
|
||||||
if line.startswith('pokecrystal_obj := '):
|
if line.startswith('pokecrystal_obj'):
|
||||||
objects = line[19:].strip().split()
|
objects = line.removeprefix('pokecrystal_obj').lstrip().removeprefix(':=').strip().split()
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print('Error: Object files not found!', file=sys.stderr)
|
print('Error: Object files not found!', file=sys.stderr)
|
||||||
|
Loading…
Reference in New Issue
Block a user