Basic support for formatting structures.
This commit is contained in:
parent
728bb708ff
commit
8bab28b042
|
@ -195,6 +195,24 @@ class ROMDisassembler:
|
||||||
#print(regs)
|
#print(regs)
|
||||||
return regs
|
return regs
|
||||||
|
|
||||||
|
def fmt_array(self, entry, offset):
|
||||||
|
count = entry['size'] // entry['elsize']
|
||||||
|
for i in range(count):
|
||||||
|
self.fmt_single_entry(entry['format'], entry['elsize'], offset)
|
||||||
|
offset += entry['elsize']
|
||||||
|
|
||||||
|
def parse_struct(self, fields, offset):
|
||||||
|
size_acc = 0
|
||||||
|
for field in fields:
|
||||||
|
if field['type'] == 'int':
|
||||||
|
self.fmt_single_entry(field['format'], field['size'], offset)
|
||||||
|
elif field['type'] == 'array':
|
||||||
|
self.fmt_array(field, offset)
|
||||||
|
else:
|
||||||
|
print("Unknown struct field type %s" % field['type'])
|
||||||
|
offset += field['size']
|
||||||
|
size_acc += field['size']
|
||||||
|
return size_acc
|
||||||
|
|
||||||
def fmt_entry(self, entry, offset):
|
def fmt_entry(self, entry, offset):
|
||||||
print("")
|
print("")
|
||||||
|
@ -209,10 +227,7 @@ class ROMDisassembler:
|
||||||
print((entry['label'] + ':').ljust(15))
|
print((entry['label'] + ':').ljust(15))
|
||||||
|
|
||||||
if entry['type'] == 'array':
|
if entry['type'] == 'array':
|
||||||
count = entry['size'] // entry['elsize']
|
self.fmt_array(entry, offset)
|
||||||
for i in range(count):
|
|
||||||
self.fmt_single_entry(entry['format'], entry['elsize'], offset)
|
|
||||||
offset += entry['elsize']
|
|
||||||
elif entry['type'] == 'int':
|
elif entry['type'] == 'int':
|
||||||
self.fmt_single_entry(entry['format'], entry['size'], offset)
|
self.fmt_single_entry(entry['format'], entry['size'], offset)
|
||||||
elif entry['type'] == 'code':
|
elif entry['type'] == 'code':
|
||||||
|
@ -233,6 +248,8 @@ class ROMDisassembler:
|
||||||
str_len = entry['size']
|
str_len = entry['size']
|
||||||
fmt_str = '%is' % str_len
|
fmt_str = '%is' % str_len
|
||||||
print('"%s"' % struct.unpack(fmt_str, self.rom_data[offset:offset+str_len])[0].decode('mac_roman'))
|
print('"%s"' % struct.unpack(fmt_str, self.rom_data[offset:offset+str_len])[0].decode('mac_roman'))
|
||||||
|
elif entry['type'] == 'struct':
|
||||||
|
return self.parse_struct(entry['fields'], offset)
|
||||||
|
|
||||||
return entry['size']
|
return entry['size']
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue