ref: 099295bb3d9edd7c3f9e3d4ed688c97098df7c7c
parent: 1342ab67db4301563d317722d04fab9473411fda
author: Bryan Bishop <[email protected]>
date: Tue Jun 19 21:42:48 EDT 2012
load labels into the new disassembler
--- a/extras/romstr.py
+++ b/extras/romstr.py
@@ -1,7 +1,8 @@
-import sys
+import sys, os, time, datetime, json
from gbz80disasm import opt_table
from ctypes import c_int8
from copy import copy, deepcopy
+from labels import get_label_from_line, get_address_from_line_comment
relative_jumps = [0x38, 0x30, 0x20, 0x28, 0x18, 0xc3, 0xda, 0xc2, 0x32]
relative_unconditional_jumps = [0xc3, 0x18]
@@ -21,6 +22,10 @@
""" Simple wrapper to prevent a giant rom from being shown on screen.
"""
+ def __init__(self, *args, **kwargs):
+ self.load_labels()
+ str.__init__(self)
+
def __repr__(self):
""" Simplifies this object so that the output doesn't overflow stdout.
"""
@@ -40,6 +45,51 @@
file_handler.close()
return RomStr(bytes)
+ def load_labels(self, filename="labels.json"):
+ """ Loads labels from labels.json, or parses the source code file and
+ generates new labels.
+ """
+ # blank out the hash
+ self.labels = {}
+
+ # check if the labels file exists
+ file_existence = os.path.exists(filename)
+
+ generate_labels = False
+
+ # determine if the labels file needs to be regenerated
+ if file_existence:
+ modified = os.path.getmtime(filename)
+ modified = datetime.datetime.fromtimestamp(modified)
+ current = datetime.datetime.fromtimestamp(time.time())
+
+ is_old = (current - modified) > datetime.timedelta(days=3)
+
+ if is_old:
+ generate_labels = True
+ else:
+ generate_labels = True
+
+ # scan the asm source code for labels
+ if generate_labels:
+ asm = open("../main.asm", "r").read().split("\n")
+
+ for line in asm:
+ label = get_label_from_line(line)
+
+ if label:
+ address = get_address_from_line_comment(line)
+
+ self.labels[address] = label
+
+ content = json.dumps(self.labels)
+ file_handler = open(filename, "w")
+ file_handler.write(content)
+ file_handler.close()
+
+ # load the labels from the file
+ self.labels = json.loads(open(filename, "r").read())
+
def length(self):
""" len(self)
"""
@@ -103,9 +153,9 @@
elif end_address != None and size == None:
size = end_address - start_address
- return Asm(start_address=start_address, end_address=end_address, size=size, max_size=max_size, debug=debug, rom=self)
+ return DisAsm(start_address=start_address, end_address=end_address, size=size, max_size=max_size, debug=debug, rom=self)
-class Asm:
+class DisAsm:
""" z80 disassembler
"""