diff --git a/extras/gbz80disasm.py b/extras/gbz80disasm.py index 7de8e71e2..49644a3f9 100644 --- a/extras/gbz80disasm.py +++ b/extras/gbz80disasm.py @@ -587,7 +587,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(): @@ -601,6 +601,18 @@ def asm_label(address): """ 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:] @@ -639,13 +651,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 @@ -666,12 +679,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: @@ -703,7 +716,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 @@ -740,7 +753,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: @@ -789,6 +802,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: @@ -820,33 +840,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 @@ -855,7 +888,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")