jb302@34
|
1 #!/usr/bin/env python
|
jb302@34
|
2 # dbg.py - debug client
|
jb302@34
|
3 import struct
|
jb302@34
|
4 import os, sys
|
jb302@34
|
5 from time import sleep
|
jb302@34
|
6
|
jb302@34
|
7 # talks to the emulator
|
jb302@34
|
8 # see controller() in emu/main.c for the inverse
|
jb302@34
|
9 class controller:
|
jb302@34
|
10
|
jb302@34
|
11 def __init__(self):
|
jb302@34
|
12 self.Emu = None
|
jb302@34
|
13 open('out', 'w').close()
|
jb302@34
|
14
|
jb302@34
|
15 # Alternetive snd and rcv functions need to be
|
jb302@34
|
16 # written read/write using serial buffer to make
|
jb302@34
|
17 # this class talk to an emulator running on
|
jb302@34
|
18 # an MCU
|
jb302@34
|
19 def snd(self, m):
|
jb302@34
|
20 self.Emu.stdin.write(struct.pack('>B', m))
|
jb302@34
|
21
|
jb302@34
|
22 def rcv(self, l):
|
jb302@34
|
23 lc = 0
|
jb302@34
|
24 while lc != l:
|
jb302@34
|
25 lc = os.path.getsize('out')
|
jb302@34
|
26 #sleep(0.5)
|
jb302@34
|
27 with open('out', 'r') as f:
|
jb302@34
|
28 c = f.read()
|
jb302@34
|
29 open('out', 'w').close()
|
jb302@34
|
30 return c
|
jb302@34
|
31
|
jb302@34
|
32 def step(self):
|
jb302@34
|
33 self.snd(0x00)
|
jb302@34
|
34
|
jb302@34
|
35 def run(self):
|
jb302@34
|
36 self.snd(0x01)
|
jb302@34
|
37
|
jb302@34
|
38 def set_reg(self, reg, data):
|
jb302@34
|
39 self.snd(0x02)
|
jb302@34
|
40 self.snd(reg) # reg
|
jb302@34
|
41 self.snd(data) # data
|
jb302@34
|
42
|
jb302@34
|
43 def get_reg(self, reg):
|
jb302@34
|
44 self.snd(0x03)
|
jb302@34
|
45 self.snd(reg) # reg
|
jb302@34
|
46 return self.rcv(1)
|
jb302@34
|
47
|
jb302@34
|
48 def set_flag(self, flag, on):
|
jb302@34
|
49 self.snd(0x04)
|
jb302@34
|
50 if on == 0:
|
jb302@34
|
51 self.snd(flag)
|
jb302@34
|
52 self.snd(0)
|
jb302@34
|
53 else:
|
jb302@34
|
54 self.snd(flag)
|
jb302@34
|
55 self.snd(1)
|
jb302@34
|
56
|
jb302@34
|
57 def get_flag(self, flag):
|
jb302@34
|
58 self.snd(0x05)
|
jb302@34
|
59 self.snd(flag)
|
jb302@34
|
60 return self.rcv(1)
|
jb302@34
|
61
|
jb302@34
|
62 def set_block(self, addrh, addrl, data):
|
jb302@34
|
63 self.snd(0x06)
|
jb302@34
|
64 self.snd(addrh) # address high byte
|
jb302@34
|
65 self.snd(addrl) # address low byte
|
jb302@34
|
66 self.snd((len(data) >> 8) & 0xFF)
|
jb302@34
|
67 self.snd(len(data) & 0xFF)
|
jb302@34
|
68 for b in data:
|
jb302@34
|
69 self.snd(b) # data
|
jb302@34
|
70
|
jb302@34
|
71 def get_block(self, addrh, addrl, lenh, lenl):
|
jb302@34
|
72 block = []
|
jb302@34
|
73 self.snd(0x07)
|
jb302@34
|
74 self.snd(addrh) # address high byte
|
jb302@34
|
75 self.snd(addrl) # address low byte
|
jb302@34
|
76 self.snd(lenh)
|
jb302@34
|
77 self.snd(lenl)
|
jb302@34
|
78 return self.rcv(lenl | (lenh << 8))
|
jb302@34
|
79
|
jb302@34
|
80 def get_a(self):
|
jb302@34
|
81 self.snd(0x09)
|
jb302@34
|
82 return self.rcv(1)
|
jb302@34
|
83
|
jb302@34
|
84 def get_flags(self):
|
jb302@34
|
85 self.snd(0x0A)
|
jb302@34
|
86 return self.rcv(1)
|
jb302@34
|
87
|
jb302@34
|
88 def get_ir(self):
|
jb302@34
|
89 self.snd(0x0B)
|
jb302@34
|
90 return self.rcv(1)
|
jb302@34
|
91
|
jb302@34
|
92 def run_len(self, lenh, lenl):
|
jb302@34
|
93 self.snd(0x0C)
|
jb302@34
|
94 self.snd(lenh)
|
jb302@34
|
95 self.snd(lenl)
|
jb302@34
|
96
|
jb302@34
|
97 def free_run(self):
|
jb302@34
|
98 self.snd(0x0D)
|
jb302@34
|
99
|
jb302@34
|
100 def set_bp(self, i, addrh, addrl):
|
jb302@34
|
101 self.snd(0x0E)
|
jb302@34
|
102 self.snd(i)
|
jb302@34
|
103 self.snd(addrh)
|
jb302@34
|
104 self.snd(addrl)
|
jb302@34
|
105
|
jb302@34
|
106
|
jb302@34
|
107
|
jb302@34
|
108
|
jb302@34
|
109
|