Esempio n. 1
0
class CPU(object):
    def __init__(self, dmem, imem=None):
        self.r = Registers(dmem.size())
        self.dmem = dmem
        self.imem = imem

    def start(self, debug=None):
        log.info('=== CPU Start ===\n')

        if debug:
            last = '?'
            cmds = [
                '?', '(p)rint $reg', '(c)ontinue', '(d)ump', '(n)ext', '(q)uit'
            ]
            log.info("*** debug mode enabled. '?' for help ***\n")

        if self.imem is None:
            raise Exception('imem not set')

        while self.r.pc in xrange(len(self.imem)):
            instr = self.imem[self.r.pc]
            try:
                log.info('[{}] {}'.format(self.r.pc, instr.raw))
                self.r.pc += 1
                if debug:
                    while True:
                        inp = raw_input('(debug) ').strip()

                        if not inp:
                            inp = last
                        else:
                            last = inp

                        if inp in ['?', 'help']:
                            log.info('Commands: ' + ', '.join(cmds))
                        elif inp in ['d', 'dump']:
                            self.dump()
                        elif inp in ['c', 'continue']:
                            debug = False
                            break
                        elif inp in ['n', 'next']:
                            break
                        elif inp in ['q', 'quit']:
                            sys.exit()
                        elif inp.split()[0] in ['p', 'print']:
                            reg = inp.split()[1]
                            log.info(
                                self.r.read(
                                    reg[1:] if reg.startswith('$') else reg))
                        else:
                            log.error('Bad Command')
                self.execute_single(instr)
            except Exception, e:
                if e.message == 'exit syscall':
                    return
                raise e
        log.info('\n*** pc [{}] outside instruction memory ***'.format(
            self.r.pc))