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) | |||||||||||||||||||||||||||||||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EI | Not used | 0 | P | C32 | C16 | C8 | O32 | O16 | O8 | S32 | S16 | S8 | Z |
- EI : Enable Interrupt - Autorise les interruptions.
- 0 : Value Zero - Vaut toujours 0
- P : Parity - Parité de la valeur sur 32b (=1 qd le nombre de bit à 1 est pair)
- C32 : 32bit carry - Retenue 32 bits = 33ème bit.
- C16 : 16bit carry - Retenue 16 bits = 17ème bit de la destination.
- C8 : 8bit carry - Retenue 8 bits = 9ème bit de la destination.
- O32 : 32bit overflow - Dépassement arithmétique sur 32 bits : S32 != C32.
- O16 : 16bit overflow - Dépassement arithmétique sur 16 bits : S16 != C16.
- OC8 : 8bit overflow - Dépassement arithmétique sur 8 bits : S8 != C8.
- S32 : 32bit sign - Signe 32 bits = 32ème bit.
- S16 : 16bit sign - Signe 16 bits = 16ème bit de la destination.
- S8 : 8bit sign - Signe 8 bits = 8ème bit de la destination.
- Z : Zero - Le résultat du calcul est nul.
... 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 :
- R00 : Registre PC - Mémorise l'adresse de la prochaine instruction à exécuter.
- R01 : Registre SP - Registre de sommet de pile, mémorise l'adresse où placer la prochaine valeur.
- R02 : Registre FL - Regidtre mémorisant l'état des flags.
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 :
- low - charge les 16 bits de données dans la partie basse du registre.
- high - charge les 16 bits de données dans la partie haute du regsitre.
- signed - charge les 16 bits de données dans la totalité du registre en plaçant en partie haute le signe.
- unsigned - charge les 16 bits de données dans la totalité du regitre en forçant à zero la partie haute.
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.
- 8u - charge les 8 bits de données de l'adresse indiquée dans les 32 bits du registre en mettant à 0 les 24 bits de poids forts
- 8s - charge les 8 bits de données de l'adresse indiquée dans les 32 bits du registre en mettant au signe les 24 bits de poids forts
- 16u - charge une valeur 16bits dans les poids faible et 0 dans les poids forts.
- 16s - charge une valeur 16bits dans les poids faible et copie le signe dans les poids forts.
- 32 - charge les 32 bits.
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