def __read_string(self, address, memory: Memory, pc, logger):
        string = ""
        if address % 4 != 0:
            relative = address % 4
            relative_address = address - relative

            word = memory.load(relative_address)
            word = Int2Bits.convert(word.data)

            word_relative_data = word[:-8 * relative]
            for x in range(len(word_relative_data), 0, -8):
                char = Bin2Chr.convert(word_relative_data[x - 8:x])
                string += char
            address = relative_address + 4
        word = memory.load(address=address)
        d = Int2Bits.convert(word.data)
        while True:
            for x in range(len(d), 0, -8):
                char = Bin2Chr.convert(d[x - 8:x])
                if char == '\0':
                    return string
                else:
                    string += char
            if address % 4 == 0:
                address = address + 4
            else:
                address = address + (4 - (address % 4))
            word = memory.load(address=address)
            d = Int2Bits.convert(word.data)
    def execute(self, registers: Registers, coprocessor: COProcessor,
                program_counter, memory: Memory, *args, **kwargs):
        local_registers = registers
        local_co_registers = coprocessor.registers
        new_pc = program_counter
        new_memory = memory

        v0_register = local_registers.get_register(self.v0)
        v0_value = v0_register.get_data()

        a0_register = local_registers.get_register(self.a0)

        f12_register = local_co_registers.get_register(self.f12)
        f13_register = local_co_registers.get_register(self.f13)

        if v0_value == 1:
            print(a0_register.get_data(), end='')
        elif v0_value == 2:
            print(f12_register.to_single_precision(), end='')
        elif v0_value == 3:
            f13_b = Int2Bits.convert(f13_register.get_data())
            f12_b = Int2Bits.convert(f12_register.get_data())
            f = f13_b + f12_b
            print(Bin2Float.convert(f, True), end='')
        elif v0_value == 4:
            a0_address = a0_register.get_data()
            string = self.__read_string(a0_address,
                                        memory=memory,
                                        pc=program_counter,
                                        logger=kwargs['logger'])
            print(string, end='')

        elif v0_value == 5:
            read = int(input())
            local_registers.set_register_value(self.v0, read)
        elif v0_value == 6:
            read = float(input())
            read_bit = Float2Int.convert(read)
            local_co_registers.set_register_value(self.f0, read_bit)
        elif v0_value == 7:
            read = float(input())
            read_bit = Float2Bin.convert(read, True)
            read_bit_high = Bin2Int.convert(read_bit[0:32])
            read_bit_low = Bin2Int.convert(read_bit[32:64])

            local_co_registers.set_register_value(self.f1, read_bit_high)
            local_co_registers.set_register_value(self.f0, read_bit_low)

        elif v0_value == 10:
            return local_registers, -1, new_memory, local_co_registers
        elif v0_value == 11:
            print(Bin2Chr.convert(Int2Bits.convert(a0_register.get_data())),
                  end='')

        return local_registers, new_pc + 4, new_memory, local_co_registers
    def execute(self, registers: Registers, coprocessor: COProcessor,
                program_counter, memory: Memory, *args, **kwargs):
        local_registers = coprocessor.registers
        fs_register = local_registers.get_register(self.fs_number)
        fs1_register = local_registers.get_register(self.fs_number + 1)
        fs = Int2Bits.convert(fs1_register.to_signed_int()) + Int2Bits.convert(
            fs_register.to_signed_int())

        fs = Bin2Float.convert(fs, True)
        fs_bits = Float2Bin.convert(fs)
        fs = Bin2Int.convert(fs_bits)
        local_registers.set_register_value(self.fd_number, fs)
        return registers, program_counter + 4, memory, local_registers
示例#4
0
 def execute(self,
             registers: Registers,
             coprocessor: COProcessor,
             program_counter,
             memory: Memory,
             *args,
             **kwargs):
     local_registers = coprocessor.registers
     fs_register = local_registers.get_register(self.fs_number)
     ft_register = local_registers.get_register(self.ft_number)
     
     fs = Bin2Float.convert(Int2Bits.convert(fs_register.to_signed_int()))
     ft = Bin2Float.convert(Int2Bits.convert(ft_register.to_signed_int()))
     
     fd = fs * ft
     fd = Float2Int.convert(fd)
     local_registers.set_register_value(self.fd_number, fd)
     return registers, program_counter + 4, memory, local_registers
示例#5
0
    def execute(self, registers: Registers, program_counter, memory: Memory,
                *args, **kwargs):
        local_registers = registers
        rs_register = local_registers.get_register(self.rs_number)
        rt_register = local_registers.get_register(self.rt_number)

        rd = ~(rs_register.to_unsigned_int() | rt_register.to_unsigned_int())
        rd_bits = Int2Bits.convert(rd)
        local_registers.set_register_value(self.rd_number, rd_bits)
        return local_registers, program_counter + 4, memory, kwargs[
            'coprocessor'].registers
示例#6
0
    def execute(self, registers: Registers, program_counter, memory: Memory,
                *args, **kwargs):
        local_registers = registers
        rt_register = local_registers.get_register(self.rt_number)

        s = self.shamt_value
        rt = rt_register.to_signed_int()
        bits = Int2Bits.convert(rt)
        rd_bits = bits[0] * self.shamt_value + bits[:32 - self.shamt_value]
        rd = Bin2Int.convert(rd_bits, False)

        local_registers.set_register_value(self.rd_number, rd)
        return local_registers, program_counter + 4, memory, kwargs[
            'coprocessor'].registers
    def execute(self, registers, coprocessor: COProcessor, program_counter,
                memory: Memory, *args, **kwargs):
        local_registers = coprocessor.registers
        fs_register = local_registers.get_register(self.fs_number)
        fs1_register = local_registers.get_register(self.fs_number + 1)

        ft_register = local_registers.get_register(self.ft_number)
        ft1_register = local_registers.get_register(self.ft_number + 1)

        fs = Bin2Float.convert(
            Int2Bits.convert(fs1_register.to_signed_int()) +
            Int2Bits.convert(fs_register.to_signed_int()), True)
        ft = Bin2Float.convert(
            Int2Bits.convert(ft1_register.to_signed_int()) +
            Int2Bits.convert(ft_register.to_signed_int()), True)
        rd = fs + ft

        fd_bin = Float2Bin.convert(rd, doubled=True)
        fd_bin_higher = Bin2Int.convert(fd_bin[0:32])
        fd_bin_lower = Bin2Int.convert(fd_bin[32:64])

        local_registers.set_register_value(self.fd_number + 1, fd_bin_higher)
        local_registers.set_register_value(self.fd_number, fd_bin_lower)
        return registers, program_counter + 4, memory, local_registers
示例#8
0
    def execute(self,
                registers: Registers,
                program_counter,
                memory: Memory,
                *args,
                **kwargs):
        local_registers = registers
        rs_register = local_registers.get_register(self.rs_number)
        rt_register = local_registers.get_register(self.rt_number)

        result = rs_register.to_signed_int() * rt_register.to_signed_int()
        result = Int2Bits.convert(result, size=64)
        hi = Bin2Int.convert(result[0:32])
        lo = Bin2Int.convert(result[32:64])

        local_registers.set_hi_value(hi)
        local_registers.set_lo_value(lo)
        return local_registers, program_counter + 4, memory, kwargs['coprocessor'].registers