예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
    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
예제 #4
0
 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
예제 #5
0
 def get_data_unsigned(self):
     return TwoComp.unsigned(self.value.data, 32)
예제 #6
0
 def get_data(self):
     return TwoComp.two_complement(self.value.data, 32)
예제 #7
0
 def to_unsigned_int(self):
     return TwoComp.unsigned(self.value.data, 32)
예제 #8
0
 def to_signed_int(self):
     return TwoComp.two_complement(self.value.data, 32)
예제 #9
0
    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