| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | 
							- #!/usr/bin/env python3
 
- import argparse
 
- import os, sys
 
- from lib.dump import decode_dump
 
- def main():
 
-     # parse the arguments
 
-     ap = argparse.ArgumentParser(description="""
 
-         Parse and decode a memory dump obtained from the D2/D21/D23 g-code
 
-         into readable metadata and binary. The output binary is padded and
 
-         extended to fit the original address range.
 
-     """)
 
-     ap.add_argument('-i', dest='info', action='store_true',
 
-                     help='display crash info only')
 
-     ap.add_argument('dump')
 
-     ap.add_argument('output', nargs='?')
 
-     args = ap.parse_args()
 
-     # decode the dump data
 
-     dump = decode_dump(args.dump)
 
-     if dump is None:
 
-         return os.EX_DATAERR
 
-     # output descriptors
 
-     if args.info:
 
-         o_fd = None
 
-         o_md = sys.stdout
 
-     elif args.output is None:
 
-         o_fd = sys.stdout.buffer
 
-         o_md = sys.stderr
 
-     else:
 
-         o_fd = open(args.output, 'wb')
 
-         o_md = sys.stdout
 
-     # output binary
 
-     if o_fd:
 
-         o_fd.write(dump.data)
 
-         o_fd.close()
 
-     # metadata
 
-     print('   dump type: {typ}\n'
 
-           'crash reason: {reason}\n'
 
-           '   registers: {regs}\n'
 
-           '          PC: {pc}\n'
 
-           '          SP: {sp}\n'
 
-           '      ranges: {ranges}'.format(
 
-               typ=dump.typ,
 
-               reason=dump.reason.name if dump.reason is not None else 'N/A',
 
-               regs=dump.regs,
 
-               pc='{:#x}'.format(dump.pc) if dump.pc is not None else 'N/A',
 
-               sp='{:#x}'.format(dump.sp) if dump.sp is not None else 'N/A',
 
-               ranges=str(dump.ranges)),
 
-           file=o_md)
 
- if __name__ == '__main__':
 
-     exit(main())
 
 
  |