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))