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