w00t! jtag arm is a reality on goodfet.
[goodfet] / client / gplay-arm.py
1 #!/usr/bin/env ipython
2 import sys, struct, binascii,time
3 from GoodFETARM import *
4 from intelhex import IntelHex
5
6
7 data = []
8
9 client=GoodFETARM();
10 def init():
11     #Initailize FET and set baud rate
12     print >>sys.stderr,"Connecting to goodfet..."
13     client.serInit()
14     #
15     #Connect to target
16     print >>sys.stderr,"Setting up JTAG ARM on goodfet..."
17     client.setup()
18     print >>sys.stderr,"Starting JTAG ARM on goodfet..."
19     client.start()
20     print "STARTUP: "+repr(client.data)
21     #
22
23 def print_registers():
24     return [ hex(client.ARMget_register(x)) for x in range(15) ]
25
26 def regwratchet(num,hi=13,lo=0):
27     for x in xrange(lo,hi+1):
28         client.ARMset_register(x,num)
29
30 def test():
31     print "ARM JTAG Test Unit"
32     print " Chip ID", hex(client.ARMident())
33     print client.ARMidentstr()
34     print " Debug State: ",hex(client.ARMget_dbgstate())
35     print " Debug CTRL:  ",hex(client.ARMget_dbgctrl())
36     print
37     print "Testing Register Read/Writes"
38     print " Storing old values"
39     originalregs = [client.ARMget_register(x) for x in xrange(16)]
40
41     print "Simple test"
42     test = [None for x in xrange(15)]
43     control = [x for x in xrange(15)]
44     for x in xrange(15):
45         client.ARMset_register(x,control[x])
46         test[x] = client.ARMget_register(x)
47     if control != test:
48         print "FAIL"
49         print "Control:",control
50         print "Test:   ",test
51
52     print "A little harder..."
53     test = [None for x in xrange(15)]
54     control = [4*x for x in xrange(15)]
55     for x in xrange(15):
56         client.ARMset_register(x,control[x])
57         test[x] = client.ARMget_register(x)
58     if control != test:
59         print "FAIL"
60         print "Control:",control
61         print "Test:   ",test
62
63     print "Complex testing 1"
64     for y in xrange(0,0xffffffff,0x10101010):
65             test = [None for x in xrange(15)]
66             control = [y for x in xrange(15)]
67             print " Test parms: ",control
68             for x in xrange(15):
69                 client.ARMset_register(x,control[x])
70                 test[x] = client.ARMget_register(x)
71             if control != test:
72                 print "FAIL"
73                 print "Control:",control
74                 print "Test:   ",test
75
76     print "Complex testing 2"
77     for y in xrange(0,0xffffffff,101010101):
78             test = [None for x in xrange(15)]
79             control = [y for x in xrange(15)]
80             print " Test parms: ",control
81             for x in xrange(15):
82                 client.ARMset_register(x,control[x])
83                 test[x] = client.ARMget_register(x)
84             if control != test:
85                 print "FAIL"
86                 print "Control:",control
87                 print "Test:   ",test
88
89     test = [None for x in xrange(15)]
90     control = [0x100*x for x in xrange(15)]
91     for x in xrange(15):
92         client.ARMset_register(x,control[x])
93         test[x] = client.ARMget_register(x)
94     if control != test:
95         print "FAIL"
96         print "Control:",control
97         print "Test:   ",test
98
99     print "Resetting original register values..."
100     for x in xrange(16):
101         client.ARMset_register(x,originalregs[x])
102     regs = [client.ARMget_register(x) for x in xrange(16)]
103     print "Original:           \t",originalregs
104     print "Now (r15 may differ:\t",regs
105
106     print "Testing setting and movement of PC between instructions"
107     #client.ARMsetPC(0x0)
108     print "PC:",client.ARMgetPC()
109     print "PC:",client.ARMgetPC()
110     print "PC:",client.ARMgetPC()
111     print "PC:",client.ARMgetPC()
112
113 def test1():
114     global data
115     print "\n\nTesting JTAG for ARM\n"
116     client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback:   \t %s"%repr(client.data)                  # loopback
117     data.append(client.data)
118     client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data)               # set scan chain
119     data.append(client.data)
120     client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data)                  # get dbg state
121     data.append(client.data)
122     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
123     data.append(client.data)
124     client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data)     # execute instruction
125     data.append(client.data)
126     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
127     data.append(client.data)
128     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
129     data.append(client.data)
130     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
131     data.append(client.data)
132     client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data)                  # dr_shift32
133     data.append(client.data)
134     client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data)                  # set register
135     data.append(client.data)
136     client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data)                  # get register
137     data.append(client.data)
138     client.writecmd(0x33,0xd7,0,[]); print "chain1:      \t %s"%repr(client.data)                  # chain1
139     data.append(client.data)
140     client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data)                  # read chain2
141     data.append(client.data)
142     client.writecmd(0x33,0xd9,0,[]); print "idcode:      \t %s"%repr(client.data)                  # read idcode
143     data.append(client.data)
144     client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0:       \t %s"%repr(client.data)   # read idcode
145     data.append(client.data)
146     client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0):     \t %s"%repr(client.data)
147     data.append(client.data)
148     client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2):     \t %s"%repr(client.data)
149     data.append(client.data)
150     client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3):     \t %s"%repr(client.data)
151     data.append(client.data)
152     client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4):     \t %s"%repr(client.data)
153     data.append(client.data)
154     client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5):     \t %s"%repr(client.data)
155     data.append(client.data)
156     client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7):     \t %s"%repr(client.data)
157     data.append(client.data)
158     client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9):     \t %s"%repr(client.data)
159     data.append(client.data)
160     client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c):     \t %s"%repr(client.data)
161     data.append(client.data)
162     client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e):     \t %s"%repr(client.data)
163     data.append(client.data)
164     client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f):     \t %s"%repr(client.data)
165     data.append(client.data)
166
167 def test2():
168     global data
169     print "\n\nTesting JTAG for ARM\n"
170     print "IDCODE:      %x"%client.ARMident()
171     print "Debug State: %x"%client.ARMget_dbgstate ()
172     print "Debug State: %x"%client.ARMget_dbgstate ()
173     print "Debug State: %x"%client.ARMget_dbgstate ()
174     print "Debug CTRL:  %x"%client.ARMget_dbgctrl()
175     client.writecmd(0x33,0xda,0,[])
176     print "TEST CHAIN0: %s"%repr(client.data)
177     print "Debug State: %x"%client.ARMget_dbgstate ()
178     print "IDCODE:      %x"%client.ARMident()
179     print "Debug State: %x"%client.ARMget_dbgstate ()
180     client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
181     print "Loopback:   \t %s"%repr(client.data)                  # loopback
182     print "Debug State: %x"%client.ARMget_dbgstate ()
183     print "IDCODE:      %x"%client.ARMident()
184     print "GetPC: %x"%client.ARMgetPC()
185     print "IDCODE:      %x"%client.ARMident()
186     print "Debug State: %x"%client.ARMget_dbgstate ()
187     print "IDCODE:      %x"%client.ARMident()
188     print "set_register(3,0x41414141):  %x"%client.ARMset_register(3,0x41414141)
189     print "IDCODE:      %x"%client.ARMident()
190     print "Debug State: %x"%client.ARMget_dbgstate ()
191     print "IDCODE:      %x"%client.ARMident()
192     print "get_register(3):             %x"%client.ARMget_register(3)
193     print "IDCODE:      %x"%client.ARMident()
194     print "Debug State: %x"%client.ARMget_dbgstate ()
195     print "IDCODE:      %x"%client.ARMident()
196
197 def test3():
198     print "IDCODE:      %x"%client.ARMident()
199     print "Debug State: %x"%client.ARMget_dbgstate ()
200     client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
201     print "Loopback:   \t %s"%repr(client.data)                  # loopback
202     client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
203     print "test_set_reg:   \t %s"%repr(client.data)            
204     client.writecmd(0x33,0xd4,1,[0])
205     print "test_get_reg:   \t %s"%repr(client.data)           
206     print "set_register(3,0x41414141):  %x"%client.ARMset_register(3,0x41414141)
207     print "get_register(3):             %x"%client.ARMget_register(3)
208     client.writecmd(0x33,0xd4,1,[0])
209     print "test_get_reg:   \t %s"%repr(client.data)           
210
211 def test4():
212         print "IDCODE:      %x"%client.ARMident()
213         print "Debug State: %x"%client.ARMget_dbgstate ()
214         print "set_register(0,0x4141):  %x"%client.ARMset_register(0,0x4141)
215         print "get_register(0):             %x"%client.ARMget_register(0)
216         print "set_register(1,0x4141):  %x"%client.ARMset_register(1,0x4142)
217         print "get_register(1):             %x"%client.ARMget_register(1)
218         print "set_register(2,0x4141):  %x"%client.ARMset_register(2,0x4143)
219         print "get_register(2):             %x"%client.ARMget_register(2)
220         print "set_register(3,0x4141):  %x"%client.ARMset_register(3,0x4144)
221         print "get_register(3):             %x"%client.ARMget_register(3)
222         print "set_register(4,0x4141):  %x"%client.ARMset_register(4,0x4145)
223         print "get_register(4):             %x"%client.ARMget_register(4)
224         print "set_register(5,0x4141):  %x"%client.ARMset_register(5,0x4146)
225         print "get_register(5):             %x"%client.ARMget_register(5)
226         print "set_register(6,0x4141):  %x"%client.ARMset_register(6,0x4147)
227         print "get_register(6):             %x"%client.ARMget_register(6)
228         print "set_register(7,0x4141):  %x"%client.ARMset_register(7,0x4148)
229         print "get_register(7):             %x"%client.ARMget_register(7)
230         print "set_register(8,0x4141):  %x"%client.ARMset_register(8,0x4149)
231         print "get_register(8):             %x"%client.ARMget_register(8)
232         print "set_register(9,0x4141):  %x"%client.ARMset_register(9,0x4140)
233         print "get_register(9):             %x"%client.ARMget_register(9)
234         print "set_register(10,0x4141):  %x"%client.ARMset_register(10,0x4151)
235         print "get_register(10):             %x"%client.ARMget_register(10)
236         print "set_register(11,0x4141):  %x"%client.ARMset_register(11,0x4152)
237         print "get_register(11):             %x"%client.ARMget_register(11)
238         print "set_register(12,0x4141):  %x"%client.ARMset_register(12,0x4153)
239         print "get_register(12):             %x"%client.ARMget_register(12)
240         print "set_register(13,0x4141):  %x"%client.ARMset_register(13,0x4154)
241         print "get_register(13):             %x"%client.ARMget_register(13)
242         print "set_register(14,0x4141):  %x"%client.ARMset_register(14,0x4155)
243         print "get_register(14):             %x"%client.ARMget_register(14)
244         #print "set_register(15,0x4141):  %x"%client.ARMset_register(15,0x41414156)
245         #print "get_register(15):             %x"%client.ARMget_register(15)
246
247
248 seed = 0
249 def test5(start=0,end=15):
250     global results,seed
251     results = [[] for x in range(end)]
252     while True:
253         #print "IDCODE:      %x"%client.ARMident()
254         #print "Debug State: %x"%client.ARMget_dbgstate ()
255         for x in range(start,end):
256             num = client.ARMset_register(x,seed)
257             print "set_register(%d,0x%x):  %x"%(x,seed,num)
258             num = client.ARMget_register(x)
259             print "get_register(%d):             %x"%(x,num)
260             results[x].append(num)
261             if (num != seed):
262                 for y in range(13):
263                     num = client.ARMset_register(x,seed)
264                     print "set_register(%d,0x%x):  %x"%(x,seed,num)
265                     num = client.ARMget_register(x)
266                     print "get_register(%d):             %x"%(x,num)
267                     results[x].append(num)
268             seed += 1
269             client.ARMident()
270             client.ARMident()
271             print "Debug State: %x"%client.ARMget_dbgstate ()
272
273 def test6(start=0,end=15):
274     global results,seed
275     results = [[] for x in range(end)]
276     while True:
277         #print "IDCODE:      %x"%client.ARMident()
278         #print "Debug State: %x"%client.ARMget_dbgstate ()
279         for x in range(start,end):
280             num = client.ARMset_register(x,seed+x)
281             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
282             client.ARMident()
283             client.ARMident()
284         for x in range(start,end):
285             num = client.ARMget_register(x)
286             print "get_register(%d):             %x"%(x,num)
287             results[x].append(num)
288             if (num != seed+x):
289                 for y in range(13):
290                     num = client.ARMset_register(x,seed+x)
291                     print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
292                     num = client.ARMget_register(x)
293                     print "get_register(%d):             %x"%(x,num)
294                     results[x].append(num)
295             client.ARMident()
296             client.ARMident()
297             print "Debug State: %x"%client.ARMget_dbgstate ()
298         seed += 1
299
300 def test7(start=0,end=14):
301     global results,seed
302     results = [[] for x in range(end)]
303     while True:
304         #print "IDCODE:      %x"%client.ARMident()
305         #print "Debug State: %x"%client.ARMget_dbgstate ()
306         for x in range(end,start-1, -1):
307             num = client.ARMset_register(x,seed+x)
308             time.sleep(1)
309             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
310         for y in range(10):
311           for x in range(start,endi+1):
312             num = client.ARMget_register(x)
313             time.sleep(1)
314             print "get_register(%d):             %x"%(x,num)
315             results[x].append(num)
316         seed += 1
317
318 def readtest(start=0,end=14):
319     global results,seed
320     results = [[] for x in range(end)]
321     while True:
322         #print "IDCODE:      %x"%client.ARMident()
323         #print "Debug State: %x"%client.ARMget_dbgstate ()
324         for x in range(end,start, -1):
325             num = client.ARMget_register(x)
326             time.sleep(1)
327             print "get_register(%d):  %x"%(x,num)
328         for y in range(10):
329           for x in range(start,end,2):
330             num = client.ARMget_register(x)
331             time.sleep(1)
332             print "get_register(%d):             %x"%(x,num)
333             results[x].append(num)
334         seed += 1
335
336 init()
337 print "Don't forget to 'client.stop()' if you want to exit cleanly"
338
339
340 def printResults():
341     for y in range(len(results)):
342             x=results[y]
343             print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
344
345 """
346   case 0xD0: // loopback test
347     cmddatalong[0] = 0x12345678;
348   case 0xD1: // Set Scan Chain
349     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
350   case 0xD2: //
351     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
352   case 0xD3:
353     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
354   case 0xD4:
355     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
356   case 0xD5:
357     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
358   case 0xD6:
359     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
360   case 0xD7:
361     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
362   case 0xD8:
363     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
364 """
365
366 """
367 if(sys.argv[1]=="test"):
368     client.CCtest();
369 if(sys.argv[1]=="deadtest"):
370     for i in range(1,10):
371         print "IDENT as %s" % client.CCidentstr();
372 if(sys.argv[1]=="dumpcode"):
373     f = sys.argv[2];
374     start=0x0000;
375     stop=0xFFFF;
376     if(len(sys.argv)>3):
377         start=int(sys.argv[3],16);
378     if(len(sys.argv)>4):
379         stop=int(sys.argv[4],16);
380     
381     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
382     h = IntelHex(None);
383     i=start;
384     while i<=stop:
385         h[i]=client.CCpeekcodebyte(i);
386         if(i%0x100==0):
387             print "Dumped %04x."%i;
388         i+=1;
389     h.write_hex_file(f);
390 if(sys.argv[1]=="dumpdata"):
391     f = sys.argv[2];
392     start=0xE000;
393     stop=0xFFFF;
394     if(len(sys.argv)>3):
395         start=int(sys.argv[3],16);
396     if(len(sys.argv)>4):
397         stop=int(sys.argv[4],16);
398     
399     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
400     h = IntelHex(None);
401     i=start;
402     while i<=stop:
403         h[i]=client.CCpeekdatabyte(i);
404         if(i%0x100==0):
405             print "Dumped %04x."%i;
406         i+=1;
407     h.write_hex_file(f);
408 if(sys.argv[1]=="status"):
409     print "Status: %s" %client.CCstatusstr();
410 if(sys.argv[1]=="erase"):
411     print "Status: %s" % client.CCstatusstr();
412     client.CCchiperase();
413     print "Status: %s" %client.CCstatusstr();
414
415 if(sys.argv[1]=="peekinfo"):
416     print "Select info flash."
417     client.CCwr_config(1);
418     print "Config is %02x" % client.CCrd_config();
419     
420     start=0x0000;
421     if(len(sys.argv)>2):
422         start=int(sys.argv[2],16);
423     stop=start;
424     if(len(sys.argv)>3):
425         stop=int(sys.argv[3],16);
426     print "Peeking from %04x to %04x." % (start,stop);
427     while start<=stop:
428         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
429         start=start+1;
430 if(sys.argv[1]=="poke"):
431     client.CCpokeirambyte(int(sys.argv[2],16),
432                           int(sys.argv[3],16));
433 if(sys.argv[1]=="randtest"):
434     #Seed RNG
435     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
436     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
437     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
438     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
439     
440     #Dump values
441     for foo in range(1,10):
442         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
443         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
444         client.CCreleasecpu();
445         client.CChaltcpu();
446     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
447 if(sys.argv[1]=="adctest"):
448     # ADCTest 0xDF3A 0xDF3B
449     print "ADC TEST %02x%02x" % (
450         client.CCpeekdatabyte(0xDF3A),
451         client.CCpeekdatabyte(0xDF3B));
452 if(sys.argv[1]=="config"):
453     print "Config is %02x" % client.CCrd_config();
454
455 if(sys.argv[1]=="flash"):
456      f=sys.argv[2];
457      start=0;
458      stop=0xFFFF;
459      if(len(sys.argv)>3):
460          start=int(sys.argv[3],16);
461      if(len(sys.argv)>4):
462          stop=int(sys.argv[4],16);
463    
464      h = IntelHex(f);
465      page = 0x0000;
466      pagelen = 2048; #2kB pages in 32-bit words
467      bcount = 0;
468      
469      print "Wiping Flash."
470      #Wipe all of flash.
471      #client.CCchiperase();
472      #Wipe the RAM buffer for the next flash page.
473      #client.CCeraseflashbuffer();
474      for i in h._buf.keys():
475          while(i>page+pagelen):
476              if bcount>0:
477                  client.CCflashpage(page);
478                  #client.CCeraseflashbuffer();
479                  bcount=0;
480                  print "Flashed page at %06x" % page
481              page+=pagelen;
482              
483          #Place byte into buffer.
484          client.CCpokedatabyte(0xF000+i-page,
485                                h[i]);
486          bcount+=1;
487          if(i%0x100==0):
488                 print "Buffering %04x toward %06x" % (i,page);
489      #last page
490      client.CCflashpage(page);
491      print "Flashed final page at %06x" % page;
492      
493 if(sys.argv[1]=="lock"):
494     print "Status: %s" %client.CCstatusstr();
495     client.CClockchip();
496     print "Status: %s" %client.CCstatusstr();
497 if(sys.argv[1]=="flashpage"):
498     target=0;
499     if(len(sys.argv)>2):
500         target=int(sys.argv[2],16);
501     print "Writing a page of flash from 0xF000 in XDATA"
502     client.CCflashpage(target);
503 if(sys.argv[1]=="erasebuffer"):
504     print "Erasing flash buffer.";
505     client.CCeraseflashbuffer();
506
507 if(sys.argv[1]=="writedata"):
508     f=sys.argv[2];
509     start=0;
510     stop=0xFFFF;
511     if(len(sys.argv)>3):
512         start=int(sys.argv[3],16);
513     if(len(sys.argv)>4):
514         stop=int(sys.argv[4],16);
515     
516     h = IntelHex(f);
517     
518     for i in h._buf.keys():
519         if(i>=start and i<=stop):
520             client.CCpokedatabyte(i,h[i]);
521             if(i%0x100==0):
522                 print "%04x" % i;
523 #if(sys.argv[1]=="flashtest"):
524 #    client.CCflashtest();
525 if(sys.argv[1]=="peekdata"):
526     start=0x0000;
527     if(len(sys.argv)>2):
528         start=int(sys.argv[2],16);
529     stop=start;
530     if(len(sys.argv)>3):
531         stop=int(sys.argv[3],16);
532     print "Peeking from %04x to %04x." % (start,stop);
533     while start<=stop:
534         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
535         start=start+1;
536 if(sys.argv[1]=="peek"):
537     start=0x0000;
538     if(len(sys.argv)>2):
539         start=int(sys.argv[2],16);
540     stop=start;
541     if(len(sys.argv)>3):
542         stop=int(sys.argv[3],16);
543     print "Peeking from %04x to %04x." % (start,stop);
544     while start<=stop:
545         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
546         start=start+1;
547
548 if(sys.argv[1]=="peekcode"):
549     start=0x0000;
550     if(len(sys.argv)>2):
551         start=int(sys.argv[2],16);
552     stop=start;
553     if(len(sys.argv)>3):
554         stop=int(sys.argv[3],16);
555     print "Peeking from %04x to %04x." % (start,stop);
556     while start<=stop:
557         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
558         start=start+1;
559 if(sys.argv[1]=="pokedata"):
560     start=0x0000;
561     val=0x00;
562     if(len(sys.argv)>2):
563         start=int(sys.argv[2],16);
564     if(len(sys.argv)>3):
565         val=int(sys.argv[3],16);
566     print "Poking %04x to become %02x." % (start,val);
567     client.CCpokedatabyte(start,val);
568
569 client.stop();
570 """