Jeu instruction cpu Cpu instruction set definition
définition du jeu d'instruction du processeur

Avant tout ne pas oublier la gestion des flags

Parmi les 32 registres du processeur, le registre R02 est réservé aux flags. Le Sc91-A intègre donc 32 bits de status pouvant être modifiés par les instructions. Tous ne sont pas utilisés pour l'instant, ce registre pourra donc être étendu par la suite.

Flag status register (R02)
31302928272625242322 21201918171615141312 11109876543210
EI Not used 0PC32C16C8O32O16O8 S32S16S8Z

... Ni de définir l'utilisation des registres

Sur les 32 registres, certains doivent être réservés à des usages spécifiques, nous venons de voir que c'était le cas pour mémoriser les flags, il existe d'autre registres dédiés :

Tous les autres registres sont d'usage générique.

Définir le jeu d'instruction

Le processeur SC91-A doit disposer du minimum d'instruction ; il doit toutefois permettre les opérations logiques et arithmétiques, les lectures/écritures en mémoire, les rotations, les sauts conditionnels et inconditionnels, les appels de sous fonctions et bien sûre ne rien faire. Ainsi sont définies les familles d'instruction de base : celles obligatoire pour le bon fonctionnement du système.

Comme il a été décidé d'utiliser des instructions codées sur 32 bits, il sera possible dans chaque instruction de préciser une destination et deux opérandes sources. Les instructions utiliseront donc 3 opérandes. Les registres seront identifiés par dd lorsqu'il s'agira de la destination, nn et mm pour les opérandes sources. Un registre utilisé comme source d'un adresse mémoire (comme pointeur) sera précédé du caractère &

Chargement des registres

Les registres pourront être initialisés par une valeur directe ou par une lecture en mémoire. Les instructions faisant 32 bits, il ne sera pas possible de changer en 1 fois la totalité d'un registre, l'instruction permettra donc le chargement de valeurs 16 bits. Cette instruction sera appelée LOADd, elle chargera une valeur v dans un registre Rdd.
Pour permettre le chargement d'un registre de 32 bits, plusieurs mode d'utilisation seront possible, ils sont identifié par le paramètre mode :

Impacte les flags : P, Z, C16, C8, S32, S16, S8, O8, O16, O32 n'a pas de sens.

En résumé :

Usage : LOADd Rdd,dir16,mode
Exemple : LOADd R31,0x1234,low
Résultat : R31 <= 0x1234

L'initialisation d'un registre par une lecture mémoire se fera par l'usage de l'instruction LOADm, celle ci charge un registre Rdd par la valeur située à l'adresse mémoire indiquée par le registre Rnn. Un paramètre mode permet d'indiquer à l'instruction si la donnée à lire fait 8, 16 ou 32 bits signé ou non; ce paramètre prendra ces valeurs suivi de u ou s selon que le chargement est signé ou non.

Impacte les flags : P, Z, C16, C8, S32, S16, S8, O8, O16, O32 n'a pas de sens.

En résumé :

Usage : LOADm Rdd,&Rnn,mode
Exemple : LOADm R31,&R30,16u
Résultat : R31 <= unsigned word ptr [R30]
                R31(b31 à b16) <= 0 et R31(b15 à b0) <= [R30](b15 à b0)

Un registre peut aussi être chargé par un autre registre au travers de l'instruction LOADr. Le Registre Rdd reçoit alors la valeur du registre Rnn. Le champ mode permet de selectionner la taille de la copie 8, 16 ou 32 bits comme précédemment.

Impacte les flags : P, Z, C16, C8, S32, S16, S8, O8, O16, O32 n'a pas de sens.

Usage : LOADr Rdd,Rnn,mode
Exemple : LOADr R31,R30,16s
Résultat : R31 <= (signed word)(R30)
                R31(b31 à b16) <= R30(b15) et R31(b15 à b0) <= R30(b15 à b0)

Ecriture en mémoire

Suite au choix d'une architecture LOAD/STORE, seule une instruction STORE permettra l'écriture de la valeur d'un registre vers une zone mémoire. Comme lors d'une lecture il est nécessaire de préciser si la données à écrire est sur 8, 16 ou 32 bits, toutefois il n'est pas utile de préciser si le nombre est signé ou non puisque la destination est de taille égale ou moindre que la source. Les modes sont donc simplement 8, 16 ou 32.

Impacte les flags : aucun.

Usage : STORE &Rmm,Rnn,mode
Exemple : STORE &R31,R30,16
Résultat : [R31] <= (word)(R30)
                [R31] <= R30(b15 à b08) et [R31+1] <= R30(b07 à b0) Big-Endian
Les opérations logiques
Simple-Cpu The Simple CPU project The Simple CPU project
Un projet de disk91
Small CPU project