diff options
Diffstat (limited to 'extras')
-rw-r--r-- | extras/analyze_incbins.py | 82 | ||||
-rw-r--r-- | extras/pretty_map_headers.py | 11 |
2 files changed, 78 insertions, 15 deletions
diff --git a/extras/analyze_incbins.py b/extras/analyze_incbins.py index c47ac522..70842f48 100644 --- a/extras/analyze_incbins.py +++ b/extras/analyze_incbins.py @@ -5,7 +5,8 @@ import sys, os from copy import copy, deepcopy import subprocess -from extract_maps import rom, assert_rom, load_rom, calculate_pointer +from extract_maps import rom, assert_rom, load_rom, calculate_pointer, load_map_pointers, read_all_map_headers, map_headers +from pretty_map_headers import map_header_pretty_printer, map_name_cleaner #store each line of source code here asm = None @@ -57,9 +58,9 @@ def process_incbins(): partial_interval = incbin[21:].split(",")[1] partial_interval = partial_interval.replace(";", "#") - partial_interval = partial_interval.replace("$", "0x") + partial_interval = partial_interval.replace("$", "0x").replace("0xx", "0x") interval = eval(partial_interval) - interval_hex = hex(interval).replace("0x", "$") + interval_hex = hex(interval).replace("0x", "$").replace("x", "") end = start + interval end_hex = hex(end).replace("0x", "$") @@ -77,14 +78,19 @@ def process_incbins(): def find_incbin_to_replace_for(address): """returns a line number for which incbin to edit if you were to insert bytes into pokered.asm""" - if type(address) == str: int(address, 16) + if type(address) == str: address = int(address, 16) for incbin_key in processed_incbins.keys(): incbin = processed_incbins[incbin_key] start = incbin["start"] end = incbin["end"] - + + print "start is: " + str(start) + print "end is: " + str(end) + print "address is: " + str(type(address)) + print "checking.... " + hex(start) + " <= " + hex(address) + " <= " + hex(end) + if start <= address <= end: return incbin_key return None @@ -115,7 +121,6 @@ def split_incbin_line_into_three(line, start_address, byte_count): third = (start_address + byte_count, end - (start_address + byte_count)) output = "" - print "third end is: " + str(third[1]) if first: output += "INCBIN \"baserom.gbc\",$" + hex(first[0])[2:] + ",$" + hex(first[1])[2:] + " - $" + hex(first[2])[2:] + "\n" @@ -141,7 +146,7 @@ def generate_diff_insert(line_number, newline): newfile_fh.close() try: - diffcontent = subprocess.check_output("diff -u " + original_filename + " " + newfile_filename, shell=True) + diffcontent = subprocess.check_output("diff -u ../pokered.asm " + newfile_filename, shell=True) except Exception, exc: diffcontent = exc.output @@ -150,13 +155,68 @@ def generate_diff_insert(line_number, newline): return diffcontent +def insert_map_header_asm(map_id): + map = map_headers[map_id] + line_number = find_incbin_to_replace_for(map["address"]) + if line_number == None: # or map_name_cleaner(map["name"], 0) in "\n".join(line for line in asm): + print "i think map id=" + str(map_id) + " has previously been added." + return #this map has already been added i bet + newlines = split_incbin_line_into_three(line_number, map["address"], 12 + (11 * len(map["connections"]))) + + map_header_asm = map_header_pretty_printer(map_headers[map_id]) + + newlines = newlines.split("\n") + if len(newlines) == 2: index = 0 + elif len(newlines) == 3: + index = 1 + newlines[0] += "\n" #spacing is a nice thing to have + newlines[index] = map_header_asm + newlines = "\n".join(line for line in newlines) + + diff = generate_diff_insert(line_number, newlines) + + print diff + print "... Applying diff." + + #write the diff to a file + fh = open("temp.patch", "w") + fh.write(diff) + fh.close() + + #apply the patch + os.system("patch ../pokered.asm temp.patch") + + #remove the patch + os.system("rm temp.patch") + +def wrapper_insert_map_header_asm(map_id): + "reload the asm because it has changed (probably)" + load_asm() + isolate_incbins() + process_incbins() + insert_map_header_asm(map_id) + +def dump_all_remaining_maps(): + for map_id in map_headers: + print "Inserting map id=" + str(map_id) + wrapper_insert_map_header_asm(map_id) + if __name__ == "__main__": + #load map headers + load_rom() + load_map_pointers() + read_all_map_headers() + + #load incbins (mandatory) load_asm() isolate_incbins() process_incbins() #print processed_incbins - line_number = find_incbin_to_replace_for(0x492c3) - newlines = split_incbin_line_into_three(line_number, 0x492c3, 12) - diff = generate_diff_insert(line_number, newlines) - print diff + #line_number = find_incbin_to_replace_for(0x492c3) + #newlines = split_incbin_line_into_three(line_number, 0x492c3, 12) + #diff = generate_diff_insert(line_number, newlines) + #print diff + + insert_map_header_asm(86) + #dump_all_remaining_maps() diff --git a/extras/pretty_map_headers.py b/extras/pretty_map_headers.py index 2c038fd4..819b665a 100644 --- a/extras/pretty_map_headers.py +++ b/extras/pretty_map_headers.py @@ -159,14 +159,17 @@ def map_header_pretty_printer(map_header): #formatting: hex(y)[2:].zill(2) or "%02x" % (y,) - output = asm_name + ": ; " + address + " to " + hex(int(address, base) + byte_size) + " (" + str(byte_size) + " bytes) (bank=" + str(int(bank, base)) + ") (id=" + str(id) + ")\n" + output = asm_name + ": ; " + address + " to " + hex(int(address, base) + byte_size) + " (" + str(byte_size) + " bytes) (id=" + str(id) + ")\n" output += spacing + "db $" + str(tileset).zfill(2) + " ; tileset\n" output += spacing + "db $" + hex(y)[2:].zfill(2) + ", $" + hex(x)[2:].zfill(2) + " ; dimensions (y, x)\n" output += spacing + "dw $" + map_pointer + ", $" + texts_pointer + ", $" + script_pointer + " ; blocks, texts, scripts\n" output += spacing + "db " + connection_line(connection_byte) + " ; connections\n\n" - output += spacing + "; connections data\n\n" - output += connection_pretty_printer(connections) - output += spacing + "; end connection data\n\n" + + if len(connections) > 0: + output += spacing + "; connections data\n\n" + output += connection_pretty_printer(connections) + output += spacing + "; end connection data\n\n" + output += spacing + "dw $" + object_data_pointer + " ; objects\n" return output |