ref: fe40cc4c7462bd5b528ad30c1d04f4d2702fd787
parent: 438456a3a71b18014c7c5e910b38773024004582
author: Bryan Bishop <[email protected]>
date: Tue Jan 17 06:02:52 EST 2012
improve text printer, including TX_RAM and TX_NUM hg-commit-id: 6ee4e09c729c
--- a/extras/analyze_texts.py
+++ b/extras/analyze_texts.py
@@ -226,7 +226,7 @@
"read_byte": read_byte, #split this up when we make a macro for this
}
- offset += 4 + 1
+ offset += 4
elif command_byte == 0xB:
#0B = sound_86 (Hiro obtains ITEM)[same as 0F]
command = {"type": command_byte, "start_address": offset, "end_address": offset}
@@ -401,30 +401,82 @@
#start with zero please
byte_count = 0
+ had_text_end_byte = False
+ had_text_end_byte_57_58 = False
+ had_db_last = False
first_line = True
for this_command in commands.keys():
if not "lines" in commands[this_command].keys():
command = commands[this_command]
if not "type" in command.keys():
- output = "ERROR in command: " + str(command)
+ print "ERROR in command: " + str(command)
continue #dunno what to do here?
- if command["type"] == 0x1:
+ if command["type"] == 0x1: #TX_RAM
if first_line:
output = "\n"
- output += label + ": ; " + hex(start_address) + "\n"
+ output += label + ": ; " + hex(start_address)
first_line = False
p1 = command["pointer"][0]
p2 = command["pointer"][1]
#remember to account for big endian -> little endian
- output += spacing + "TX_RAM $" + hex(p2)[2:] + hex(p1)[2:] + "\n"
-
+ output += "\n" + spacing + "TX_RAM $" + hex(p2)[2:] + hex(p1)[2:]
byte_count += 3
-
+ had_db_last = False
+ elif command["type"] == 0x17: #TX_FAR
+ if first_line:
+ output = "\n"
+ output += label + ": ; " + hex(start_address)
+ first_line = False
+ #p1 = command["pointer"][0]
+ #p2 = command["pointer"][1]
+ output += "\n" + spacing + "TX_FAR _" + label
+ byte_count += 4 #$17, bank, address word
+ had_db_last = False
+ elif command["type"] == 0x9: #TX_RAM_HEX2DEC
+ if first_line:
+ output = "\n" + label + ": ; " + hex(start_address)
+ first_line = False
+ #address, read_byte
+ output += "\n" + spacing + "TX_NUM $%.2x%.2x, $%.2x" % (command["address"][1], command["address"][0], command["read_byte"])
+ had_db_last = False
+ byte_count += 4
+ elif command["type"] == 0x50 and not had_text_end_byte:
+ #had_text_end_byte helps us avoid repeating $50s
+ if first_line:
+ output = "\n" + label + ": ; " + hex(start_address)
+ first_line = False
+ if had_db_last:
+ output += ", $50"
+ else:
+ output += "\n" + spacing + "db $50"
+ byte_count += 1
+ had_db_last = True
+ elif command["type"] in [0x57, 0x58] and not had_text_end_byte_57_58:
+ if first_line: #shouldn't happen, really
+ output = "\n" + label + ": ; " + hex(start_address)
+ first_line = False
+ if had_db_last:
+ output += ", $%.2x" % (command["type"])
+ else:
+ output += "\n" + spacing + "db $%.2x" % (command["type"])
+ byte_count += 1
+ had_db_last = True
+ elif command["type"] in [0x57, 0x58] and had_text_end_byte_57_58:
+ pass #this is ok
+ elif command["type"] == 0x50 and had_text_end_byte:
+ pass #this is also ok
+ else:
+ print "ERROR in command: " + hex(command["type"])
+ had_db_last = False
+
#everything else is for $0s, really
continue
lines = commands[this_command]["lines"]
+
+ #reset this in case we have non-$0s later
+ had_db_last = False
#add the ending byte to the last line- always seems $57
#this should already be in there, but it's not because of a bug in the text parser
@@ -434,6 +486,8 @@
output = "\n"
output += label + ": ; " + hex(start_address) + "\n"
first_line = False
+ else:
+ output += "\n"
first = True #first byte
for line_id in lines:
@@ -447,6 +501,11 @@
first_byte = True
was_byte = False
for byte in line:
+ if byte == 0x50:
+ had_text_end_byte = True #don't repeat it
+ if byte in [0x58, 0x57]:
+ had_text_end_byte_57_58 = True
+
if byte in txt_bytes:
if not quotes_open and not first_byte: #start text
output += ", \""
@@ -488,9 +547,10 @@
quotes_open = False
output += "\n"
-
- #output += "\n"
- output += "; " + hex(start_address + byte_count + 1)
+ include_newline = "\n"
+ if output[-1] == "\n":
+ include_newline = ""
+ output += include_newline + "; " + hex(start_address + byte_count + 1)
print output
return (output, byte_count)
@@ -536,10 +596,12 @@
for result in sorted_results:
print str(result[1]) + " times: " + hex(result[0])
-def scan_rom_for_tx_fars():
+def scan_rom_for_tx_fars(printer=True):
"""find TX_FARs
search only addresses that are INCBINed
- keep only TX_FARs that are valid"""
+ keep only TX_FARs that are valid
+
+ returns a list of [TX_FAR target address, TX_FAR address]"""
rom = extract_maps.rom
analyze_incbins.load_asm()
@@ -568,18 +630,25 @@
possible_tx_fars.append(address)
possible_tx_far_targets.append([address2, address])
- pre_handled = []
- for address_bundle in possible_tx_far_targets:
- if address_bundle[0] in [0xa82f8, 0xa8315]:
- continue #bad
- if address_bundle[0] in pre_handled:
- continue #already did this
+ if printer:
+ pre_handled = []
+ #address_bundle is [TX_FAR target address, TX_FAR address]
+ for address_bundle in possible_tx_far_targets:
+ if address_bundle[0] in [0xa82f8, 0xa8315]:
+ continue #bad
+ if address_bundle[0] in pre_handled:
+ continue #already did this
+
+ print "-------"
+ print "TX_FAR is at: " + hex(address_bundle[1])
+
+ #let's try printing out the TX_FAR?
+ text_pretty_printer_at(address_bundle[1], "blah")
- print "-------"
- print "TX_FAR is at: " + hex(address_bundle[1])
- text_pretty_printer_at(address_bundle[0], "blah")
- print "-------"
- pre_handled.append(address_bundle[0])
+ text_pretty_printer_at(address_bundle[0], "_blah")
+ print "-------"
+ pre_handled.append(address_bundle[0])
+ return possible_tx_far_targets
if __name__ == "__main__":
extract_maps.load_rom()