E8BC : redesign des registres

En ajoutant les registres C,D, E, SP HI, SP LO, je me suis aperçu de l’augmentation exponentielle du nombre de signaux de contrôle et des instructions nécessaires pour pouvoir passer les informations d’un registre à l’autre. Il a été très simple d’augmenter le nombre de signaux de contrôle disponibles en utilisant 2 registres 32 bits (=64 signaux de contrôle) au lieu d’un seul de 32 bits (=32 signaux de contrôle).

Par contre la correspondance des instructions 8 bits avec une adresse en ROM correspondant aux signaux de contrôle entraîne des limitations. Sur 8 bits, 256 adresses sont disponibles. Les instructions allant de 3 à 7 cycles, il y a environ de la place pour une cinquantaine d’instructions, et c’est trop court !  J’ai donc dû faire un choix …

Ma première idée était de passer en architecture 16 bits, mais c’est renoncer à  l’architecture qui avait été choisie au départ. La deuxième idée, c’était de modifier le mécanisme d’interprétation des instructions en signaux de commande, en codant certaines instructions sur plusieurs bytes, mais c’est compliquer un système dont le concept de la simplicité est central.

Finalement, j’ai choisi une autre piste : les seuls registres “standards” seront :

  • A,B : pour les calculs logiques et arithmétiques;
  • H,L : pointeurs sur la RAM High/Low (registres non programmables);
  • SPH,SPL : pointeurs sur la pile (stack pointer 2 x 8bits High/Low) (registres non programmables);

Huit autres registres programmables, à utiliser pour sauvegarder les résultats intermédiaires, sont rassemblés dans un circuit “mémoire cache” adressable de 0 à 7 (R1 à R8).

De cette manière, on peut rassembler en une seule instruction tous les transferts entre un registre “standard” et un des 8 registres “caches”.
Par exemple : MOV A,REGN où N peut prendre la valeur de 1 à 8. Au niveau du codage de l’instruction on aura : code de l’instruction (8 bits – dans ce cas la valeur 0x16)/ opérande =registre concerné (8bits – avec une valeur de 1 à 8 selon le registre concerné ).

Avec une baisse de la performance : un transfert entre 2 registres “standards” s’exécutant en 3 cycles, alors qu’un transfert entre un registre “standard” et un registre “cache” s’exécute en 5 cycles. A noter qu’il n’est pas possible de transférer directement une valeur d’un registre cache à un autre registre cache, il faut passer par l’intermédiaire d’un registre standard.

C’est un compromis pour ne pas trop modifier l’architecture. La conception de microprocesseurs entraîne beaucoup de prises de décision de ce type, où l’on doit faire des choix face à des contraintes.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s