shithub: pokecrystal

Download patch

ref: ff11134023e1a3df28edbf5c8f1638ec369d919a
parent: bd6a98531753805fda06f1261a99ed36ff20adbc
parent: fbf561cfa52ca3c8b0b9f157482e0b33052248ef
author: Bryan Bishop <[email protected]>
date: Tue Jun 25 19:54:39 EDT 2013

Merge branch 'github/master' into master.

Conflicts:
	extras/gbz80disasm.py

Comments.

--- a/extras/gbz80disasm.py
+++ b/extras/gbz80disasm.py
@@ -587,7 +587,7 @@
 
     if local_address < 0x8000:
         for label_entry in all_labels:
-            if label_entry["address"] & 0x7fff == local_address:
+            if get_local_address(label_entry["address"]) == local_address:
                 if label_entry["bank"] == bank_id or label_entry["bank"] == 0:
                     return label_entry["label"]
     if local_address in wram_labels.keys():
@@ -601,7 +601,19 @@
     """
     Return the ASM label using the address.
     """
+    # why using a random value when you can use the address?
+    return '.asm_%x' % address
 
+def data_label(address):
+    return '.data_%x' % address
+
+def get_local_address(address):
+    bank = address / 0x4000
+    return (address & 0x3fff) + 0x4000 * bool(bank)
+
+def get_global_address(address, bank):
+    return (address & 0x3fff) + 0x4000 * bank
+
     return ".ASM_" + hex(address)[2:]
 
 def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_address=True, stop_at=[], debug=False):
@@ -639,13 +651,14 @@
     end_address = original_offset + max_byte_count
 
     byte_labels = {}
+    data_tables = {}
 
     first_loop = True
     output = ""
     keep_reading = True
+    is_data = False
     while offset <= end_address and keep_reading:
         current_byte = rom[offset]
-        is_data = False
         maybe_byte = current_byte
 
         # stop at any address
@@ -666,12 +679,12 @@
             byte_labels[offset]["name"] = line_label
             byte_labels[offset]["usage"] = 0
         byte_labels[offset]["definition"] = True
-        output += line_label.lower() + "\n" #" ; " + hex(offset) + "\n"
+        output += line_label + "\n" #" ; " + hex(offset) + "\n"
 
         #find out if there's a two byte key like this
         temp_maybe = maybe_byte
         temp_maybe += ( rom[offset+1] << 8)
-        if temp_maybe in opt_table.keys() and rom[offset+1]!=0:
+        if not is_data and temp_maybe in opt_table.keys() and rom[offset+1]!=0:
             opstr = opt_table[temp_maybe][0].lower()
 
             if "x" in opstr:
@@ -703,7 +716,7 @@
 
             current_byte_number += 2
             offset += 2
-        elif maybe_byte in opt_table.keys():
+        elif not is_data and maybe_byte in opt_table.keys():
             op_code = opt_table[maybe_byte]
             op_code_type = op_code[1]
             op_code_byte = maybe_byte
@@ -740,7 +753,7 @@
                             byte_labels[target_address]["usage"] = 1
                             byte_labels[target_address]["definition"] = False
 
-                        insertion = line_label2.lower()
+                        insertion = line_label2
                         if has_outstanding_labels(byte_labels) and all_outstanding_labels_are_reverse(byte_labels, offset):
                             include_comment = True
                     elif current_byte == 0x3e:
@@ -789,6 +802,13 @@
                     number = byte1
                     number += byte2 << 8
 
+                    pointer = get_global_address(number, bank_id)
+                    if pointer not in data_tables.keys():
+                        data_tables[pointer] = {}
+                        data_tables[pointer]['usage'] = 0
+                    else:
+                        data_tables[pointer]['usage'] += 1
+
                     insertion = "$%.4x" % (number)
                     result = find_label(insertion, bank_id)
                     if result != None:
@@ -820,19 +840,6 @@
                         break
             else:
                 is_data = True
-
-            #stop reading at a jump, relative jump or return
-            if current_byte in end_08_scripts_with:
-                if not has_outstanding_labels(byte_labels) or all_outstanding_labels_are_reverse(byte_labels, offset):
-                    keep_reading = False
-                    is_data = False #cleanup
-                    break
-                else:
-                    is_data = False
-                    keep_reading = True
-            else:
-                is_data = False
-                keep_reading = True
         else:
         #if is_data and keep_reading:
             output += spacing + "db $" + hex(rom[offset])[2:] #+ " ; " + hex(offset)
@@ -839,6 +846,9 @@
             output += "\n"
             offset += 1
             current_byte_number += 1
+            if offset in byte_labels.keys():
+                is_data = False
+                keep_reading = True
         #else the while loop would have spit out the opcode
 
         #these two are done prior
@@ -845,9 +855,32 @@
         #offset += 1
         #current_byte_number += 1
 
-        if current_byte in relative_unconditional_jumps + end_08_scripts_with:
+        if not is_data and current_byte in relative_unconditional_jumps + end_08_scripts_with:
+            #stop reading at a jump, relative jump or return
+            if not has_outstanding_labels(byte_labels) or all_outstanding_labels_are_reverse(byte_labels, offset):
+                keep_reading = False
+                is_data = False #cleanup
+                break
+            elif offset not in byte_labels.keys() or offset in data_tables.keys():
+                is_data = True
+                keep_reading = True
+            else:
+                is_data = False
+                keep_reading = True
             output += "\n"
+        elif is_data and offset not in byte_labels.keys():
+            is_data = True
+            keep_reading = True
+        else:
+            is_data = False
+            keep_reading = True
 
+        if offset in data_tables.keys():
+            output = output.replace('$%x' % (get_local_address(offset)), data_label(offset))
+            output += data_label(offset) + '\n'
+            is_data = True
+            keep_reading = True
+
         first_loop = False
 
     #clean up unused labels
@@ -855,7 +888,7 @@
         address = label_line
         label_line = byte_labels[label_line]
         if label_line["usage"] == 0:
-            output = output.replace((label_line["name"] + "\n").lower(), "")
+            output = output.replace((label_line["name"] + "\n"), "")
 
     #tone down excessive spacing
     output = output.replace("\n\n\n","\n\n")