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.