Example #1
0
class IAS:

    #Funções Essenciais
    def read(self, endereco):
        b_endereco = BitStream('0b' + endereco)
        return self.memoria[b_endereco.int]

    def instrucao(self, opcode, endereco):
        b_opcode = BitStream('0b' + opcode)
        b_endereco = BitStream('0b' + endereco)
        self.ops[b_opcode.read('bin:8')](b_endereco)  

    #TRANSFERÊNCA DE DADOS
    def loadToAC(self, registro):
        self.AC = self.MQ

    def loadToMQ(self, registro):
        self.MQ = BitStream(int=self.memoria[registro.int].int, length=40)

    def store(self, registro):
        self.memoria[registro.int] = self.AC

    def load(self, registro):
        self.AC = BitStream(int=registro.int, length=40)

    def loadNeg(self, registro):
        self.AC = BitStream(int=registro.int, length=40)
        self.AC.invert(0)

    def loadAbs(self, registro):
        self.load(registro)
        if self.AC[0] == True:
            self.AC.invert(0)
    
    def loadNegAbs(self, registro):
        self.loadAbs(registro)
        self.AC.invert(0)

    #DESVIO INCONDICIONAL    
    def jumpL(self, registro):
        ops[self.memoria[registro][0:19]](registro)
    
    def jumpR(self, registro):
        ops[self.memoria[registro][20:39]](registro)

    #DESVIO CONDICIONAL
    def condJumpL(self, registro):
        if(self.AC[39] == 1):
            ops[self.memoria[registro][0:7]](self.memoria[registro][8:19].int)
    
    def condJumpR(self, registro):
        if(self.AC[39] == 1):
            ops[self.memoria[registro][20:27]](self.memoria[registro][28:40].int)

    #ARITIMÉTICA
    def add(self, registro):
        self.AC = BitStream(int=self.AC.int + self.memoria[registro.int].int, length=40)    

    def addAbs(self, registro):
        self.AC = BitStream(int=self.AC.int + abs(self.memoria[registro.int].int), length=40)

    def sub(self, registro):
        self.AC = BitStream(int=self.AC.int - self.memoria[registro.int].int, length=40)    

    def subRem(self, registro):
        self.AC = BitStream(int=self.AC.int - abs(self.memoria[registro.int].int), length=40)

    def mul(self, registro):
        res = BitStream(int=self.MQ.int * self.memoria[registro.int].int, length=40)
        self.AC = BitStream(int=res[40:80].int, length=40)
        self.MQ = BitStream(int=res[0:39].int, length=40)

    def div(self, registro):
        quo = BitStream(int=(self.AC.int / self.memoria[registro.int].int), length=40)
        rem = BitStream(int=self.AC.int % self.memoria[registro.int].int, length=40)
        self.AC = quo
        self.MQ = rem

    def ls(self, registro):
        self.AC <<= 1      

    def rs(self, registro):
        self.AC >>= 1

    #MODIFICAÇÃO DE ENDEREÇO
    def storL(self, registro):
        self.memoria[registro][20:39] = self.AC[0:19]
    
    def storR(self, registro):
        self.memoria[registro][0:19] = self.AC[0:19]
      
    def __init__(self):
        self.ops = {
        #TRANSFERÊNCA DE DADOS
        '00001010': self.loadToAC, #LOAD MQ Transfere o conteúdo do registro MQ para o AC
        '00001001': self.loadToMQ, #LOAD MQ,M(X) Transfere o contéudo do local de memória X para MQ
        '00100001': self.store, #STOR M(X) Transfere o conteúdo de AC para o local de memória X       
        '00000001': self.load, #LOAD M(X) Transfere M(X) para o AC
        '00000010': self.loadNeg,  #LOAD -M(X) Transfere -M(X) para o AC
        '00000011': self.loadAbs, #LOAD |M(X)| Transfere o valor absoluto de M(X) para o AC
        '00000100': self.loadNegAbs, #LOAD -|M(X)| Transfere -|M(X)| para o acumulador
        #DESVIO INCONDICIONAL
        '00001101': self.jumpL, #JUMP M(X,0:19) Apanha a próxima instrução da metade esquerda de M(X)
        '00001110': self.jumpR, #JUMP M(X,20:39) Apanha a próxima instrução da metade direita de M(X)
        #DESVIO CONDICIONAL
        '00001111': self.condJumpL, #JUMP+M(X,0:19) Se o número no AC for não negativo, apanha a próxima instrução da metade esquerda de M(X)
        '00010000': self.condJumpR, #JUMP+M(X,20:39) Se o número no AC for não negativo, apanha a próxima instrução da metade direita de M(X)       
        #ARITIMÉTICA
        '00000101': self.add, #ADD M(X) Soma M(X) com AC; coloca o resultado em AC
        '00000111': self.addAbs, #ADD |M(X)| Soma |M(X)| com AC; coloca o resultado em AC
        '00000110': self.sub, #SUB M(X) Subitrai M(X) de AC; coloca o resultado em AC
        '00001000': self.subRem, #SUB |M(X)| Subitrai |M(X) de AC; coloca o resultado em AC
        '00001011': self.mul, #MUL M(X) Multiplica M(X) por M(Q); coloca os bits mais significativos do resultado em AC; coloca os bits menos significtivos em M(Q)
        '00001100': self.div, #DIV M(X) Divide AC por M(X); coloca cociente em MQ e o resto em AC        
        '00010100': self.ls, #LSH Multiplica o AC por 2; ou seja, desloca à esquerda uma posição de bit
        '00010101': self.rs, #RSH Divide o AC por 2; ou seja, desloca uma posição à direita
        #MODIFICAÇÃO DE ENDEREÇO
        '00010010': self.storL, #STOR M(X,8:19) Substitui campo de endereço da esquerda em M(X) por 12 bits mais aà direita de AC
        '00010011': self.storR, #STOR M(X,28:39) Substitui campo de endereço da direita em M(X) por 12 bits mais aà direita de AC
        }       
        self.AC = BitStream(int=0, length=40)
        self.MQ = BitStream(int=0, length=40)
        self.memoria = [] 

        for i in range(1024):
            self.memoria.append(BitStream(int=0, length=40))