diff options
| author | Bryan Bishop <kanzure@gmail.com> | 2013-06-25 20:32:52 -0700 | 
|---|---|---|
| committer | Bryan Bishop <kanzure@gmail.com> | 2013-06-25 20:32:52 -0700 | 
| commit | c805f6ac359743e4aa8e73211d1aab3d65e6ed55 (patch) | |
| tree | b2b483ec0cc6020dc2b389293b2f66f489cd05c6 | |
| parent | 2d5e2dcb19d02cec691a7bdbb807deab61eb8cf4 (diff) | |
| parent | 2d1212ecf12b5d46796f13215ac87e0007fd2db4 (diff) | |
Merge pull request #153 from yenatch/gbz80disasm-data
data detection in gbz80disasm
original-commit-id: fbf561cfa52ca3c8b0b9f157482e0b33052248ef
| -rw-r--r-- | gbz80disasm.py | 73 | 
1 files changed, 51 insertions, 22 deletions
| diff --git a/gbz80disasm.py b/gbz80disasm.py index 2dc57e5..ed546ef 100644 --- a/gbz80disasm.py +++ b/gbz80disasm.py @@ -577,7 +577,7 @@ def find_label(local_address, bank_id=0):      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(): @@ -589,7 +589,15 @@ def find_label(local_address, bank_id=0):  def asm_label(address):      # why using a random value when you can use the address? -    return ".ASM_" + hex(address)[2:] +    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  def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_address=True, stop_at=[], debug = False):      #fs = current_address @@ -622,13 +630,14 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add      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 @@ -649,12 +658,12 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add              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: @@ -686,7 +695,7 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add              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 @@ -723,7 +732,7 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add                              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: @@ -772,6 +781,13 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add                      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: @@ -803,33 +819,46 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add                          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)              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          #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 @@ -838,7 +867,7 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add          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") | 
