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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#!/usr/bin/env python3
from sys import argv, stderr, exit
from charmap import parse_charmap
def err(s):
print("ERROR:", s.rstrip(), file=stderr)
exit(1)
charmap, constants = parse_charmap(argv[1])
filename = argv[2]
def convert_message(message):
while True:
if message.endswith("\r\n"):
message = message[:-2]
continue
if message.endswith("\n"):
message = message[:-1]
continue
break
values = []
in_braces = False
constant = ""
for char in message:
if char == "{" and not in_braces:
in_braces = True
constant = ""
continue
if char == "}" and in_braces:
in_braces = False
if constant in constants:
values.append(constants[constant])
elif constant in charmap:
values.append(charmap[constant])
else:
err("%s: Unrecognized constant %s" % (filename, constant))
continue
if in_braces:
constant += char
continue
if char == "\r":
continue
if char == "\n":
values.append(0xfffe)
continue
if char in charmap:
values.append(charmap[char])
else:
err("%s: Unrecognized character '%s'" % (filename, char))
values.append(0xffff)
return " dw" + ", ".join(["$%04x" % val for val in values])
name = None
message = None
for i, line in enumerate(open(filename)):
if i == 0 and not line.startswith(".org"):
print("SECTION \"%s\", ROMX" % filename)
if line.startswith("#"):
continue
if line.startswith("[") and line.endswith("]\n"):
if name is not None or message is not None:
print("\n%s::" % name)
print(convert_message(message))
message = ""
name = line[1:-2]
continue
if line.startswith(".org "):
split = line.split(" ", 1)
if len(split) < 2:
continue
split = split[1].strip().split(":")
if len(split) != 2:
continue
bank = split[0]
addr = split[1]
if i != 0:
print()
print("SECTION \"%s %s:%s\", ROMX[$%s], BANK[$%s]" %
(filename, bank, addr, addr, bank))
continue
if message is not None:
message += line
if name is not None and message is not None:
print("\n%s::" % name)
print(convert_message(message))
|