def dispatch(self): """ Execute instruction at [PC] """ instruction = self.cpu.ram[self.cpu.PC.value].value self.cpu.PC.value = self.cpu.PC.value + 1 op_code, b_val, a_val = unpack_instruction(instruction) if op_code == 0x00: self.non_basic(instruction) else: b = value_lookup(self.cpu, b_val, as_a=False) a = value_lookup(self.cpu, a_val, as_a=True) if not self.cpu.skip_instruction: self.BASIC_INSTRUCTIONS[op_code](b, a) else: self.cpu.skip_instruction = False
def non_basic(self, instruction): opcode, a_val = unpack_special_instruction(instruction) if(opcode != OPCODE.JSR): return a = value_lookup(self.cpu, a_val, as_a=True) if self.cpu.skip_instruction: self.cpu.skip_instruction = False return # Push next address to the stack if self.cpu.SP.value < 0: self.halt('Stack overflow') self.cpu.SP.value -= 1 self.cpu.ram[self.cpu.SP.value].value = self.cpu.PC.value self.cpu.PC.value = a.value