diff options
author | Bryan Bishop <kanzure@gmail.com> | 2012-04-21 16:06:22 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2012-04-21 16:06:22 -0500 |
commit | f484df40ce403766c4baa609ee71f5bb7804be12 (patch) | |
tree | 71e6c7179ae86cd30fb4c90945fbba68ce82d750 | |
parent | 1db4a451cc89d7d70718c813daa07518f763253e (diff) |
probably right insertion routine for Asm
original-commit-id: b597af7c57033acd1acf468e48b7140c9f390ef0
-rw-r--r-- | crystal.py | 47 |
1 files changed, 44 insertions, 3 deletions
@@ -4440,6 +4440,7 @@ class Incbin: def __init__(self, line, bank=None): self.line = line self.bank = bank + self.replace_me = False self.parse() def parse(self): incbin = self.line @@ -4483,9 +4484,11 @@ class Incbin: #this is the one you will replace with whatever content second = (start_address, byte_count) incbins.append(Incbin("INCBIN \"baserom.gbc\",$%.2x,$%.2x" % (start_address, byte_count))) + incbins[-1].replace_me = True - third = (start_address + byte_count, end - (start_address + byte_count)) - incbins.append(Incbin("INCBIN \"baserom.gbc\",$%.2x,$%.2x" % (third[0], third[1]))) + if (end - (start_address + byte_count)) > 0: + third = (start_address + byte_count, end - (start_address + byte_count)) + incbins.append(Incbin("INCBIN \"baserom.gbc\",$%.2x,$%.2x" % (third[0], third[1]))) return incbins @@ -4527,7 +4530,45 @@ class Asm: else: thing = AsmLine(line, bank=bank) self.parts.append(thing) - def insert(self, object): + def insert(self, new_object): + assert hasattr(new_object, "address"), "object needs to have an address property" + assert hasattr(new_object, "last_address"), "object needs to have a last address" + #check if the object is already inserted + if new_object in self.parts: + return "object was previously inserted" + start_address = new_object.address + end_address = new_object.end_address + # 1) find which object needs to be replaced + # or + # 2) find which object goes after it + found = False + for object in list(self.parts): + #replace an incbin with three incbins, replace middle incbin with whatever + if object.address <= start_address <= object.last_address and isinstance(object, Incbin): + #split up the incbin into three segments + incbins = object.split(start_address, end_address - start_address) + #figure out which incbin to replace with the new object + if incbins[0].replace_me: + index = 0 + else: #assume incbins[1].replace_me (the middle one) + index = 1 + #replace that index with the new_object + incbins[index] = new_object + #insert these incbins into self.parts + gindex = self.parts.index(object) + self.parts = self.parts[:gindex] + incbins + self.parts[gindex:] + found = True + break + #insert before the current object + elif object.address > end_address: + #insert_before = index of object + index = self.parts.index(object) + self.parts.insert(index, new_object) + found = True + break + if not found: + raise Exception, "unable to insert object into Asm" + return True def index(seq, f): """return the index of the first item in seq |