shithub: pokered

Download patch

ref: 7207000776c097d3aef086a9059b1867048bcba4
parent: 36fb1f3ce01084ef505da576794c82ff1e72e8d7
author: Bryan Bishop <kanzure@gmail.com>
date: Tue Jan 3 12:13:46 EST 2012

analyze_incbins now applies map header asm patches

hg-commit-id: aec68677b92a


--- 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 @@
 
         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,7 +78,7 @@
 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]
@@ -84,7 +85,12 @@
 
         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
@@ -140,7 +146,7 @@
     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
 
@@ -149,13 +155,68 @@
 
     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(81)
+    #dump_all_remaining_maps()