From 5c4de897d4a16ef1a2d8b8062b0f4e12d97484a6 Mon Sep 17 00:00:00 2001 From: rozlette Date: Thu, 26 Sep 2019 21:26:15 -0500 Subject: [PATCH] Print data labels not aligned to a word --- tools/disasm.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/disasm.py b/tools/disasm.py index 0c96eedd15..9f0cd6b8e7 100644 --- a/tools/disasm.py +++ b/tools/disasm.py @@ -378,18 +378,33 @@ class Disassembler: if addr in self.functions: name = get_func_name(addr) f.write("\nglabel %s\n" % name) - if addr in self.vars: - name = self.make_load(addr) - f.write("glabel %s\n" % name) if not self.is_in_data_or_undef(addr): f.write("/* %06d 0x%08X %08X */ %s\n" % (i, addr, inst, self.disassemble_inst(inst, addr, i, file))) elif inst in self.functions: f.write("/* %06d 0x%08X */ .word\t%s\n" % (i, addr, get_func_name(inst))) - elif self.is_in_data(inst): - f.write("/* %06d 0x%08X */ .word\t%s\n" % (i, addr, get_symbol_name(inst))) + elif inst in self.vars: + f.write("/* %06d 0x%08X */ .word\t%s\n" % (i, addr, self.make_load(inst))) else: - f.write("/* %06d 0x%08X */ .word\t0x%08X\n" % (i, addr, inst)) + # TODO this should be moved into a print_data_range function or something + print_head = addr + data_stream = inst + while print_head < addr + 4: + if print_head in self.vars: + name = self.make_load(print_head) + f.write("glabel %s\n" % name) + if print_head + 1 in self.vars or print_head % 2 != 0: + f.write("/* %06d 0x%08X */ .byte\t0x%02X\n" % (i, addr, (data_stream >> 24) & 0xFF)) + data_stream <<= 8 + print_head += 1 + elif print_head + 2 in self.vars or print_head % 4 != 0: + f.write("/* %06d 0x%08X */ .short\t0x%04X\n" % (i, addr, (data_stream >> 16) & 0xFFFF)) + data_stream <<= 16 + print_head += 2 + else: + f.write("/* %06d 0x%08X */ .word\t0x%08X\n" % (i, addr, data_stream & 0xFFFFFFFF)) + data_stream <<= 32 + print_head += 4 def determine_load_ref(self, file, inst_i): # TODO better detect when the register gets dirty