summaryrefslogtreecommitdiff
path: root/tools/messages.py
blob: cb98d00052eb8ffbc676730a25d33b7710ac8915 (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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/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

    if not message:
        return None

    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:
                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])

message = None
def print_message():
    global message
    if message is not None:
        text = convert_message(message)
        if text is not None:
            print(text)
    message = ""

has_val = False
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"):
        print_message()
        if has_val:
            print("    db $00")
            has_val = False
        print("\n%s::" % line[1:-2])
        continue

    if line.startswith(".val "):
        split = line.split(" ", 1)
        if len(split) < 2:
            continue
        value = int(split[1].strip(), 0)

        print_message()
        print("    dw $%04x" % value)
        has_val = True
        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]

        print_message()
        if has_val:
            print("    db $00")
            has_val = False
        message = None

        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

print_message()
if has_val:
    print("    db $00")