jb302@34: #!/usr/bin/env python jb302@34: # dbg.py - debug client jb302@34: import struct jb302@34: import os, sys jb302@34: from time import sleep jb302@34: jb302@34: # talks to the emulator jb302@34: # see controller() in emu/main.c for the inverse jb302@34: class controller: jb302@34: jb302@34: def __init__(self): jb302@34: self.Emu = None jb302@34: open('out', 'w').close() jb302@34: jb302@34: # Alternetive snd and rcv functions need to be jb302@34: # written read/write using serial buffer to make jb302@34: # this class talk to an emulator running on jb302@34: # an MCU jb302@34: def snd(self, m): jb302@34: self.Emu.stdin.write(struct.pack('>B', m)) jb302@34: jb302@34: def rcv(self, l): jb302@34: lc = 0 jb302@34: while lc != l: jb302@34: lc = os.path.getsize('out') jb302@34: #sleep(0.5) jb302@34: with open('out', 'r') as f: jb302@34: c = f.read() jb302@34: open('out', 'w').close() jb302@34: return c jb302@34: jb302@34: def step(self): jb302@34: self.snd(0x00) jb302@34: jb302@34: def run(self): jb302@34: self.snd(0x01) jb302@34: jb302@34: def set_reg(self, reg, data): jb302@34: self.snd(0x02) jb302@34: self.snd(reg) # reg jb302@34: self.snd(data) # data jb302@34: jb302@34: def get_reg(self, reg): jb302@34: self.snd(0x03) jb302@34: self.snd(reg) # reg jb302@34: return self.rcv(1) jb302@34: jb302@34: def set_flag(self, flag, on): jb302@34: self.snd(0x04) jb302@34: if on == 0: jb302@34: self.snd(flag) jb302@34: self.snd(0) jb302@34: else: jb302@34: self.snd(flag) jb302@34: self.snd(1) jb302@34: jb302@34: def get_flag(self, flag): jb302@34: self.snd(0x05) jb302@34: self.snd(flag) jb302@34: return self.rcv(1) jb302@34: jb302@34: def set_block(self, addrh, addrl, data): jb302@34: self.snd(0x06) jb302@34: self.snd(addrh) # address high byte jb302@34: self.snd(addrl) # address low byte jb302@34: self.snd((len(data) >> 8) & 0xFF) jb302@34: self.snd(len(data) & 0xFF) jb302@34: for b in data: jb302@34: self.snd(b) # data jb302@34: jb302@34: def get_block(self, addrh, addrl, lenh, lenl): jb302@34: block = [] jb302@34: self.snd(0x07) jb302@34: self.snd(addrh) # address high byte jb302@34: self.snd(addrl) # address low byte jb302@34: self.snd(lenh) jb302@34: self.snd(lenl) jb302@34: return self.rcv(lenl | (lenh << 8)) jb302@34: jb302@34: def get_a(self): jb302@34: self.snd(0x09) jb302@34: return self.rcv(1) jb302@34: jb302@34: def get_flags(self): jb302@34: self.snd(0x0A) jb302@34: return self.rcv(1) jb302@34: jb302@34: def get_ir(self): jb302@34: self.snd(0x0B) jb302@34: return self.rcv(1) jb302@34: jb302@34: def run_len(self, lenh, lenl): jb302@34: self.snd(0x0C) jb302@34: self.snd(lenh) jb302@34: self.snd(lenl) jb302@34: jb302@34: def free_run(self): jb302@34: self.snd(0x0D) jb302@34: jb302@34: def set_bp(self, i, addrh, addrl): jb302@34: self.snd(0x0E) jb302@34: self.snd(i) jb302@34: self.snd(addrh) jb302@34: self.snd(addrl) jb302@34: jb302@34: jb302@34: jb302@34: jb302@34: