| Index: emcore/trunk/tools/emcore.py | 
| — | — | @@ -256,6 +256,58 @@ | 
| 257 | 257 | self.logger.info("done\n") | 
| 258 | 258 |  | 
| 259 | 259 | @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 | 
| 260 | 312 | def uploadint(self, addr, integer): | 
| 261 | 313 | """ | 
| 262 | 314 | Uploads a single integer to the device |