Mercurial > hg > ede
diff dbg/dbg.py @ 29:83e80c2c489c
seperated working emu code from broken emu code.
wrote dbg interface
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Sun, 13 Apr 2014 22:42:57 +0100 |
parents | 6d32e54e5c16 |
children | 4411dee34085 |
line wrap: on
line diff
--- a/dbg/dbg.py Fri Apr 11 14:38:09 2014 +0100 +++ b/dbg/dbg.py Sun Apr 13 22:42:57 2014 +0100 @@ -2,89 +2,89 @@ # dbg.py - debug client import struct import os, sys -from subprocess import Popen, PIPE, STDOUT +from time import sleep -emu = Popen(['./a.out'], stdout=PIPE, stdin=PIPE, stderr=PIPE) +# talks to the emulator +# see dbgi() in emu/main.c for the inverse +class controller: + + def __init__(self): + self.Emu = None + open('out', 'w').close() + + def snd(self, m): + self.Emu.stdin.write(struct.pack('>B', m)) -def snd(m): - emu.stdin.write(struct.pack('>B', m)) + def rcv(self, l): + lc = 0 + while lc != l: + lc = os.path.getsize('out') + sleep(0.5) + with open('out', 'r') as f: + c = f.read() + open('out', 'w').close() + return c -def rcv(): - with open('out', 'r') as f: - c = f.read() - return c + def step(self): + self.snd(0x00) -def step(): - snd(0x00) + def run(self, lenh, lenl): + self.snd(0x01) + snd(lenh) + snd(lenl) -def run(): - snd(0x01) + def set_reg(self, reg, data): + self.snd(0x02) + self.snd(reg) # reg + self.snd(data) # data -def set_reg(reg, data): - snd(0x02) - snd(reg) # reg - snd(data) # data + def get_reg(self, reg): + self.snd(0x03) + self.snd(reg) # reg + return self.rcv(1) -def get_reg(reg): - snd(0x03) - snd(reg) # reg - #return rcv() + def set_flag(self, flag, on): + self.snd(0x04) + if on == 0: + self.snd(flag) + self.snd(0) + else: + self.snd(flag) + self.snd(1) -def set_flag(flag, on): - snd(0x04) - if on == 0: - snd(flag) - snd(0) - else: - snd(flag) - snd(1) + def get_flag(self, flag): + self.snd(0x05) + self.snd(flag) + return self.rcv(1) -def get_flag(flag): - snd(0x05) - snd(flag) - #return rcv() + def set_block(self, addrh, addrl, data): + self.snd(0x06) + self.snd(addrh) # address high byte + self.snd(addrl) # address low byte + self.snd((len(data) >> 8) & 0xFF) + self.snd(len(data) & 0xFF) + for b in data: + self.snd(b) # data -def set_block(addrh, addrl, lenh, lenl, data): - snd(0x06) - snd(addrh) # address high byte - snd(addrl) # address low byte - snd(lenh) - snd(lenl) - for b in data: - snd(b) # data + def get_block(self, addrh, addrl, lenh, lenl): + block = [] + self.snd(0x07) + self.snd(addrh) # address high byte + self.snd(addrl) # address low byte + self.snd(lenh) + self.snd(lenl) + return self.rcv(lenl | (lenh << 8)) -def get_block(addrh, addrl, lenh, lenl): - block = [] - snd(0x07) - snd(addrh) # address high byte - snd(addrl) # address low byte - snd(lenh) - snd(lenl) - #lc = 0 - #while lc != l: - # lc = os.path.getsize('out'); - #return rcv() + def get_a(self): + self.snd(0x09) + return self.rcv(1) -registers = { - 'r0':0, - 'r1':1, - 'r2':2, - 'r3':3, - 'dph':4, - 'dpl':5, - 'sph':6, - 'spl':7, - 'a':8, - 'flags':9 - } + def get_flags(self): + self.snd(0x0A) + return self.rcv(1) -cmds = { - 'step':step, - 'run':run, - 'sr':set_reg, - 'gr':get_reg, - 'sf':set_flag, - 'gf':get_flag, - 'sb':set_block, - 'gb':get_block - } + def get_ir(self): + self.snd(0x0B) + return self.rcv(1) + +