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