summaryrefslogtreecommitdiff
path: root/gbz80disasm.py
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-06-25 23:54:39 -0500
committerBryan Bishop <kanzure@gmail.com>2013-06-25 23:54:39 -0500
commit642fb1c7a23450b3c7caed1a49137c5d364b6365 (patch)
tree78dfe282f60ce3d3b27676a58abbe4a42b79a92d /gbz80disasm.py
parent4c28c1d6f38fba5c84f75e3d7c61efea49a0f1e4 (diff)
parentc805f6ac359743e4aa8e73211d1aab3d65e6ed55 (diff)
Merge branch 'github/master' into master.
Conflicts: extras/gbz80disasm.py Comments. original-commit-id: ff11134023e1a3df28edbf5c8f1638ec369d919a
Diffstat (limited to 'gbz80disasm.py')
-rw-r--r--gbz80disasm.py75
1 files changed, 54 insertions, 21 deletions
diff --git a/gbz80disasm.py b/gbz80disasm.py
index 7de8e71..49644a3 100644
--- a/gbz80disasm.py
+++ b/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")