SC91-A, instructions simples : calculs logiques et sauts
SC91-A, instruction de chargement direct

Etape 11 : Ajout d'instructions simples

Les instructions les plus simples à ajouter au processeur sont sans aucun doute NOP, AND, OR, XOR, JMP et JMPR. Elles ne demandent pas de traitement complexes dans l'ALU et n'ont pas de mode particulier. Elles permettront en outre d'ecrire un premier programme digne de ce nom.

Modification de l'ALU

L'ALU va être modifiée par rapport à ce que nous avons vu précédemment, je ne rentre pas dans le détail des modifications dûes aux nouvelles fonctions, elle n'on rien de très interressant. Par contre, l'ALU doit intégrer maintenant un système d'aiguillage en sortie, fonction du calculs souhaité par l'instruction, tous les calculs possibles étant toujours réalisés par l'ALU à chaque cycle.

         -- ==========================================================================================
         -- Output routing
         DDD <= LOADd_OUT when ALU_SELECT = SELECT_LOADD else
                AND_out   when ALU_SELECT = SELECT_AND   else
                OR_out    when ALU_SELECT = SELECT_OR    else
                XOR_out   when ALU_SELECT = SELECT_XOR   else
                DNN;                                         -- default : pass-throught

         C   <= '0' when ALU_SELECT = SELECT_LOADD else
                '0' when ALU_SELECT = SELECT_AND   else
                '0' when ALU_SELECT = SELECT_OR    else
                '0' when ALU_SELECT = SELECT_XOR   else
                '0';
      

Le bus de sortie, DDD, reçoit donc le résultat du calcul correspondant à l'instruction en cours, le signal ALU_SELECT est transmis par le séquenseur en fonction de l'instruction.
Le signal Carry est lui aussi aiguillé de cette façon à partir des signaux intermédiaires ou de constante comme s'est ici le cas.
Lors d'un saut de type JMPr, l'adresse de destination est passée sur DDD provenant de DNN. Ce comportement de type transparant est celui utilité par défaut.

Un premier vrai programme

Ces premières instructions permettent d'écrire un premier programme de test dont le code source est ci dessous. Il utilise toujours R04 comme registre de résultat de sorte à visualiser sur les afficheurs les calculs. Pour les besoins de tests l'adresse du pointeur de code est elle aussi affichée sur les led de la carte.

         -- 11111100 00100 0100001100100001 00 0 - LOAD R04,0x4321,low           0
         -- 11111100 00100 1000011101100101 01 0 - LOAD R04,0x8765,high          4
         -- 11111100 00101 1010010110100101 00 0 - LOAD R05,0xA5A5,low           8
         -- 11111100 00101 1010010110100101 01 0 - LOAD R05,0xA5A5,high          C
         -- 11110001 00100 00100 00101 000000000 - AND R04,R04,R05              10
         -- 00 000000000000000000000000000111    - JMP 1C                       14
         -- 11110011 00100 00100 00100 000000000 - XOR R04,R04,R04              18
         -- 11110010 00100 00100 00101 000000000 - OR  R04,R04,R05              1C
         -- 11110011 00100 00100 00101 000000000 - XOR R04,R04,R05              20
         -- 11101000 00000 00100 000000000000    - JMP @R04                     24
      

Le programme boucle à l'infinie conformément à ce qui est attendu, les résulats calculés sont justes.

Architecture de l'ALU
Simple-Cpu The Simple CPU project The Simple CPU project
Un projet de disk91
Small CPU project