view dbg/dbg.py @ 37:db6b8c9552bb

couple of last minute bug fixes
author james <jb302@eecs.qmul.ac.uk>
date Fri, 18 Apr 2014 18:58:58 +0100
parents 4411dee34085
children 6b947f6d69d9
line wrap: on
line source
#!/usr/bin/env python
# dbg.py - debug client
import struct
import os, sys
from time import sleep

# talks to the emulator
# see controller() in emu/main.c for the inverse
class controller:
    
    def __init__(self):
        self.Emu = None
        open('out', 'w').close()
    
    # Alternetive snd and rcv functions need to be
    # written read/write using serial buffer to make
    # this class talk to an emulator running on
    # an MCU
    def snd(self, m):
        self.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 step(self):
        self.snd(0x00)

    def run(self):
        self.snd(0x01)

    def set_reg(self, reg, data):
        self.snd(0x02)
        self.snd(reg)  # reg
        self.snd(data) # data

    def get_reg(self, reg):
        self.snd(0x03)
        self.snd(reg)  # reg
        return self.rcv(1)

    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 get_flag(self, flag):
        self.snd(0x05)
        self.snd(flag)
        return self.rcv(1)

    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 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_a(self):
        self.snd(0x08)
        return self.rcv(1)

    def get_flags(self):
        self.snd(0x09)
        return self.rcv(1)

    def get_ir(self):
        self.snd(0x0A)
        return self.rcv(1)

    def run_len(self, lenh, lenl):
        self.snd(0x0B)
        self.snd(lenh)
        self.snd(lenl)

    def free_run(self):
        self.snd(0x0C)

    def set_bp(self, i, addrh, addrl):
        self.snd(0x0D)
        self.snd(i)
        self.snd(addrh)
        self.snd(addrl)