def __call__(self, word) -> None: self.word = word self.op_code = self.word.get_opcode() self.rs = ( ((1 << 5) - 1) & (self.word.data >> (21) ) ) self.rt = ( ((1 << 5) - 1) & (self.word.data >> (16) ) ) self.imediate = TwoComp.two_complement(( ((1 << 16) - 1) & (self.word.data >> (0) ) ), 16) self.rs_number = self.rs self.rt_number = self.rt return self
def __call__(self, word: Word) -> None: self.word = word self.op_code = self.word.get_opcode() self.base = (((1 << 5) - 1) & (self.word.data >> (21))) self.ft = (((1 << 5) - 1) & (self.word.data >> (16))) self.offset_raw = (((1 << 16) - 1) & (self.word.data >> (0))) self.offset = TwoComp.two_complement(self.offset_raw, 16) self.ft_number = self.ft return self
def execute(self, registers: Registers, program_counter, memory: Memory, *args, **kwargs): local_registers = registers immediate_value = self.imediate rs_register = local_registers.get_register(self.rs_number) rs_address = rs_register.get_data_unsigned() word = memory.load(rs_address + immediate_value * 4) word = (((1 << 16) - 1) & (word >> (0))) word = TwoComp.two_complement(word, 16) local_registers.set_register_value(self.rt_number, word) return local_registers, program_counter + 4, memory, kwargs[ 'coprocessor'].registers
def __call__(self, word) -> None: self.word = word self.op_code = self.word.get_opcode() self.address_raw = ( ((1 << 26) - 1) & (self.word.data >> (0) ) ) self.jump_address = TwoComp.two_complement(self.address_raw, 26) return self
def get_data_unsigned(self): return TwoComp.unsigned(self.value.data, 32)
def get_data(self): return TwoComp.two_complement(self.value.data, 32)
def to_unsigned_int(self): return TwoComp.unsigned(self.value.data, 32)
def to_signed_int(self): return TwoComp.two_complement(self.value.data, 32)
def decode(self, registers: Registers, *args, **kwargs) -> str: rs_name = registers.get_register_name(self.rs_number) rt_name = registers.get_register_name(self.rt_number) immediate_value = TwoComp.two_complement(self.imediate, 15) return f"{self.instruction_name} {rt_name}, {rs_name}, {immediate_value}" # noqa: E501