freemyipod r575 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r574‎ | r575 | r576 >
Date:16:39, 9 February 2011
Author:theseven
Status:new
Tags:
Comment:
emcore.py: New function: Hexdump
Modified paths:
  • /emcore/trunk/tools/emcore.py (modified) (history)

Diff [purge]

Index: emcore/trunk/tools/emcore.py
@@ -256,6 +256,58 @@
257257 self.logger.info("done\n")
258258
259259 @command
 260+ def hexdump(self, addr, size, width = 16, wordsize = 1, separate = 4, \
 261+ align = False, relative = False, ascii = True, asciisep = 8):
 262+ """
 263+ Downloads a region of memory from the device and hexdumps it
 264+ <addr>: the address to download the data from
 265+ <size>: the number of bytes to be dumped
 266+ [width]: the number of words per output line
 267+ [wordsize]: the number of bytes per word (little endian)
 268+ [separate]: add an additional space character every [separate] words
 269+ [align]: if true, output lines are aligned to the line size
 270+ [relative]: if true, the addresses displayed are relative to the <addr>, not zero
 271+ [ascii]: add ASCII representations of the bytes to the output
 272+ [asciisep]: add an additional space character every [asciisep] ASCII characters
 273+ """
 274+ addr = to_int(addr)
 275+ size = to_int(size)
 276+ width = to_int(width)
 277+ wordsize = to_int(wordsize)
 278+ separate = to_int(separate)
 279+ align = to_bool(align)
 280+ relative = to_bool(relative)
 281+ ascii = to_bool(ascii)
 282+ asciisep = to_int(asciisep)
 283+ if addr % wordsize != 0: raise ArgumentError("Address is not word aligned!")
 284+ if size % wordsize != 0: raise ArgumentError("Size is not word aligned!")
 285+ if align: skip = addr % (wordsize * width)
 286+ else: skip = 0
 287+ if relative: base = 0
 288+ else: base = addr
 289+ data = self.emcore.read(addr, size)
 290+ for r in range(-skip, size, wordsize * width):
 291+ sys.stdout.write("%08X:" % (base + r))
 292+ for i in range(r, r + wordsize * width, wordsize):
 293+ if i - r > 0 and (i - r) % (separate * wordsize) == 0: sys.stdout.write(" ")
 294+ if i >= 0 and i < size:
 295+ w = 0
 296+ for b in range(wordsize):
 297+ w = (w << 8) | struct.unpack("B", data[i + b])[0]
 298+ sys.stdout.write((" %%%dX" % (wordsize * 2)) % w)
 299+ else: sys.stdout.write(" " * (wordsize * 2 + 1))
 300+ if ascii:
 301+ sys.stdout.write(" |")
 302+ for i in range(r, r + wordsize * width):
 303+ if i - r > 0 and (i - r) % asciisep == 0: sys.stdout.write(" ")
 304+ if i >= 0 and i < size:
 305+ if ord(data[i]) > 0x1f: sys.stdout.write(data[i])
 306+ else: sys.stdout.write(".")
 307+ else: sys.stdout.write(" ")
 308+ sys.stdout.write("|")
 309+ sys.stdout.write("\n")
 310+
 311+ @command
260312 def uploadint(self, addr, integer):
261313 """
262314 Uploads a single integer to the device