mirror of https://github.com/pret/pokecrystal.git
Merge branch 'github/master' into master.
Conflicts: extras/gbz80disasm.py Comments.
This commit is contained in:
commit
ff11134023
|
@ -587,7 +587,7 @@ def find_label(local_address, bank_id=0):
|
||||||
|
|
||||||
if local_address < 0x8000:
|
if local_address < 0x8000:
|
||||||
for label_entry in all_labels:
|
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:
|
if label_entry["bank"] == bank_id or label_entry["bank"] == 0:
|
||||||
return label_entry["label"]
|
return label_entry["label"]
|
||||||
if local_address in wram_labels.keys():
|
if local_address in wram_labels.keys():
|
||||||
|
@ -601,6 +601,18 @@ def asm_label(address):
|
||||||
"""
|
"""
|
||||||
Return the ASM label using the 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:]
|
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
|
end_address = original_offset + max_byte_count
|
||||||
|
|
||||||
byte_labels = {}
|
byte_labels = {}
|
||||||
|
data_tables = {}
|
||||||
|
|
||||||
first_loop = True
|
first_loop = True
|
||||||
output = ""
|
output = ""
|
||||||
keep_reading = True
|
keep_reading = True
|
||||||
|
is_data = False
|
||||||
while offset <= end_address and keep_reading:
|
while offset <= end_address and keep_reading:
|
||||||
current_byte = rom[offset]
|
current_byte = rom[offset]
|
||||||
is_data = False
|
|
||||||
maybe_byte = current_byte
|
maybe_byte = current_byte
|
||||||
|
|
||||||
# stop at any address
|
# 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]["name"] = line_label
|
||||||
byte_labels[offset]["usage"] = 0
|
byte_labels[offset]["usage"] = 0
|
||||||
byte_labels[offset]["definition"] = True
|
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
|
#find out if there's a two byte key like this
|
||||||
temp_maybe = maybe_byte
|
temp_maybe = maybe_byte
|
||||||
temp_maybe += ( rom[offset+1] << 8)
|
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()
|
opstr = opt_table[temp_maybe][0].lower()
|
||||||
|
|
||||||
if "x" in opstr:
|
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
|
current_byte_number += 2
|
||||||
offset += 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 = opt_table[maybe_byte]
|
||||||
op_code_type = op_code[1]
|
op_code_type = op_code[1]
|
||||||
op_code_byte = maybe_byte
|
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]["usage"] = 1
|
||||||
byte_labels[target_address]["definition"] = False
|
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):
|
if has_outstanding_labels(byte_labels) and all_outstanding_labels_are_reverse(byte_labels, offset):
|
||||||
include_comment = True
|
include_comment = True
|
||||||
elif current_byte == 0x3e:
|
elif current_byte == 0x3e:
|
||||||
|
@ -789,6 +802,13 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add
|
||||||
number = byte1
|
number = byte1
|
||||||
number += byte2 << 8
|
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)
|
insertion = "$%.4x" % (number)
|
||||||
result = find_label(insertion, bank_id)
|
result = find_label(insertion, bank_id)
|
||||||
if result != None:
|
if result != None:
|
||||||
|
@ -820,33 +840,46 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
is_data = True
|
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:
|
else:
|
||||||
#if is_data and keep_reading:
|
#if is_data and keep_reading:
|
||||||
output += spacing + "db $" + hex(rom[offset])[2:] #+ " ; " + hex(offset)
|
output += spacing + "db $" + hex(rom[offset])[2:] #+ " ; " + hex(offset)
|
||||||
output += "\n"
|
output += "\n"
|
||||||
offset += 1
|
offset += 1
|
||||||
current_byte_number += 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
|
#else the while loop would have spit out the opcode
|
||||||
|
|
||||||
#these two are done prior
|
#these two are done prior
|
||||||
#offset += 1
|
#offset += 1
|
||||||
#current_byte_number += 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"
|
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
|
first_loop = False
|
||||||
|
|
||||||
|
@ -855,7 +888,7 @@ def output_bank_opcodes(original_offset, max_byte_count=0x4000, include_last_add
|
||||||
address = label_line
|
address = label_line
|
||||||
label_line = byte_labels[label_line]
|
label_line = byte_labels[label_line]
|
||||||
if label_line["usage"] == 0:
|
if label_line["usage"] == 0:
|
||||||
output = output.replace((label_line["name"] + "\n").lower(), "")
|
output = output.replace((label_line["name"] + "\n"), "")
|
||||||
|
|
||||||
#tone down excessive spacing
|
#tone down excessive spacing
|
||||||
output = output.replace("\n\n\n","\n\n")
|
output = output.replace("\n\n\n","\n\n")
|
||||||
|
|
Loading…
Reference in New Issue