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@29
|
8 # see dbgi() 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@29
|
13 open('out', 'w').close()
|
jb302@29
|
14
|
jb302@29
|
15 def snd(self, m):
|
jb302@29
|
16 self.Emu.stdin.write(struct.pack('>B', m))
|
jb302@28
|
17
|
jb302@29
|
18 def rcv(self, l):
|
jb302@29
|
19 lc = 0
|
jb302@29
|
20 while lc != l:
|
jb302@29
|
21 lc = os.path.getsize('out')
|
jb302@29
|
22 sleep(0.5)
|
jb302@29
|
23 with open('out', 'r') as f:
|
jb302@29
|
24 c = f.read()
|
jb302@29
|
25 open('out', 'w').close()
|
jb302@29
|
26 return c
|
jb302@28
|
27
|
jb302@29
|
28 def step(self):
|
jb302@29
|
29 self.snd(0x00)
|
jb302@28
|
30
|
jb302@29
|
31 def run(self, lenh, lenl):
|
jb302@29
|
32 self.snd(0x01)
|
jb302@29
|
33 snd(lenh)
|
jb302@29
|
34 snd(lenl)
|
jb302@28
|
35
|
jb302@29
|
36 def set_reg(self, reg, data):
|
jb302@29
|
37 self.snd(0x02)
|
jb302@29
|
38 self.snd(reg) # reg
|
jb302@29
|
39 self.snd(data) # data
|
jb302@28
|
40
|
jb302@29
|
41 def get_reg(self, reg):
|
jb302@29
|
42 self.snd(0x03)
|
jb302@29
|
43 self.snd(reg) # reg
|
jb302@29
|
44 return self.rcv(1)
|
jb302@28
|
45
|
jb302@29
|
46 def set_flag(self, flag, on):
|
jb302@29
|
47 self.snd(0x04)
|
jb302@29
|
48 if on == 0:
|
jb302@29
|
49 self.snd(flag)
|
jb302@29
|
50 self.snd(0)
|
jb302@29
|
51 else:
|
jb302@29
|
52 self.snd(flag)
|
jb302@29
|
53 self.snd(1)
|
jb302@28
|
54
|
jb302@29
|
55 def get_flag(self, flag):
|
jb302@29
|
56 self.snd(0x05)
|
jb302@29
|
57 self.snd(flag)
|
jb302@29
|
58 return self.rcv(1)
|
jb302@28
|
59
|
jb302@29
|
60 def set_block(self, addrh, addrl, data):
|
jb302@29
|
61 self.snd(0x06)
|
jb302@29
|
62 self.snd(addrh) # address high byte
|
jb302@29
|
63 self.snd(addrl) # address low byte
|
jb302@29
|
64 self.snd((len(data) >> 8) & 0xFF)
|
jb302@29
|
65 self.snd(len(data) & 0xFF)
|
jb302@29
|
66 for b in data:
|
jb302@29
|
67 self.snd(b) # data
|
jb302@28
|
68
|
jb302@29
|
69 def get_block(self, addrh, addrl, lenh, lenl):
|
jb302@29
|
70 block = []
|
jb302@29
|
71 self.snd(0x07)
|
jb302@29
|
72 self.snd(addrh) # address high byte
|
jb302@29
|
73 self.snd(addrl) # address low byte
|
jb302@29
|
74 self.snd(lenh)
|
jb302@29
|
75 self.snd(lenl)
|
jb302@29
|
76 return self.rcv(lenl | (lenh << 8))
|
jb302@28
|
77
|
jb302@29
|
78 def get_a(self):
|
jb302@29
|
79 self.snd(0x09)
|
jb302@29
|
80 return self.rcv(1)
|
jb302@28
|
81
|
jb302@29
|
82 def get_flags(self):
|
jb302@29
|
83 self.snd(0x0A)
|
jb302@29
|
84 return self.rcv(1)
|
jb302@28
|
85
|
jb302@29
|
86 def get_ir(self):
|
jb302@29
|
87 self.snd(0x0B)
|
jb302@29
|
88 return self.rcv(1)
|
jb302@29
|
89
|
jb302@29
|
90
|