summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/charmap.py31
-rwxr-xr-xtools/dump_string.py35
-rwxr-xr-xtools/messages.py97
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))