diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/charmap.py | 31 | ||||
-rwxr-xr-x | tools/dump_string.py | 35 | ||||
-rwxr-xr-x | tools/messages.py | 97 |
3 files changed, 163 insertions, 0 deletions
diff --git a/tools/charmap.py b/tools/charmap.py new file mode 100755 index 0000000..d318a61 --- /dev/null +++ b/tools/charmap.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +from sys import argv + +def parse_charmap(file): + charmap = {} + constants = {} + for line in open(file): + split = line.split("#")[0].split("=") + if len(split) != 2: + continue + + char = "=".join(split[0:-1]).strip() + value = int(split[-1].strip(), 0) & 0xFFFF + + if char.startswith("'") and char.endswith("'"): + charmap[char[1:-1]] = value + else: + constants[char] = value + return charmap, constants + +if __name__ == "__main__": + charmap, constants = parse_charmap(argv[1]) + + for char in charmap: + value = charmap[char] + print("charmap \"%s\", %d" % (char, value)) + + for constant in constants: + value = constants[constant] + print("%s EQU %d" % (constant, value)) diff --git a/tools/dump_string.py b/tools/dump_string.py new file mode 100755 index 0000000..42fd347 --- /dev/null +++ b/tools/dump_string.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +from sys import argv +from charmap import parse_charmap + +file = open("DMGAKVJ0.1", "rb").read() + +bank = int(argv[1], 16) +addr = int(argv[2], 16) + +offset = addr +if bank > 0: + offset += 0x4000 * (bank - 1) + +o_charmap, constants = parse_charmap("data/charmap.txt") +charmap = {} +for char in o_charmap: + if o_charmap[char] not in charmap: + charmap[o_charmap[char]] = char + +while True: + value = file[offset] | (file[offset + 1] << 8) + offset += 2 + + if value == 0xffff: + print() + break + elif value == 0xfffe: + print() + continue + + if value in charmap: + print(charmap[value], end="") + else: + print("<%02x>" % value, end="") diff --git a/tools/messages.py b/tools/messages.py new file mode 100755 index 0000000..a8a1431 --- /dev/null +++ b/tools/messages.py @@ -0,0 +1,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)) |